204 lines
5.8 KiB
Markdown
204 lines
5.8 KiB
Markdown
# 止损失效问题修复(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`
|
||
|
||
**修复逻辑**:
|
||
```python
|
||
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方向的止损价计算
|
||
|
||
**验证**:
|
||
- 止损价计算逻辑看起来是正确的
|
||
- 但需要检查实际计算出的止损价是否合理
|
||
|
||
### 原因3:WebSocket监控延迟 ❌ 可能
|
||
|
||
**问题**:
|
||
- WebSocket监控是实时的,每次收到价格更新就会立即检查
|
||
- 但如果止损单挂单失败,可能价格已经大幅偏离
|
||
|
||
**修复**:✅ 已修复
|
||
- 止损单挂单失败后,立即检查当前价格是否已触发止损
|
||
|
||
---
|
||
|
||
## 🎯 修复效果
|
||
|
||
### 修复前
|
||
|
||
**问题**:
|
||
- 止损单挂单失败后,系统依赖WebSocket监控
|
||
- 如果价格已经触发止损,需要等待WebSocket监控才能平仓
|
||
- 导致价格已经大幅偏离止损价,才触发平仓
|
||
|
||
**结果**:
|
||
- 交易ID 1658:价格涨了13.38%,亏损107%
|
||
- 交易ID 1652:价格涨了10.58%,亏损84.64%
|
||
|
||
### 修复后
|
||
|
||
**改进**:
|
||
- 止损单挂单失败后,立即检查当前价格是否已触发止损
|
||
- 如果已触发,立即执行市价平仓
|
||
- 避免价格大幅偏离止损价
|
||
|
||
**预期效果**:
|
||
- 止损单挂单失败后,如果价格已触发止损,立即平仓
|
||
- 避免亏损扩大
|
||
- 止损更及时
|
||
|
||
---
|
||
|
||
## 📝 后续建议
|
||
|
||
### 1. 检查日志
|
||
|
||
**建议**:
|
||
- 查看这些交易的开仓日志,确认止损单是否成功挂单
|
||
- 如果止损单挂单失败,查看失败原因(错误码、错误信息)
|
||
|
||
**命令**:
|
||
```bash
|
||
# 查看止损单挂单失败的日志
|
||
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. 如果仍有问题,检查日志并进一步排查
|