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 调用