131 lines
4.5 KiB
Markdown
131 lines
4.5 KiB
Markdown
# SELL单止损价格计算错误修复
|
||
|
||
## 🚨 严重问题
|
||
|
||
### 问题描述
|
||
|
||
SELL单(做空)出现巨额亏损(-91.93%),原因是止损价格计算逻辑错误,选择了"更宽松"的止损(更远离入场价),而不是"更紧"的止损(更接近入场价)。
|
||
|
||
### 具体案例
|
||
|
||
**AXLUSDT SELL 单(交易ID: 1727)**:
|
||
- 入场价:0.0731
|
||
- 出场价:0.0815
|
||
- 方向:SELL(做空)
|
||
- 盈亏比例:-91.93%(几乎亏光保证金)
|
||
|
||
**问题分析**:
|
||
- 做空单,价格从0.0731涨到0.0815,涨幅11.22%
|
||
- 如果止损价格正确(更接近入场价,比如0.075),应该在价格涨到0.075时止损,亏损约5%
|
||
- 但实际亏损-91.93%,说明止损价格设置错误,选择了"更宽松"的止损(更远离入场价,比如0.082)
|
||
|
||
---
|
||
|
||
## 🔍 根本原因
|
||
|
||
### 代码逻辑矛盾
|
||
|
||
**位置**:`trading_system/risk_manager.py:689-757`
|
||
|
||
**问题**:
|
||
1. **第689-700行**:选择"更紧的止损"(更接近入场价)
|
||
- BUY: 取最大值(更高的止损价,更接近入场价)✅
|
||
- SELL: 取最小值(更低的止损价,更接近入场价)✅
|
||
|
||
2. **第750-757行**:重新选择最终的止损价,保持"更宽松/更远"的选择规则 ❌
|
||
- BUY: 取最小值(更低的止损价,更远离入场价)❌
|
||
- SELL: 取最大值(更高的止损价,更远离入场价)❌
|
||
|
||
**结果**:
|
||
- 第750-757行的逻辑会覆盖第689-700行的逻辑
|
||
- 导致SELL单选择了"更宽松"的止损(更远离入场价)
|
||
- 这就是为什么会出现-91.93%的巨额亏损
|
||
|
||
---
|
||
|
||
## ✅ 修复方案
|
||
|
||
### 修复内容
|
||
|
||
**修改位置**:`trading_system/risk_manager.py:750-757`
|
||
|
||
**修复前**:
|
||
```python
|
||
# 重新选择最终的止损价(包括技术止损)
|
||
# 仍保持"更宽松/更远"的选择规则
|
||
if side == 'BUY':
|
||
final_stop_loss = min(p[1] for p in candidate_prices) # ❌ 更宽松
|
||
selected_method = [p[0] for p in candidate_prices if p[1] == final_stop_loss][0]
|
||
else:
|
||
final_stop_loss = max(p[1] for p in candidate_prices) # ❌ 更宽松
|
||
selected_method = [p[0] for p in candidate_prices if p[1] == final_stop_loss][0]
|
||
```
|
||
|
||
**修复后**:
|
||
```python
|
||
# ⚠️ 关键修复:重新选择最终的止损价(包括技术止损)
|
||
# 必须保持"更紧的止损"(更接近入场价)的选择规则,保护资金
|
||
# - 做多(BUY):止损价越低越紧 → 取最大值(更高的止损价,更接近入场价)
|
||
# - 做空(SELL):止损价越高越紧 → 取最小值(更低的止损价,更接近入场价)
|
||
if side == 'BUY':
|
||
# 做多:选择更高的止损价(更接近入场价,更紧)
|
||
final_stop_loss = max(p[1] for p in candidate_prices) # ✅ 更紧
|
||
selected_method = [p[0] for p in candidate_prices if p[1] == final_stop_loss][0]
|
||
else:
|
||
# 做空:选择更低的止损价(更接近入场价,更紧)
|
||
# ⚠️ 注意:对于SELL单,止损价高于入场价,所以"更低的止损价"意味着更接近入场价
|
||
final_stop_loss = min(p[1] for p in candidate_prices) # ✅ 更紧
|
||
selected_method = [p[0] for p in candidate_prices if p[1] == final_stop_loss][0]
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 修复效果
|
||
|
||
### 修复前
|
||
|
||
**SELL单止损价格选择**:
|
||
- 入场价:0.0731
|
||
- 候选止损价:0.075(保证金止损)、0.082(ATR止损)
|
||
- 选择:max(0.075, 0.082) = 0.082(更宽松,更远离入场价)❌
|
||
- 结果:价格涨到0.0815时触发止损,亏损-91.93%
|
||
|
||
### 修复后
|
||
|
||
**SELL单止损价格选择**:
|
||
- 入场价:0.0731
|
||
- 候选止损价:0.075(保证金止损)、0.082(ATR止损)
|
||
- 选择:min(0.075, 0.082) = 0.075(更紧,更接近入场价)✅
|
||
- 结果:价格涨到0.075时触发止损,亏损约5%
|
||
|
||
---
|
||
|
||
## 🎯 预期效果
|
||
|
||
修复后预期:
|
||
- ✅ SELL单止损价格正确,选择"更紧"的止损(更接近入场价)
|
||
- ✅ 不再出现巨额亏损(-91.93%)
|
||
- ✅ 止损及时触发,保护资金
|
||
- ✅ 盈亏比改善(从0.39:1提升到1.5:1+)
|
||
|
||
---
|
||
|
||
## ⚠️ 注意事项
|
||
|
||
1. **立即重启交易进程**:修复后需要重启所有交易进程,让新代码生效
|
||
2. **监控SELL单**:修复后需要密切监控SELL单的止损价格和止损触发情况
|
||
3. **检查现有持仓**:如果有现有的SELL单持仓,需要检查止损价格是否正确
|
||
|
||
---
|
||
|
||
## 📝 相关配置
|
||
|
||
当前配置:
|
||
- `STOP_LOSS_PERCENT`: 0.15(15%)
|
||
- `ATR_STOP_LOSS_MULTIPLIER`: 2.0
|
||
- `MIN_STOP_LOSS_PRICE_PCT`: 0.02(2%)
|
||
|
||
建议:
|
||
- 保持当前配置,修复后应该能正常工作
|
||
- 如果仍然出现止损过宽的问题,可以考虑降低`ATR_STOP_LOSS_MULTIPLIER`到1.5
|