diff --git a/backend/api/routes/config.py b/backend/api/routes/config.py index 9fea898..7174932 100644 --- a/backend/api/routes/config.py +++ b/backend/api/routes/config.py @@ -82,6 +82,22 @@ SMART_ENTRY_CONFIG_DEFAULTS = { }, } +# 自动交易过滤项:用于“提升胜率/控频”,避免震荡行情来回扫损导致胜率极低 +AUTO_TRADE_FILTER_DEFAULTS = { + "AUTO_TRADE_ONLY_TRENDING": { + "value": True, + "type": "boolean", + "category": "strategy", + "description": "自动交易仅在市场状态=trending时执行(ranging/unknown只生成推荐,不自动下单)。用于显著降低震荡扫损与交易次数。", + }, + "AUTO_TRADE_ALLOW_4H_NEUTRAL": { + "value": False, + "type": "boolean", + "category": "strategy", + "description": "是否允许4H趋势=neutral时自动交易。默认关闭(中性趋势最容易被扫损);若你希望更积极可开启。", + }, +} + @router.get("") @router.get("/") @@ -105,6 +121,10 @@ async def get_all_configs(): for k, meta in SMART_ENTRY_CONFIG_DEFAULTS.items(): if k not in result: result[k] = meta + + for k, meta in AUTO_TRADE_FILTER_DEFAULTS.items(): + if k not in result: + result[k] = meta return result except Exception as e: raise HTTPException(status_code=500, detail=str(e)) diff --git a/trading_system/config.py b/trading_system/config.py index 5b89f6c..5817f7a 100644 --- a/trading_system/config.py +++ b/trading_system/config.py @@ -208,6 +208,12 @@ def _get_trading_config(): 'TRAILING_STOP_PROTECT': 0.05, # 保护利润提高到5%(保护5%利润,更合理) 'POSITION_SYNC_INTERVAL': 60, # 持仓状态同步间隔(秒),缩短到1分钟,确保状态及时同步 + # ===== 自动交易过滤(用于提升胜率/控频)===== + # 是否仅在 marketRegime=trending 时才自动交易;否则只生成推荐 + 'AUTO_TRADE_ONLY_TRENDING': True, + # 是否允许 4H 趋势为 neutral 时自动交易;默认不允许(震荡最易扫损) + 'AUTO_TRADE_ALLOW_4H_NEUTRAL': False, + # ===== 智能入场(方案C)===== # 根治方案:默认关闭。关闭后回归“纯限价单模式”(不追价/不市价兜底/未成交撤单跳过) 'SMART_ENTRY_ENABLED': False, @@ -250,6 +256,10 @@ defaults = { 'ENTRY_CONFIRM_TIMEOUT_SEC': 30, 'ENTRY_MAX_DRIFT_PCT_TRENDING': 0.6, 'ENTRY_MAX_DRIFT_PCT_RANGING': 0.3, + + # 自动交易过滤默认值 + 'AUTO_TRADE_ONLY_TRENDING': True, + 'AUTO_TRADE_ALLOW_4H_NEUTRAL': False, } for key, value in defaults.items(): if key not in TRADING_CONFIG: diff --git a/trading_system/strategy.py b/trading_system/strategy.py index 2e9ccfe..e71f58e 100644 --- a/trading_system/strategy.py +++ b/trading_system/strategy.py @@ -139,9 +139,9 @@ class TradingStrategy: except Exception as e: logger.warning(f"自动生成推荐失败 {symbol}: {e}") - # 提升胜率:震荡/未知市场状态不做自动交易(只保留推荐/观察) - # 你当前统计里“止损远多于止盈 + 平均持仓很短”高度符合震荡来回扫损特征。 - if market_regime != 'trending': + # 提升胜率:可配置的“仅 trending 自动交易”过滤 + only_trending = bool(config.TRADING_CONFIG.get("AUTO_TRADE_ONLY_TRENDING", True)) + if only_trending and market_regime != 'trending': logger.info(f"{symbol} 市场状态={market_regime},跳过自动交易(仅生成推荐)") continue @@ -417,11 +417,17 @@ class TradingStrategy: # 判断是否应该交易(信号强度 >= 7 才交易,提高胜率) min_signal_strength = config.TRADING_CONFIG.get('MIN_SIGNAL_STRENGTH', 7) + # 强度上限归一到 0-10,避免出现 12/10 这种误导显示 + try: + signal_strength = max(0, min(int(signal_strength), 10)) + except Exception: + pass should_trade = signal_strength >= min_signal_strength and direction is not None # 提升胜率:4H趋势中性时不做自动交易(只保留推荐/观察) # 经验上,中性趋势下“趋势跟踪”信号更容易被来回扫损,导致胜率显著降低与交易次数激增。 - if trend_4h == 'neutral': + allow_neutral = bool(config.TRADING_CONFIG.get("AUTO_TRADE_ALLOW_4H_NEUTRAL", False)) + if (trend_4h == 'neutral') and (not allow_neutral): if should_trade: reasons.append("❌ 4H趋势中性(为提升胜率:仅生成推荐,不自动交易)") should_trade = False @@ -432,7 +438,8 @@ class TradingStrategy: should_trade = False reasons.append("❌ 禁止逆4H趋势交易") - if not should_trade and direction: + # 只在“真的强度不足”时追加该原因;避免出现“强度>=阈值但被其它过滤挡住”仍提示强度不足 + if direction and (signal_strength < min_signal_strength): reasons.append(f"信号强度不足({signal_strength}/10,需要≥{min_signal_strength})") return {