auto_trade_sys/docs/STOP_LOSS_ORDER_FAILURE_ANALYSIS.md
薇薇安 86b85c2609 a
2026-01-25 11:19:39 +08:00

6.6 KiB
Raw Permalink Blame History

止损单挂单失败分析

📋 问题描述

INUSDT 止损单挂单失败系统将依赖WebSocket监控但可能无法及时止损。

错误信息

INUSDT ❌ 止损单挂单失败将依赖WebSocket监控但可能无法及时止损

⚠️ 风险

止损单挂单失败的风险

  1. 没有交易所级别保护:如果系统崩溃或网络中断,可能无法及时止损
  2. 依赖WebSocket监控如果WebSocket断开可能无法及时止损
  3. 用户无法在币安界面看到止损单:无法手动确认止损单是否已设置

🔍 可能的原因

1. 止损价格计算错误

问题

  • 止损价格可能不在正确的一侧
  • BUY时止损价应低于入场价SELL时止损价应高于入场价
  • 如果止损价计算错误,币安会拒绝挂单

检查

  • 查看日志中的止损价格和入场价格
  • 确认止损价格方向是否正确

2. 价格精度问题

问题

  • 止损价格可能不符合币安的精度要求tickSize
  • 错误代码:-4014Price not increased by tick size

检查

  • 查看日志中的价格精度信息
  • 确认止损价格是否对齐到 tickSize

3. 持仓不存在或方向不对

问题

  • 可能没有持仓或持仓方向不匹配
  • 错误代码:-2022ReduceOnly Order is rejected

检查

  • 确认币安账户中是否有持仓
  • 确认持仓方向是否匹配

4. 对冲/单向模式问题

问题

  • 币安账户可能是对冲模式,但代码按单向模式处理(或反之)
  • 需要正确设置 positionSide 参数

检查

  • 查看日志中的对冲模式信息
  • 确认 positionSide 参数是否正确

5. 触发价格会导致立即触发

问题

  • 止损价格太接近当前价格,会导致立即触发
  • 币安会拒绝这种订单

检查

  • 查看日志中的当前价格和止损价格
  • 确认止损价格是否在正确的一侧

已完成的改进

1. 增强错误日志

改进内容

  • 添加详细的错误信息(错误代码、错误消息)
  • 记录止损价格、当前价格、持仓方向等关键信息
  • 针对常见错误码提供具体的解决建议

代码位置

  • trading_system/binance_client.py:1535-1580
  • trading_system/position_manager.py:1154-1155

2. 添加止损价格验证

改进内容

  • 在挂单前验证止损价格方向是否正确
  • BUY时止损价应低于入场价SELL时止损价应高于入场价
  • 如果验证失败,记录错误并跳过挂单

代码位置

  • trading_system/position_manager.py:1136-1148

3. 改进重试逻辑

改进内容

  • 如果首次挂单失败,尝试切换 positionSide 重试
  • 记录重试过程和结果
  • 如果所有重试都失败,记录详细参数用于调试

代码位置

  • trading_system/binance_client.py:1526-1549

4. 自动获取当前价格

改进内容

  • 如果未提供当前价格,自动从币安获取
  • 确保止损价格验证和调整使用最新的价格

代码位置

  • trading_system/position_manager.py:1150-1155

🔧 故障排查步骤

步骤1查看详细错误日志

检查交易日志,查找以下信息:

INUSDT ❌ 挂保护单失败(STOP_MARKET): ...
  错误代码: ...
  触发价格: ...
  当前价格: ...
  持仓方向: ...
  平仓方向: ...
  价格精度: ..., 价格步长: ...

步骤2检查止损价格计算

确认止损价格是否正确:

  • BUY订单:止损价应 < 入场价
  • SELL订单:止损价应 > 入场价

如果止损价格方向错误,检查:

  1. risk_manager.get_stop_loss_price() 的计算逻辑
  2. ATR 值是否正确
  3. ATR_STOP_LOSS_MULTIPLIER 配置是否正确

步骤3检查持仓状态

确认币安账户中是否有持仓:

  • 登录币安,查看是否有 INUSDT 的持仓
  • 确认持仓方向LONG/SHORT是否匹配

步骤4检查价格精度

确认止损价格是否符合精度要求:

  • 查看日志中的 价格精度价格步长
  • 确认止损价格是否对齐到 tickSize

步骤5检查对冲模式

确认币安账户的持仓模式:

  • 查看日志中的 对冲模式 信息
  • 确认 positionSide 参数是否正确

💡 解决方案

方案1修复止损价格计算如果计算错误

如果止损价格方向错误

  1. 检查 risk_manager.get_stop_loss_price() 方法
  2. 确认 ATR 计算是否正确
  3. 确认 ATR_STOP_LOSS_MULTIPLIER 配置是否正确

方案2调整价格精度如果精度问题

如果价格精度错误

  1. 检查 _format_price_str_with_rounding() 方法
  2. 确认价格格式化是否正确
  3. 确保止损价格对齐到 tickSize

方案3手动设置止损临时方案

如果自动挂单失败

  1. 登录币安,手动设置止损单
  2. 确保止损价格在正确的一侧
  3. 等待系统修复后,再使用自动挂单

方案4检查持仓模式如果模式问题

如果对冲模式问题

  1. 确认币安账户的持仓模式(对冲/单向)
  2. 检查代码中的 dual 变量是否正确
  3. 确保 positionSide 参数正确设置

📊 预期改善

改进后预期:

  1. 详细的错误日志:能够快速定位问题原因
  2. 价格验证:在挂单前验证止损价格,避免无效请求
  3. 自动重试:尝试切换 positionSide 重试,提高成功率
  4. 更好的诊断:记录所有关键参数,便于调试

⚠️ 重要提醒

止损单挂单失败是严重问题,因为:

  1. 没有交易所级别保护,系统崩溃时可能无法止损
  2. 依赖WebSocket监控网络中断时可能无法止损
  3. 用户无法在币安界面看到止损单

必须尽快修复,否则可能导致大额亏损。


🔍 需要检查的信息

  1. 交易日志

    • 止损单挂单失败的详细错误信息
    • 错误代码和错误消息
    • 止损价格、当前价格、持仓方向
  2. 币安账户

    • 是否有 INUSDT 的持仓
    • 持仓方向LONG/SHORT
    • 持仓模式(对冲/单向)
  3. 配置

    • ATR_STOP_LOSS_MULTIPLIER 的值
    • EXCHANGE_SLTP_ENABLED 的值
    • 止损价格计算逻辑

📝 下一步行动

  1. 查看详细日志:检查最新的错误日志,确认具体失败原因
  2. 验证止损价格:确认止损价格计算是否正确
  3. 检查持仓状态:确认币安账户中是否有持仓
  4. 修复问题:根据错误信息修复相应的问题
  5. 测试验证:修复后测试止损单挂单是否成功