From 15394445b43340fad6080ee544de6c3fd355e4d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Wed, 28 Jan 2026 21:53:41 +0800 Subject: [PATCH] a --- backend/api/routes/config.py | 20 ++++++++++++++++++ backend/config_manager.py | 40 +++++++++++++++++++++++++++++------- trading_system/config.py | 6 +++--- trading_system/strategy.py | 2 +- 4 files changed, 57 insertions(+), 11 deletions(-) diff --git a/backend/api/routes/config.py b/backend/api/routes/config.py index 252af37..78a4c20 100644 --- a/backend/api/routes/config.py +++ b/backend/api/routes/config.py @@ -151,6 +151,16 @@ AUTO_TRADE_FILTER_DEFAULTS = { }, } +# 风险/策略预设(用于一键切换“稳健 / 快速验证”等模式) +PROFILE_CONFIG_DEFAULTS = { + "TRADING_PROFILE": { + "value": "conservative", + "type": "string", + "category": "strategy", + "description": "交易预设:conservative(稳健,低频+高门槛) / fast(快速验证,高频+宽松过滤)。仅作为默认值,具体参数仍可单独调整。", + }, +} + # 核心策略参数(仅管理员可见/在全局策略账号中修改) CORE_STRATEGY_CONFIG_DEFAULTS = { @@ -242,6 +252,11 @@ async def get_all_configs( if k not in result: result[k] = meta + # 交易预设(profile):用于前端一键切换“稳健 / 快速验证” + for k, meta in PROFILE_CONFIG_DEFAULTS.items(): + if k not in result: + result[k] = meta + for k, meta in RISK_KNOBS_DEFAULTS.items(): if k not in result: result[k] = meta @@ -314,6 +329,11 @@ async def get_global_configs( for k, meta in CORE_STRATEGY_CONFIG_DEFAULTS.items(): if k not in result: result[k] = meta + + # 全局交易预设(profile),用于控制一组参数的默认值 + for k, meta in PROFILE_CONFIG_DEFAULTS.items(): + if k not in result: + result[k] = meta # 固定风险百分比配置 FIXED_RISK_CONFIG_DEFAULTS = { diff --git a/backend/config_manager.py b/backend/config_manager.py index 2adec12..772c591 100644 --- a/backend/config_manager.py +++ b/backend/config_manager.py @@ -775,6 +775,18 @@ class ConfigManager: return value + # 交易预设:控制一组参数的“默认性格” + profile = str(eff_get('TRADING_PROFILE', 'conservative') or 'conservative').lower() + is_fast = profile in ('fast', 'fast_test', 'aggressive') + + max_daily_default = 30 if is_fast else 8 + scan_interval_default = 900 if is_fast else 1800 + min_signal_default = 7 if is_fast else 9 + cooldown_default = 900 if is_fast else 1800 + allow_neutral_default = True if is_fast else False + short_filter_default = False if is_fast else True + max_trend_move_default = 0.08 if is_fast else 0.05 + return { # 仓位控制 'MAX_POSITION_PERCENT': eff_get('MAX_POSITION_PERCENT', 0.08), # 单笔最大保证金占比 @@ -785,7 +797,7 @@ class ConfigManager: # 用户风险旋钮:自动交易开关/频次控制 'AUTO_TRADE_ENABLED': eff_get('AUTO_TRADE_ENABLED', True), 'MAX_OPEN_POSITIONS': eff_get('MAX_OPEN_POSITIONS', 3), - 'MAX_DAILY_ENTRIES': eff_get('MAX_DAILY_ENTRIES', 8), + 'MAX_DAILY_ENTRIES': eff_get('MAX_DAILY_ENTRIES', max_daily_default), # 涨跌幅阈值 'MIN_CHANGE_PERCENT': eff_get('MIN_CHANGE_PERCENT', 2.0), @@ -809,7 +821,7 @@ class ConfigManager: 'FIXED_RISK_PERCENT': eff_get('FIXED_RISK_PERCENT', 0.02), # 每笔单子承受的风险(2%) # 市场扫描(30分钟主周期) - 'SCAN_INTERVAL': eff_get('SCAN_INTERVAL', 1800), # 30分钟(增加交易机会) + 'SCAN_INTERVAL': eff_get('SCAN_INTERVAL', scan_interval_default), # 30分钟(增加交易机会) 'TOP_N_SYMBOLS': eff_get('TOP_N_SYMBOLS', 8), # 每次扫描后处理的交易对数量(增加到8,给更多选择余地) 'MAX_SCAN_SYMBOLS': eff_get('MAX_SCAN_SYMBOLS', 250), # 扫描的最大交易对数量(增加到250,提升覆盖率到46%) 'EXCLUDE_MAJOR_COINS': eff_get('EXCLUDE_MAJOR_COINS', True), # 是否排除主流币(BTC、ETH、BNB等),专注于山寨币 @@ -823,7 +835,7 @@ class ConfigManager: 'MIN_VOLATILITY': eff_get('MIN_VOLATILITY', 0.02), # 高胜率策略参数 - 'MIN_SIGNAL_STRENGTH': eff_get('MIN_SIGNAL_STRENGTH', 7), # 默认7(2026-01-27优化:提高门槛,减少垃圾信号,提升胜率) + 'MIN_SIGNAL_STRENGTH': eff_get('MIN_SIGNAL_STRENGTH', min_signal_default), # 默认值随 profile 调整 'LEVERAGE': eff_get('LEVERAGE', 10), 'USE_DYNAMIC_LEVERAGE': eff_get('USE_DYNAMIC_LEVERAGE', True), 'MAX_LEVERAGE': eff_get('MAX_LEVERAGE', 15), # 降低到15,更保守,配合更大的保证金 @@ -839,24 +851,38 @@ class ConfigManager: # 说明:这两个 key 需要出现在 TRADING_CONFIG 中,否则 trading_system 在每次 reload_from_redis 后会丢失它们, # 导致始终按默认值拦截自动交易(用户在配置页怎么开都没用)。 'AUTO_TRADE_ONLY_TRENDING': eff_get('AUTO_TRADE_ONLY_TRENDING', True), - 'AUTO_TRADE_ALLOW_4H_NEUTRAL': eff_get('AUTO_TRADE_ALLOW_4H_NEUTRAL', False), + 'AUTO_TRADE_ALLOW_4H_NEUTRAL': eff_get('AUTO_TRADE_ALLOW_4H_NEUTRAL', allow_neutral_default), # 智能入场/限价偏移(部分逻辑会直接读取 TRADING_CONFIG) 'LIMIT_ORDER_OFFSET_PCT': eff_get('LIMIT_ORDER_OFFSET_PCT', 0.5), 'SMART_ENTRY_ENABLED': eff_get('SMART_ENTRY_ENABLED', False), - 'SMART_ENTRY_STRONG_SIGNAL': eff_get('SMART_ENTRY_STRONG_SIGNAL', 8), - 'ENTRY_SYMBOL_COOLDOWN_SEC': eff_get('ENTRY_SYMBOL_COOLDOWN_SEC', 120), + 'SMART_ENTRY_STRONG_SIGNAL': eff_get('SMART_ENTRY_STRONG_SIGNAL', min_signal_default), + 'ENTRY_SYMBOL_COOLDOWN_SEC': eff_get('ENTRY_SYMBOL_COOLDOWN_SEC', cooldown_default), 'ENTRY_TIMEOUT_SEC': eff_get('ENTRY_TIMEOUT_SEC', 180), 'ENTRY_STEP_WAIT_SEC': eff_get('ENTRY_STEP_WAIT_SEC', 15), 'ENTRY_CHASE_MAX_STEPS': eff_get('ENTRY_CHASE_MAX_STEPS', 4), 'ENTRY_MARKET_FALLBACK_AFTER_SEC': eff_get('ENTRY_MARKET_FALLBACK_AFTER_SEC', 45), 'ENTRY_CONFIRM_TIMEOUT_SEC': eff_get('ENTRY_CONFIRM_TIMEOUT_SEC', 30), - 'ENTRY_MAX_DRIFT_PCT_TRENDING': eff_get('ENTRY_MAX_DRIFT_PCT_TRENDING', 0.6), + 'ENTRY_MAX_DRIFT_PCT_TRENDING': eff_get('ENTRY_MAX_DRIFT_PCT_TRENDING', 0.006), 'ENTRY_MAX_DRIFT_PCT_RANGING': eff_get('ENTRY_MAX_DRIFT_PCT_RANGING', 0.3), # 动态过滤优化 'BETA_FILTER_ENABLED': eff_get('BETA_FILTER_ENABLED', True), # 大盘共振过滤:BTC/ETH下跌时屏蔽多单 'BETA_FILTER_THRESHOLD': eff_get('BETA_FILTER_THRESHOLD', -0.005), # -0.5%(2026-01-27优化:更敏感地过滤大盘风险,15分钟内跌幅超过0.5%即屏蔽多单) + + # 趋势尾部入场过滤 & 15m 短周期方向过滤开关(由 profile 控制默认值) + 'ENTRY_SHORT_INTERVAL': eff_get('ENTRY_SHORT_INTERVAL', '15m'), + 'ENTRY_SHORT_TREND_FILTER_ENABLED': eff_get('ENTRY_SHORT_TREND_FILTER_ENABLED', short_filter_default), + 'ENTRY_SHORT_TREND_MIN_PCT': eff_get('ENTRY_SHORT_TREND_MIN_PCT', 0.003), + 'ENTRY_SHORT_CONFIRM_CANDLES': eff_get('ENTRY_SHORT_CONFIRM_CANDLES', 3), + 'USE_TREND_ENTRY_FILTER': eff_get('USE_TREND_ENTRY_FILTER', True), + 'MAX_TREND_MOVE_BEFORE_ENTRY': eff_get('MAX_TREND_MOVE_BEFORE_ENTRY', max_trend_move_default), + 'TREND_STATE_TTL_SEC': eff_get('TREND_STATE_TTL_SEC', 3600), + 'RECO_USE_TREND_ENTRY_FILTER': eff_get('RECO_USE_TREND_ENTRY_FILTER', True), + 'RECO_MAX_TREND_MOVE_BEFORE_ENTRY': eff_get('RECO_MAX_TREND_MOVE_BEFORE_ENTRY', 0.04), + + # 当前交易预设(让 trading_system 能知道是哪种模式) + 'TRADING_PROFILE': profile, } diff --git a/trading_system/config.py b/trading_system/config.py index 9f22ebc..1218a14 100644 --- a/trading_system/config.py +++ b/trading_system/config.py @@ -222,7 +222,7 @@ def _get_trading_config(): # 入场短周期(用于快速方向确认,例如15m),不要太小以免噪音太大 'ENTRY_SHORT_INTERVAL': '15m', # 是否开启“短周期方向过滤”,避免在15m明显上涨时做空、明显下跌时做多(快速验证模式:关闭以增加交易机会) - 'ENTRY_SHORT_TREND_FILTER_ENABLED': False, + 'ENTRY_SHORT_TREND_FILTER_ENABLED': True, # 短周期方向过滤使用的最小趋势幅度(例如0.003=0.3%),变化太小视为震荡不过滤 'ENTRY_SHORT_TREND_MIN_PCT': 0.003, # 检查最近多少根短周期K线来评估方向(例如3根15m约等于45分钟) @@ -259,7 +259,7 @@ def _get_trading_config(): # 是否仅在 marketRegime=trending 时才自动交易;否则只生成推荐 'AUTO_TRADE_ONLY_TRENDING': True, # 是否允许 4H 趋势为 neutral 时自动交易;快速验证模式:允许中性趋势以增加交易机会 - 'AUTO_TRADE_ALLOW_4H_NEUTRAL': True, + 'AUTO_TRADE_ALLOW_4H_NEUTRAL': False, # ===== 趋势入场过滤(防止追在半山腰)===== # 是否启用基于趋势状态的入场过滤: @@ -268,7 +268,7 @@ def _get_trading_config(): 'USE_TREND_ENTRY_FILTER': True, # 在信号方向上允许的最大累计趋势幅度(相对于信号价),超过则认为“时机太晚”,不再入场 # 例如:0.08 表示价格沿趋势方向已经走了 8% 以上还没上车,则跳过本轮机会(快速验证模式:放宽阈值以增加交易机会) - 'MAX_TREND_MOVE_BEFORE_ENTRY': 0.08, + 'MAX_TREND_MOVE_BEFORE_ENTRY': 0.05, # 趋势状态缓存的 TTL(秒),用于控制一轮趋势的“有效期” 'TREND_STATE_TTL_SEC': 3600, diff --git a/trading_system/strategy.py b/trading_system/strategy.py index c1c1d13..3337d20 100644 --- a/trading_system/strategy.py +++ b/trading_system/strategy.py @@ -498,7 +498,7 @@ class TradingStrategy: reasons.append("❌ 4H趋势中性(为提升胜率:仅生成推荐,不自动交易)") should_trade = False - # 如果信号方向与4H趋势相反,直接拒绝交易 + # 如果信号方向与4H趋势相反,直接拒绝交易(所有模式) if direction and trend_4h: if (direction == 'BUY' and trend_4h == 'down') or (direction == 'SELL' and trend_4h == 'up'): should_trade = False