From 8bd7bae718318d360ac95bfeb0016d92a15bb40a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Wed, 25 Feb 2026 13:54:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(config,=20market=5Fscanner):=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4K=E7=BA=BF=E6=89=AB=E6=8F=8F=E9=99=90=E5=88=B6?= =?UTF-8?q?=E4=BB=A5=E4=BC=98=E5=8C=96=E4=BF=A1=E5=8F=B7=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在配置文件中将K线扫描限制从30根调整至50根,以支持4小时及日线周期的信号计算需求。同时,在市场扫描逻辑中增加了对K线限制的动态调整,确保在特定周期下信号处理的有效性。此改动旨在提升策略的灵活性与准确性,确保在市场波动时能够提供更可靠的交易建议。 --- trading_system/config.py | 2 +- trading_system/market_scanner.py | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/trading_system/config.py b/trading_system/config.py index 4b21e0e..f55e62c 100644 --- a/trading_system/config.py +++ b/trading_system/config.py @@ -216,7 +216,7 @@ DEFAULT_TRADING_CONFIG = { 'SCAN_INTERVAL': 900, # 扫描间隔15分钟(900秒),快速验证模式:提高扫描频率以增加交易机会 'SCAN_SYMBOL_ANALYSIS_TIMEOUT_SEC': 12, # 单个交易对「详细分析」超时(秒);已并行拉取主周期/确认周期K线,12秒通常够用;网络慢可调大(18~25) 'SCAN_KLINE_FETCH_TIMEOUT_SEC': 8, # K线拉取单独超时(秒);超时则返回降级结果(仅涨跌幅/成交量),不拖满整分析超时 - 'SCAN_KLINE_LIMIT': 30, # 扫描用 K 线根数(30 根够 RSI/ATR 计算,减少 REST 数据量加快响应) + 'SCAN_KLINE_LIMIT': 50, # 扫描用 K 线根数(主周期 4h 时 MACD 需≥35、EMA50/市场状态需≥50,否则信号恒为 0/unknown) 'SCAN_PREFER_WEBSOCKET': True, # 优先使用 WebSocket 方式:如果缓存不完整,等待 WebSocket 推送数据(最多1-1.5秒),而不是立即回退 REST API 'SCAN_LIMIT_KLINE_SUBSCRIBE': True, # 限制 K 线订阅:只在缓存完全没有数据时才订阅,避免订阅过多导致负载上升 'SCAN_PREWARM_KLINE_ENABLED': True, # 扫描前预热 K 线:批量预订阅 WS + REST 预取,提高缓存命中率、减少分析超时 diff --git a/trading_system/market_scanner.py b/trading_system/market_scanner.py index 3d4e7e0..7945bcc 100644 --- a/trading_system/market_scanner.py +++ b/trading_system/market_scanner.py @@ -368,8 +368,10 @@ class MarketScanner: cfg = cfg or dict(config.TRADING_CONFIG or {}) primary_interval = cfg.get('PRIMARY_INTERVAL', config.TRADING_CONFIG.get('PRIMARY_INTERVAL', '1h')) confirm_interval = cfg.get('CONFIRM_INTERVAL', config.TRADING_CONFIG.get('CONFIRM_INTERVAL', '4h')) - kline_limit = int(cfg.get('SCAN_KLINE_LIMIT', 30) or 30) - kline_limit = max(20, min(50, kline_limit)) + kline_limit = int(cfg.get('SCAN_KLINE_LIMIT', 50) or 50) + if primary_interval in ('4h', '1d') and kline_limit < 50: + kline_limit = 50 + kline_limit = max(20, min(100, kline_limit)) prewarm_concurrent = int(cfg.get('SCAN_PREWARM_CONCURRENT', 5) or 5) klines_timeout = float(cfg.get('SCAN_KLINE_FETCH_TIMEOUT_SEC', 8) or 8) @@ -466,8 +468,12 @@ class MarketScanner: klines_timeout = 3.0 elif klines_timeout > 20: klines_timeout = 20.0 - kline_limit = int(cfg.get('SCAN_KLINE_LIMIT', 30) or 30) - kline_limit = max(20, min(50, kline_limit)) + kline_limit = int(cfg.get('SCAN_KLINE_LIMIT', 50) or 50) + primary_int = (cfg.get('PRIMARY_INTERVAL') or config.TRADING_CONFIG.get('PRIMARY_INTERVAL') or '1h') + # 主周期 4h/1d 时 MACD 需≥35、EMA50/市场状态需≥50,否则趋势信号恒为 0、marketRegime 恒为 unknown + if primary_int in ('4h', '1d') and kline_limit < 50: + kline_limit = 50 + kline_limit = max(20, min(100, kline_limit)) # ⚠️ 优化:优先使用共享 Redis 缓存(多账号共用),然后才是 WebSocket 本地缓存 # 这样多个账号扫描相同交易对时,可以共用缓存数据,减少 REST API 调用