5.8 KiB
5.8 KiB
止损失效问题修复(2026-01-26)
🚨 问题总结
今天几笔单子都亏损了100%以上才止损,这是非常严重的问题!
问题交易记录
| 交易ID | 交易对 | 方向 | 入场价 | 出场价 | 亏损比例 | 问题 |
|---|---|---|---|---|---|---|
| 1658 | AXSUSDT | SELL | 2.033 | 2.305 | -107.03% | ❌ 超过100%! |
| 1652 | JTOUSDT | SELL | 0.3072 | 0.3397 | -84.64% | ❌ 远超15%止损 |
| 1645 | TIAUSDT | SELL | 0.418 | 0.4418 | -45.55% | ❌ 远超15%止损 |
问题分析
止损应该是什么:
- 止损百分比:15%(基于保证金)
- 杠杆:8倍
- 价格变动触发止损:15% / 8 = 1.875%
实际发生了什么:
- 交易ID 1658:价格涨了13.38%,亏损107%
- 交易ID 1652:价格涨了10.58%,亏损84.64%
- 止损完全没有生效!
🔧 修复方案
修复1:止损单挂单失败后立即检查并平仓 ✅ 已修复
问题:
- 止损单挂单失败后,系统依赖WebSocket监控
- 但如果当前价格已经触发止损,应该立即平仓,而不是等待WebSocket监控
修复:
- 在
trading_system/position_manager.py的_ensure_exchange_sltp_orders()方法中 - 止损单挂单失败后,立即检查当前价格是否已触发止损
- 如果已触发,立即执行市价平仓
代码位置:trading_system/position_manager.py:1270-1305
修复逻辑:
if sl_order:
# 止损单挂单成功
logger.info(f"{symbol} ✓ 止损单已成功挂到交易所")
else:
# 止损单挂单失败
logger.error(f"{symbol} ❌ 止损单挂单失败!")
# ⚠️ 关键修复:立即检查当前价格是否已触发止损
if current_price and stop_loss:
if side == "BUY" and current_price_val <= stop_loss_val:
# 做多:当前价 <= 止损价,立即平仓
await self.close_position(symbol, reason='stop_loss')
elif side == "SELL" and current_price_val >= stop_loss_val:
# 做空:当前价 >= 止损价,立即平仓
await self.close_position(symbol, reason='stop_loss')
📊 止损价格验证
SELL方向止损价计算验证
交易ID 1658 (AXSUSDT SELL):
- 入场价:2.033
- 保证金:2.54125 USDT
- 杠杆:8倍
- 止损百分比:15%
计算:
- 止损金额 =
2.54125 × 0.15 = 0.3811875 USDT - 数量:10
- 止损距离 =
0.3811875 / 10 = 0.03811875 USDT - 止损价 =
2.033 + 0.03811875 = 2.07111875✅
但实际价格涨到了2.305才平仓!
问题:
- 止损价应该是2.071,但价格涨到了2.305
- 说明止损单根本没有生效,或者止损价计算错误
🔍 可能的原因
原因1:止损单挂单失败 ❌ 最可能
症状:
- 日志显示"止损单挂单失败!将依赖WebSocket监控"
- 止损单被币安拒绝(错误码-2021: Order would immediately trigger)
问题:
- 如果止损单挂单失败,系统依赖WebSocket监控
- 但WebSocket监控可能:
- 没有及时触发
- 监控间隔太长
- 网络延迟导致价格已经大幅偏离
修复:✅ 已修复
- 止损单挂单失败后,立即检查当前价格是否已触发止损
- 如果已触发,立即执行市价平仓
原因2:止损价格计算错误 ❌ 可能
问题:
- 止损价格计算错误,导致止损价设置得太远
- 特别是SELL方向的止损价计算
验证:
- 止损价计算逻辑看起来是正确的
- 但需要检查实际计算出的止损价是否合理
原因3:WebSocket监控延迟 ❌ 可能
问题:
- WebSocket监控是实时的,每次收到价格更新就会立即检查
- 但如果止损单挂单失败,可能价格已经大幅偏离
修复:✅ 已修复
- 止损单挂单失败后,立即检查当前价格是否已触发止损
🎯 修复效果
修复前
问题:
- 止损单挂单失败后,系统依赖WebSocket监控
- 如果价格已经触发止损,需要等待WebSocket监控才能平仓
- 导致价格已经大幅偏离止损价,才触发平仓
结果:
- 交易ID 1658:价格涨了13.38%,亏损107%
- 交易ID 1652:价格涨了10.58%,亏损84.64%
修复后
改进:
- 止损单挂单失败后,立即检查当前价格是否已触发止损
- 如果已触发,立即执行市价平仓
- 避免价格大幅偏离止损价
预期效果:
- 止损单挂单失败后,如果价格已触发止损,立即平仓
- 避免亏损扩大
- 止损更及时
📝 后续建议
1. 检查日志
建议:
- 查看这些交易的开仓日志,确认止损单是否成功挂单
- 如果止损单挂单失败,查看失败原因(错误码、错误信息)
命令:
# 查看止损单挂单失败的日志
grep "止损单挂单失败" /www/wwwroot/autosys_new/logs/trading_*.log
# 查看止损单挂单失败后的处理日志
grep "止损单挂单失败,但当前价格已触发止损" /www/wwwroot/autosys_new/logs/trading_*.log
2. 验证止损价格
建议:
- 检查止损价格计算是否正确
- 特别是SELL方向的止损价计算
验证方法:
- 查看开仓日志中的止损价格
- 对比计算出的止损价格和实际止损价格
3. 增强监控
建议:
- 如果止损单挂单失败,增加WebSocket监控频率
- 缩短监控间隔,确保及时触发止损
✅ 修复完成
修复文件:
trading_system/position_manager.py
修复内容:
- 止损单挂单失败后,立即检查当前价格是否已触发止损
- 如果已触发,立即执行市价平仓
下一步:
- 重启交易进程,让修复生效
- 观察后续交易,确认止损是否及时触发
- 如果仍有问题,检查日志并进一步排查