auto_trade_sys/docs/止损失效问题修复_2026-01-26.md
薇薇安 9fe028d704 a
2026-01-27 10:36:56 +08:00

5.8 KiB
Raw Blame History

止损失效问题修复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%

计算

  1. 止损金额 = 2.54125 × 0.15 = 0.3811875 USDT
  2. 数量10
  3. 止损距离 = 0.3811875 / 10 = 0.03811875 USDT
  4. 止损价 = 2.033 + 0.03811875 = 2.07111875

但实际价格涨到了2.305才平仓!

问题

  • 止损价应该是2.071但价格涨到了2.305
  • 说明止损单根本没有生效,或者止损价计算错误

🔍 可能的原因

原因1止损单挂单失败 最可能

症状

  • 日志显示"止损单挂单失败将依赖WebSocket监控"
  • 止损单被币安拒绝(错误码-2021: Order would immediately trigger

问题

  • 如果止损单挂单失败系统依赖WebSocket监控
  • 但WebSocket监控可能
    1. 没有及时触发
    2. 监控间隔太长
    3. 网络延迟导致价格已经大幅偏离

修复 已修复

  • 止损单挂单失败后,立即检查当前价格是否已触发止损
  • 如果已触发,立即执行市价平仓

原因2止损价格计算错误 可能

问题

  • 止损价格计算错误,导致止损价设置得太远
  • 特别是SELL方向的止损价计算

验证

  • 止损价计算逻辑看起来是正确的
  • 但需要检查实际计算出的止损价是否合理

原因3WebSocket监控延迟 可能

问题

  • 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

修复内容

  • 止损单挂单失败后,立即检查当前价格是否已触发止损
  • 如果已触发,立即执行市价平仓

下一步

  1. 重启交易进程,让修复生效
  2. 观察后续交易,确认止损是否及时触发
  3. 如果仍有问题,检查日志并进一步排查