247 lines
6.6 KiB
Markdown
247 lines
6.6 KiB
Markdown
# 止损单挂单失败分析
|
||
|
||
## 📋 问题描述
|
||
|
||
INUSDT 止损单挂单失败,系统将依赖WebSocket监控,但可能无法及时止损。
|
||
|
||
**错误信息**:
|
||
```
|
||
INUSDT ❌ 止损单挂单失败!将依赖WebSocket监控,但可能无法及时止损
|
||
```
|
||
|
||
---
|
||
|
||
## ⚠️ 风险
|
||
|
||
**止损单挂单失败的风险**:
|
||
1. **没有交易所级别保护**:如果系统崩溃或网络中断,可能无法及时止损
|
||
2. **依赖WebSocket监控**:如果WebSocket断开,可能无法及时止损
|
||
3. **用户无法在币安界面看到止损单**:无法手动确认止损单是否已设置
|
||
|
||
---
|
||
|
||
## 🔍 可能的原因
|
||
|
||
### 1. 止损价格计算错误
|
||
|
||
**问题**:
|
||
- 止损价格可能不在正确的一侧
|
||
- BUY时止损价应低于入场价,SELL时止损价应高于入场价
|
||
- 如果止损价计算错误,币安会拒绝挂单
|
||
|
||
**检查**:
|
||
- 查看日志中的止损价格和入场价格
|
||
- 确认止损价格方向是否正确
|
||
|
||
### 2. 价格精度问题
|
||
|
||
**问题**:
|
||
- 止损价格可能不符合币安的精度要求(tickSize)
|
||
- 错误代码:-4014(Price not increased by tick size)
|
||
|
||
**检查**:
|
||
- 查看日志中的价格精度信息
|
||
- 确认止损价格是否对齐到 tickSize
|
||
|
||
### 3. 持仓不存在或方向不对
|
||
|
||
**问题**:
|
||
- 可能没有持仓或持仓方向不匹配
|
||
- 错误代码:-2022(ReduceOnly 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. **测试验证**:修复后测试止损单挂单是否成功
|