From 68f028f0fce4b00d5db696f145642d38c2cb72d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Thu, 12 Feb 2026 14:03:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=BF=80=E8=BF=9B=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=8F=AF=E6=94=BE=E5=A4=A7=E4=BB=93=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/config_manager.py | 4 ++- backend/sync_global_config_defaults.py | 2 ++ frontend/src/components/GlobalConfig.jsx | 35 ++++++++++++++++++++++-- trading_system/risk_manager.py | 21 +++++++++++++- 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/backend/config_manager.py b/backend/config_manager.py index 0024190..6943157 100644 --- a/backend/config_manager.py +++ b/backend/config_manager.py @@ -834,7 +834,9 @@ class ConfigManager: # 固定风险百分比仓位计算(凯利公式) 'USE_FIXED_RISK_SIZING': eff_get('USE_FIXED_RISK_SIZING', True), # 使用固定风险百分比计算仓位 'FIXED_RISK_PERCENT': eff_get('FIXED_RISK_PERCENT', 0.02), # 每笔单子承受的风险(2%) - + # 仓位放大系数:1.0=正常,1.2=+20% 仓位,上限 2.0,仍受 MAX_POSITION_PERCENT 约束(盈利时适度放大用) + 'POSITION_SCALE_FACTOR': eff_get('POSITION_SCALE_FACTOR', 1.0), + # 市场扫描(30分钟主周期) 'SCAN_INTERVAL': eff_get('SCAN_INTERVAL', scan_interval_default), # 30分钟(增加交易机会) 'TOP_N_SYMBOLS': eff_get('TOP_N_SYMBOLS', 20), # 每次扫描后优先处理的交易对数量 diff --git a/backend/sync_global_config_defaults.py b/backend/sync_global_config_defaults.py index 6d004ba..5a55f6b 100644 --- a/backend/sync_global_config_defaults.py +++ b/backend/sync_global_config_defaults.py @@ -40,6 +40,8 @@ DEFAULTS_TO_SYNC = [ "description": "大盘共振过滤:BTC/ETH 下跌时屏蔽多单。"}, {"config_key": "BETA_FILTER_THRESHOLD", "config_value": "-0.005", "config_type": "number", "category": "strategy", "description": "大盘共振阈值(比例,如 -0.005 表示 -0.5%)。"}, + {"config_key": "POSITION_SCALE_FACTOR", "config_value": "1.0", "config_type": "number", "category": "risk", + "description": "仓位放大系数:1.0=正常,1.2=+20%,上限2.0。盈利时适度调高可扩大收益。"}, ] diff --git a/frontend/src/components/GlobalConfig.jsx b/frontend/src/components/GlobalConfig.jsx index 815e283..0d939cd 100644 --- a/frontend/src/components/GlobalConfig.jsx +++ b/frontend/src/components/GlobalConfig.jsx @@ -14,6 +14,7 @@ import './ConfigPanel.css' // 复用 ConfigPanel 的样式 'MAX_CHANGE_PERCENT_FOR_LONG', 'MAX_CHANGE_PERCENT_FOR_SHORT', 'MIN_RR_FOR_TP1', + 'POSITION_SCALE_FACTOR', ]) // 配置项中文标签(便于识别) const KEY_LABELS = { @@ -30,6 +31,7 @@ const KEY_LABELS = { RSI_EXTREME_REVERSE_ONLY_NEUTRAL_4H: 'RSI 反向仅允许 4H 中性', MIN_RR_FOR_TP1: '第一目标最小盈亏比(相对止损)', AUTO_TRADE_ALLOW_4H_NEUTRAL: '允许 4H 中性时自动交易', + POSITION_SCALE_FACTOR: '仓位放大系数', } const ConfigItem = ({ label, config, onUpdate, disabled }) => { @@ -414,6 +416,31 @@ const GlobalConfig = () => { MAX_TREND_MOVE_BEFORE_ENTRY: 0.05, }, }, + profit_scale: { + name: '盈利放大(适度激进)', + desc: '在推荐策略基础上:仓位放大 1.25 倍、单笔上限 10%、每笔风险 2.5%、最多 5 仓。盈利阶段可一键放大收益,仍受单笔上限约束。', + configs: { + POSITION_SCALE_FACTOR: 1.25, + MAX_POSITION_PERCENT: 0.10, + MAX_TOTAL_POSITION_PERCENT: 0.45, + FIXED_RISK_PERCENT: 0.025, + MAX_OPEN_POSITIONS: 5, + MAX_DAILY_ENTRIES: 10, + ATR_STOP_LOSS_MULTIPLIER: 3.0, + RISK_REWARD_RATIO: 3.0, + TAKE_PROFIT_1_PERCENT: 0.2, + TAKE_PROFIT_PERCENT: 0.30, + MIN_RR_FOR_TP1: 1.5, + AUTO_TRADE_ALLOW_4H_NEUTRAL: false, + MAX_RSI_FOR_LONG: 65, + MIN_RSI_FOR_SHORT: 30, + SYMBOL_LOSS_COOLDOWN_ENABLED: true, + SYMBOL_MAX_CONSECUTIVE_LOSSES: 2, + SYMBOL_LOSS_COOLDOWN_SEC: 3600, + BETA_FILTER_ENABLED: true, + MIN_SIGNAL_STRENGTH: 8, + }, + }, aggressive: { name: '激进高频', desc: '晚间波动大时使用,交易频率高,止损较紧但止盈合理(盈亏比1.5:1)', @@ -468,6 +495,7 @@ const GlobalConfig = () => { SYMBOL_MAX_CONSECUTIVE_LOSSES: { value: 2, type: 'number', category: 'strategy', description: '最大允许连续亏损次数(超过则禁止交易该交易对一段时间)。' }, SYMBOL_LOSS_COOLDOWN_SEC: { value: 3600, type: 'number', category: 'strategy', description: '连续亏损后的冷却时间(秒),默认1小时。' }, MIN_RR_FOR_TP1: { value: 1.5, type: 'number', category: 'strategy', description: '第一目标止盈相对止损的最小盈亏比(如 1.5 表示 TP1 至少为止损距离的 1.5 倍)。2026-02-12 新增。' }, + POSITION_SCALE_FACTOR: { value: 1.0, type: 'number', category: 'risk', description: '仓位放大系数:1.0=正常,1.2=+20% 仓位,1.5=+50%,上限 2.0。盈利时适度调高可扩大收益,仍受单笔上限约束。' }, AUTO_TRADE_ALLOW_4H_NEUTRAL: { value: false, type: 'boolean', category: 'strategy', description: '是否允许 4H 趋势为中性时自动交易。关闭可减少震荡扫损、提升质量(建议关闭)。' }, BETA_FILTER_ENABLED: { value: true, type: 'boolean', category: 'strategy', description: '大盘共振过滤:BTC/ETH 下跌时屏蔽多单。' }, BETA_FILTER_THRESHOLD: { value: -0.005, type: 'number', category: 'strategy', description: '大盘共振阈值(比例,如 -0.005 表示 -0.5%)。' }, @@ -980,18 +1008,19 @@ const GlobalConfig = () => { const presetUiMeta = { altcoin: { group: 'altcoin', tag: '当前推荐' }, + profit_scale: { group: 'altcoin', tag: '盈利放大' }, swing: { group: 'backup', tag: '纯限价' }, strict: { group: 'backup', tag: '精选低频' }, conservative: { group: 'backup', tag: '保守' }, } - // 快速方案只保留:当前推荐(山寨币)+ 备选(纯限价/保守),其余不展示 + // 快速方案:当前推荐(含盈利放大)+ 备选 const presetGroups = [ { key: 'altcoin', title: '当前推荐 · 山寨币策略', - desc: '与当前策略一致:4H 中性不自动交易、做多 RSI≤65、第一目标止盈 20%、止损 3×ATR、盈亏比 3:1、同品种连亏冷却。', - presetKeys: ['altcoin'], + desc: '与当前策略一致。盈利阶段想扩大收益可点「盈利放大」:仓位 1.25 倍、单笔上限 10%、最多 5 仓。', + presetKeys: ['altcoin', 'profit_scale'], }, { key: 'backup', diff --git a/trading_system/risk_manager.py b/trading_system/risk_manager.py index 505cc0d..0ac7e38 100644 --- a/trading_system/risk_manager.py +++ b/trading_system/risk_manager.py @@ -651,7 +651,26 @@ class RiskManager: # 计算最终的名义价值与保证金 final_notional_value = quantity * current_price final_margin = final_notional_value / actual_leverage if actual_leverage > 0 else final_notional_value - + + # 仓位放大系数(盈利时适当放大仓位,1.0=正常,1.2=+20%,上限2.0,仍受 MAX_POSITION_PERCENT 约束) + position_scale = config.TRADING_CONFIG.get('POSITION_SCALE_FACTOR', 1.0) + try: + position_scale = float(position_scale or 1.0) + position_scale = max(1.0, min(position_scale, 2.0)) + except (TypeError, ValueError): + position_scale = 1.0 + if position_scale > 1.0: + quantity = quantity * position_scale + final_notional_value = quantity * current_price + final_margin = final_notional_value / actual_leverage if actual_leverage > 0 else final_notional_value + max_margin_cap = available_balance * config.TRADING_CONFIG.get('MAX_POSITION_PERCENT', 0.08) + if final_margin > max_margin_cap: + final_margin = max_margin_cap + final_notional_value = final_margin * actual_leverage + quantity = final_notional_value / current_price if current_price and current_price > 0 else quantity + logger.info(f" 仓位放大后超过单笔上限,已截断至 MAX_POSITION_PERCENT 对应保证金") + logger.info(f" 仓位放大系数: {position_scale:.2f} -> 最终数量: {quantity:.4f}") + # 添加最小名义价值检查(0.2 USDT),避免下无意义的小单子 MIN_NOTIONAL_VALUE = 0.2 # 最小名义价值0.2 USDT if final_notional_value < MIN_NOTIONAL_VALUE: