diff --git a/backend/api/routes/config.py b/backend/api/routes/config.py index 339f35c..b8f1072 100644 --- a/backend/api/routes/config.py +++ b/backend/api/routes/config.py @@ -742,6 +742,43 @@ async def get_global_configs( "category": "strategy", "description": "滞涨触发后对剩余仓位抬升止损时,至少要锁住的利润百分比(与“最高浮盈的一半”取较大者)。", }, + # ===== 回撤/区间入场(近 N 根 K 线前低前高,避免买在区间顶部)===== + "ENTRY_PULLBACK_FILTER_ENABLED": { + "value": False, + "type": "boolean", + "category": "strategy", + "description": "是否启用回撤区间入场过滤:多单不贴在近 N 根 K 线区间上沿、空单不贴下沿,减少「追高/追空后一回撤就扫损」。与 USE_TREND_ENTRY_FILTER(相对信号价)互补。", + }, + "ENTRY_PULLBACK_INTERVAL": { + "value": "", + "type": "string", + "category": "strategy", + "description": "回撤过滤使用的 K 线周期。留空则使用 ENTRY_INTERVAL(通常 1h);可填 15m、4h 等。", + }, + "ENTRY_PULLBACK_LOOKBACK_BARS": { + "value": 24, + "type": "number", + "category": "strategy", + "description": "统计区间高低点所用的 K 线根数(需 ≥ MIN_BARS)。", + }, + "ENTRY_PULLBACK_MIN_BARS": { + "value": 5, + "type": "number", + "category": "strategy", + "description": "至少多少根有效 K 线才应用回撤过滤;不足则跳过本过滤。", + }, + "ENTRY_PULLBACK_MAX_LONG_IN_RANGE": { + "value": 0.62, + "type": "number", + "category": "strategy", + "description": "做多:现价在区间 [低,高] 的相对位置 pos∈[0,1],pos 超过此值则不开仓(默认约拒绝最上 38% 区域)。越小越严。", + }, + "ENTRY_PULLBACK_MIN_SHORT_IN_RANGE": { + "value": 0.38, + "type": "number", + "category": "strategy", + "description": "做空:相对位置 pos 低于此值则不开仓(默认约拒绝最下 38% 区域)。越大越严。", + }, } for k, meta in ADDITIONAL_STRATEGY_DEFAULTS.items(): if k not in result: diff --git a/backend/sync_global_config_defaults.py b/backend/sync_global_config_defaults.py index 2f5ace7..90095af 100644 --- a/backend/sync_global_config_defaults.py +++ b/backend/sync_global_config_defaults.py @@ -66,6 +66,19 @@ DEFAULTS_TO_SYNC = [ "description": "4H 趋势上涨时禁止开空。默认 true,避免逆势做空导致止损。"}, {"config_key": "AUTO_MARKET_SCHEME_ENABLED", "config_value": "false", "config_type": "boolean", "category": "strategy", "description": "开启后,crontab 定时运行 scripts/update_market_scheme.py --apply 时自动更新 MARKET_SCHEME(根据 BTC 行情识别牛/熊/正常)。"}, + # 回撤区间入场(2026-03) + {"config_key": "ENTRY_PULLBACK_FILTER_ENABLED", "config_value": "false", "config_type": "boolean", "category": "strategy", + "description": "是否启用回撤区间入场过滤(近N根K线前低前高,避免买在区间顶部)。"}, + {"config_key": "ENTRY_PULLBACK_INTERVAL", "config_value": "", "config_type": "string", "category": "strategy", + "description": "留空则使用 ENTRY_INTERVAL;可填 15m、1h 等。"}, + {"config_key": "ENTRY_PULLBACK_LOOKBACK_BARS", "config_value": "24", "config_type": "number", "category": "strategy", + "description": "统计区间用的K线根数。"}, + {"config_key": "ENTRY_PULLBACK_MIN_BARS", "config_value": "5", "config_type": "number", "category": "strategy", + "description": "至少几根K才启用回撤过滤。"}, + {"config_key": "ENTRY_PULLBACK_MAX_LONG_IN_RANGE", "config_value": "0.62", "config_type": "number", "category": "strategy", + "description": "做多:区间相对位置上限制0~1,默认0.62。"}, + {"config_key": "ENTRY_PULLBACK_MIN_SHORT_IN_RANGE", "config_value": "0.38", "config_type": "number", "category": "strategy", + "description": "做空:区间相对位置下限制0~1,默认0.38。"}, ] diff --git a/frontend/src/components/GlobalConfig.jsx b/frontend/src/components/GlobalConfig.jsx index dd44ffa..911b8e0 100644 --- a/frontend/src/components/GlobalConfig.jsx +++ b/frontend/src/components/GlobalConfig.jsx @@ -69,6 +69,12 @@ const KEY_LABELS = { STAGNATION_NO_NEW_HIGH_HOURS: '滞涨判定未创新高时长(小时)', STAGNATION_PARTIAL_CLOSE_PCT: '滞涨触发时先平仓位比例', STAGNATION_LOCK_PCT: '滞涨后抬止损至少锁利(%)', + ENTRY_PULLBACK_FILTER_ENABLED: '回撤区间入场过滤', + ENTRY_PULLBACK_INTERVAL: '回撤过滤K线周期(空=跟ENTRY)', + ENTRY_PULLBACK_LOOKBACK_BARS: '回撤统计K线根数', + ENTRY_PULLBACK_MIN_BARS: '回撤过滤最少K线数', + ENTRY_PULLBACK_MAX_LONG_IN_RANGE: '做多区间位置上限(0~1)', + ENTRY_PULLBACK_MIN_SHORT_IN_RANGE: '做空区间位置下限(0~1)', } // 配置项详细说明(用于导出的策略配置分析,含建议与参数说明) @@ -157,6 +163,12 @@ const CONFIG_GUIDE_DETAILS = { STAGNATION_NO_NEW_HIGH_HOURS: '从最近一次创历史新高开始计时,如果连续这么多小时都没有再创新高(价格高点停滞),则视为“滞涨”,会触发滞涨早止盈逻辑。建议 2-4 小时区间,根据周期调整。', STAGNATION_PARTIAL_CLOSE_PCT: '滞涨触发后,首先立即平掉的仓位比例,用于锁定一部分利润、降低回撤风险。例如 0.5 表示先平掉 50% 仓位,剩余 50% 继续观察。', STAGNATION_LOCK_PCT: '滞涨触发后,对剩余仓位抬升止损时,至少要锁住的利润百分比(基于保证金)。实际使用时会与“历史最高浮盈的一半”取较大值,用于在强势趋势中多保留利润空间,在一般情况下则锁定一个稳定的收益区间。', + ENTRY_PULLBACK_FILTER_ENABLED: '开启后:开仓前用近 N 根 K 线的最低价/最高价构成区间,若做多时现价已贴在区间上沿(相对位置过高)则跳过,避免追高后一回撤就损;做空对称。与「趋势信号价追价上限」(USE_TREND_ENTRY_FILTER) 互补。', + ENTRY_PULLBACK_INTERVAL: '计算区间所用的 K 线周期。留空则跟随 ENTRY_INTERVAL(一般为 1h)。想更敏感可填 15m。', + ENTRY_PULLBACK_LOOKBACK_BARS: '参与统计的 K 线根数,默认 24。越大区间越宽、过滤越钝;越小越敏感。', + ENTRY_PULLBACK_MIN_BARS: '至少几根 K 才启用本过滤,不足则跳过(避免数据过少误判)。', + ENTRY_PULLBACK_MAX_LONG_IN_RANGE: '做多允许的最高相对位置 pos(0=区间底,1=区间顶)。默认 0.62 表示超过则视为贴近前高/上沿,不开多。想更严可改为 0.55~0.58。', + ENTRY_PULLBACK_MIN_SHORT_IN_RANGE: '做空允许的最低相对位置。默认 0.38,低于则视为贴近前低/下沿,不开空。想更严可改为 0.42~0.45。', } const ConfigItem = ({ label, config, onUpdate, disabled }) => { @@ -666,6 +678,12 @@ const GlobalConfig = () => { LOCK_PROFIT_STAGE1_PCT: { value: 0.02, type: 'number', category: 'strategy', description: '分层锁盈第一层锁利比例(如 0.02=2%)。' }, LOCK_PROFIT_STAGE2_TRIGGER_PCT: { value: 0.15, type: 'number', category: 'strategy', description: '分层锁盈第二层触发阈值(如 0.15=15%)。' }, LOCK_PROFIT_STAGE2_PCT: { value: 0.05, type: 'number', category: 'strategy', description: '分层锁盈第二层锁利比例(如 0.05=5%)。' }, + ENTRY_PULLBACK_FILTER_ENABLED: { value: false, type: 'boolean', category: 'strategy', description: '回撤区间入场过滤:避免买在K线区间上沿、卖在下沿。' }, + ENTRY_PULLBACK_INTERVAL: { value: '', type: 'string', category: 'strategy', description: '留空=使用 ENTRY_INTERVAL;可填 15m、1h、4h。' }, + ENTRY_PULLBACK_LOOKBACK_BARS: { value: 24, type: 'number', category: 'strategy', description: '统计区间用的 K 线根数。' }, + ENTRY_PULLBACK_MIN_BARS: { value: 5, type: 'number', category: 'strategy', description: '至少几根 K 才启用回撤过滤。' }, + ENTRY_PULLBACK_MAX_LONG_IN_RANGE: { value: 0.62, type: 'number', category: 'strategy', description: '做多:区间相对位置上限制(0~1),默认 0.62。' }, + ENTRY_PULLBACK_MIN_SHORT_IN_RANGE: { value: 0.38, type: 'number', category: 'strategy', description: '做空:区间相对位置下限制(0~1),默认 0.38。' }, } const loadConfigs = async () => {