diff --git a/trading_system/config.py b/trading_system/config.py index bdbb20e..74ee3d2 100644 --- a/trading_system/config.py +++ b/trading_system/config.py @@ -194,24 +194,25 @@ def _get_trading_config(): 'MAX_OPEN_POSITIONS': 4, # 同时持仓数量上限(总仓位12% / 单笔1.5% = 最多4个) 'MAX_DAILY_ENTRIES': 15, # 每日最多15笔(快速验证模式:提高上限以快速验证策略) - 'MAX_POSITION_PERCENT': 0.015, # 单笔仓位1.5%(山寨币风险高,不加仓) - 'MAX_TOTAL_POSITION_PERCENT': 0.12, # 总仓位12%(保守控制总风险) + 'MAX_POSITION_PERCENT': 0.20, # 单笔仓位上限20%(作为风控熔断,实际仓位由固定风险模型决定) + 'MAX_TOTAL_POSITION_PERCENT': 0.80, # 总仓位80%(避免满仓,留有余地) 'MIN_POSITION_PERCENT': 0.01, # 最小仓位1% - 'MIN_MARGIN_USDT': 5.0, # 最小保证金5美元 + 'MIN_MARGIN_USDT': 10.0, # 最小保证金10美元(提高门槛,过滤过小交易) 'MIN_CHANGE_PERCENT': 0.5, # 最小价格变动0.5% - 'TOP_N_SYMBOLS': 20, # 选择信号最强的20个优先处理(2026-02-06优化:扩大候选池以捕获更多机会) - 'SCAN_EXTRA_SYMBOLS_FOR_SUPPLEMENT': 15, # 智能补单:多返回15个候选,冷却时仍可尝试后续交易对 - 'MAX_SCAN_SYMBOLS': 500, # 扫描前500个(覆盖所有交易对,确保不遗漏高波动币种) - 'EXCLUDE_MAJOR_COINS': True, # 排除主流币(BTC、ETH、BNB等),专注于山寨币 - 'STOP_LOSS_PERCENT': 0.10, # 止损10%(保证金百分比) - 2026-02-09优化:配合4倍杠杆,约2.5%价格波动 - 'TAKE_PROFIT_PERCENT': 0.60, # 第二目标/单目标止盈60%(保证金百分比) - 追求更高盈亏比 - 'TAKE_PROFIT_1_PERCENT': 0.30, # 第一目标止盈30%(保证金百分比) - 确保3:1盈亏比 (30% vs 10%) - 'MIN_STOP_LOSS_PRICE_PCT': 0.025, # 最小止损价格变动2.5%(2026-01-29优化:从2%提高到2.5%,给波动更多空间) + 'TOP_N_SYMBOLS': 30, # 扩大候选池到30个,增加机会 + 'SCAN_EXTRA_SYMBOLS_FOR_SUPPLEMENT': 20, # 智能补单候选增加 + 'MAX_SCAN_SYMBOLS': 500, # 扫描前500个 + 'EXCLUDE_MAJOR_COINS': True, # 排除主流币 + 'STOP_LOSS_PERCENT': 0.05, # 基础止损5%(配合ATR动态止损,作为保底) + 'TAKE_PROFIT_PERCENT': 0.80, # 第二目标止盈80%(追求大趋势收益) + 'TAKE_PROFIT_1_PERCENT': 0.30, # 第一目标止盈30%(确保3:1盈亏比) + 'MIN_RR_FOR_TP1': 1.2, # 第一目标止盈的最小盈亏比(相对于止损距离) + 'MIN_STOP_LOSS_PRICE_PCT': 0.025, # 最小止损价格变动2.5% 'MIN_TAKE_PROFIT_PRICE_PCT': 0.02, # 最小止盈价格变动2% 'USE_ATR_STOP_LOSS': True, # 使用ATR动态止损 - 'ATR_STOP_LOSS_MULTIPLIER': 1.5, # ATR止损倍数1.5(标准设置,避免噪音止损) - 'ATR_TAKE_PROFIT_MULTIPLIER': 4.5, # ATR止盈倍数4.5(确保3:1盈亏比) - 'RISK_REWARD_RATIO': 3.0, # 盈亏比3:1(2026-01-27优化:降低,更容易触发,保证胜率) + 'ATR_STOP_LOSS_MULTIPLIER': 2.0, # ATR止损倍数2.0(放宽止损,适应山寨币高波动) + 'ATR_TAKE_PROFIT_MULTIPLIER': 6.0, # ATR止盈倍数6.0(追求更高盈亏比) + 'RISK_REWARD_RATIO': 3.0, # 盈亏比3:1 'ATR_PERIOD': 14, # ATR计算周期14 'USE_DYNAMIC_ATR_MULTIPLIER': False, # 不使用动态ATR 'ATR_MULTIPLIER_MIN': 1.5, # 动态ATR倍数最小值 @@ -261,8 +262,8 @@ def _get_trading_config(): 'MAX_LEVERAGE': 12, # 最大杠杆12倍,不要超过 # 移动止损:必须开启!山寨币利润要保护 'USE_TRAILING_STOP': True, - 'TRAILING_STOP_ACTIVATION': 0.20, # 盈利20%后激活(给交易更多呼吸空间) - 'TRAILING_STOP_PROTECT': 0.05, # 保护5%利润 + 'TRAILING_STOP_ACTIVATION': 0.10, # 盈利10%后激活(更早锁定利润) + 'TRAILING_STOP_PROTECT': 0.02, # 保护2%利润(紧跟趋势) # 最小持仓时间锁:立即取消!山寨币30分钟可能暴涨暴跌50% 'MIN_HOLD_TIME_SEC': 0, # 取消持仓时间锁 diff --git a/trading_system/position_manager.py b/trading_system/position_manager.py index 56992bc..5fc865e 100644 --- a/trading_system/position_manager.py +++ b/trading_system/position_manager.py @@ -609,19 +609,34 @@ class PositionManager: # 兼容百分比形式和比例形式 if take_profit_1_pct_margin is not None and take_profit_1_pct_margin > 1: take_profit_1_pct_margin = take_profit_1_pct_margin / 100.0 - # 计算第一目标止盈价(基于保证金,默认15%) + + # 计算基于保证金的止盈距离 + tp1_distance = 0.0 if margin_usdt and margin_usdt > 0 and quantity > 0: take_profit_1_amount = margin_usdt * take_profit_1_pct_margin + tp1_distance = take_profit_1_amount / quantity + + # ⚠️ 2026-02-10优化:确保TP1至少有 1.2倍 的盈亏比 (相对于止损距离) + # 避免在高波动(宽止损)情况下,固定保证金比例止盈导致盈亏比过低 + if stop_distance_for_tp is not None and stop_distance_for_tp > 0: + min_rr_for_tp1 = config.TRADING_CONFIG.get('MIN_RR_FOR_TP1', 1.2) + min_tp1_distance = stop_distance_for_tp * min_rr_for_tp1 + if min_tp1_distance > tp1_distance: + logger.info(f"{symbol} [优化] TP1距离 ({tp1_distance:.4f}) 小于 {min_rr_for_tp1}倍止损距离 ({min_tp1_distance:.4f}),已自动调整以保证盈亏比") + tp1_distance = min_tp1_distance + + # 计算最终TP1价格 + if tp1_distance > 0: if side == 'BUY': - take_profit_1 = entry_price + (take_profit_1_amount / quantity) # 第一目标止盈(默认15%) + take_profit_1 = entry_price + tp1_distance else: - take_profit_1 = entry_price - (take_profit_1_amount / quantity) # 第一目标止盈(默认15%) + take_profit_1 = entry_price - tp1_distance else: - # 如果无法计算保证金,回退到盈亏比1:1 + # 如果无法计算(极少情况),回退到盈亏比1:1 if side == 'BUY': - take_profit_1 = entry_price + (entry_price - stop_loss_price) # 盈亏比1:1 + take_profit_1 = entry_price + (entry_price - stop_loss_price) else: - take_profit_1 = entry_price - (stop_loss_price - entry_price) # 盈亏比1:1 + take_profit_1 = entry_price - (stop_loss_price - entry_price) take_profit_2 = take_profit_price # 记录到数据库(只有在订单真正成交后才保存)