From fad6950964a040b1bc5f1bc55d1324a37f1b1595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Mon, 19 Jan 2026 23:25:12 +0800 Subject: [PATCH] a --- backend/api/routes/config.py | 2 +- backend/config_manager.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/backend/api/routes/config.py b/backend/api/routes/config.py index 7174932..416ac53 100644 --- a/backend/api/routes/config.py +++ b/backend/api/routes/config.py @@ -452,7 +452,7 @@ async def update_config(key: str, item: ConfigUpdate): description = item.description or existing['description'] else: # 允许创建新配置(用于新功能首次上线,DB 里还没有 key 的情况) - meta = SMART_ENTRY_CONFIG_DEFAULTS.get(key) + meta = SMART_ENTRY_CONFIG_DEFAULTS.get(key) or AUTO_TRADE_FILTER_DEFAULTS.get(key) config_type = item.type or (meta.get("type") if meta else "string") category = item.category or (meta.get("category") if meta else "strategy") description = item.description or (meta.get("description") if meta else f"{key}配置") diff --git a/backend/config_manager.py b/backend/config_manager.py index 828311c..5defc0d 100644 --- a/backend/config_manager.py +++ b/backend/config_manager.py @@ -452,6 +452,25 @@ class ConfigManager: 'USE_TRAILING_STOP': self.get('USE_TRAILING_STOP', True), 'TRAILING_STOP_ACTIVATION': self.get('TRAILING_STOP_ACTIVATION', 0.10), # 默认10%(给趋势更多空间) 'TRAILING_STOP_PROTECT': self.get('TRAILING_STOP_PROTECT', 0.05), # 默认5%(保护更多利润) + + # 自动交易过滤(用于提升胜率/控频) + # 说明:这两个 key 需要出现在 TRADING_CONFIG 中,否则 trading_system 在每次 reload_from_redis 后会丢失它们, + # 导致始终按默认值拦截自动交易(用户在配置页怎么开都没用)。 + 'AUTO_TRADE_ONLY_TRENDING': self.get('AUTO_TRADE_ONLY_TRENDING', True), + 'AUTO_TRADE_ALLOW_4H_NEUTRAL': self.get('AUTO_TRADE_ALLOW_4H_NEUTRAL', False), + + # 智能入场/限价偏移(部分逻辑会直接读取 TRADING_CONFIG) + 'LIMIT_ORDER_OFFSET_PCT': self.get('LIMIT_ORDER_OFFSET_PCT', 0.5), + 'SMART_ENTRY_ENABLED': self.get('SMART_ENTRY_ENABLED', False), + 'SMART_ENTRY_STRONG_SIGNAL': self.get('SMART_ENTRY_STRONG_SIGNAL', 8), + 'ENTRY_SYMBOL_COOLDOWN_SEC': self.get('ENTRY_SYMBOL_COOLDOWN_SEC', 120), + 'ENTRY_TIMEOUT_SEC': self.get('ENTRY_TIMEOUT_SEC', 180), + 'ENTRY_STEP_WAIT_SEC': self.get('ENTRY_STEP_WAIT_SEC', 15), + 'ENTRY_CHASE_MAX_STEPS': self.get('ENTRY_CHASE_MAX_STEPS', 4), + 'ENTRY_MARKET_FALLBACK_AFTER_SEC': self.get('ENTRY_MARKET_FALLBACK_AFTER_SEC', 45), + 'ENTRY_CONFIRM_TIMEOUT_SEC': self.get('ENTRY_CONFIRM_TIMEOUT_SEC', 30), + 'ENTRY_MAX_DRIFT_PCT_TRENDING': self.get('ENTRY_MAX_DRIFT_PCT_TRENDING', 0.6), + 'ENTRY_MAX_DRIFT_PCT_RANGING': self.get('ENTRY_MAX_DRIFT_PCT_RANGING', 0.3), }