223 lines
6.9 KiB
Markdown
223 lines
6.9 KiB
Markdown
# 交易亏损分析报告 - 2026-01-23(第二批)
|
||
|
||
## 📊 亏损交易详情
|
||
|
||
### 交易 #1278 (INUSDT)
|
||
- **方向**:BUY
|
||
- **入场价**:0.0937 USDT
|
||
- **出场价**:0.0914 USDT
|
||
- **价格跌幅**:**2.45%**
|
||
- **盈亏**:-2.54 USDT
|
||
- **盈亏比例**:**-37.00%**(相对于保证金6.87 USDT)
|
||
- **持仓时间**:10分钟(16:03 - 16:13)
|
||
- **平仓类型**:手动平仓 ❌
|
||
|
||
### 交易 #1275 (INUSDT)
|
||
- **方向**:BUY
|
||
- **入场价**:0.0970 USDT
|
||
- **出场价**:0.0952 USDT
|
||
- **价格跌幅**:**1.86%**
|
||
- **盈亏**:-1.97 USDT
|
||
- **盈亏比例**:**-28.60%**(相对于保证金6.90 USDT)
|
||
- **持仓时间**:10分钟(15:33 - 15:43)
|
||
- **平仓类型**:手动平仓 ❌
|
||
|
||
---
|
||
|
||
## ⚠️ 核心问题分析
|
||
|
||
### 问题1:手动平仓误判(最严重)
|
||
|
||
**现象**:
|
||
- 两笔交易都被标记为"手动平仓"
|
||
- 但亏损比例极高(-37%和-28.6%),明显是止损触发
|
||
- 持仓时间只有10分钟,符合止损触发的特征
|
||
|
||
**根本原因**:
|
||
1. **币安保护单触发机制**:
|
||
- 币安的保护单(STOP/TAKE_PROFIT)触发后,会生成一个 MARKET 订单
|
||
- 这个 MARKET 订单的 `reduceOnly` 字段可能为 `false`(币安API的bug或特殊情况)
|
||
- 导致系统误判为手动平仓
|
||
|
||
2. **价格匹配逻辑失效**:
|
||
- 代码使用 `_close_to(ep, sl, max_pct=0.05)` 判断平仓价格是否接近止损价
|
||
- 但这两笔交易的平仓价格可能离止损价较远(超过5%),导致无法匹配
|
||
- 如果止损价设置错误或滑点太大,价格匹配会失败
|
||
|
||
**代码位置**:`trading_system/position_manager.py:1918-1967`
|
||
|
||
---
|
||
|
||
### 问题2:止损距离可能太紧
|
||
|
||
**分析**:
|
||
- 交易 #1278:价格只跌了 2.45%,但亏损比例达到 -37%
|
||
- 交易 #1275:价格只跌了 1.86%,但亏损比例达到 -28.6%
|
||
|
||
**可能原因**:
|
||
1. **ATR 太小**:
|
||
- 如果 ATR 只有 0.5-1%,即使使用 2.5 倍 ATR,止损距离也只有 1.25-2.5%
|
||
- 对于波动较大的币种,这个止损距离太紧了
|
||
|
||
2. **固定风险百分比未生效**:
|
||
- 如果固定风险2%生效,每笔亏损应该限制在总资金的2%左右
|
||
- 但实际亏损比例(相对于保证金)达到 28-37%,说明固定风险可能没有生效
|
||
|
||
3. **仓位过大**:
|
||
- 如果固定风险计算失败,回退到传统方法(基于 MAX_POSITION_PERCENT)
|
||
- 可能导致仓位过大,止损距离相对较小
|
||
|
||
---
|
||
|
||
### 问题3:价格匹配容忍度可能不够
|
||
|
||
**当前逻辑**:
|
||
```python
|
||
def _close_to(a: float, b: float, max_pct: float = 0.05) -> bool:
|
||
return abs((a - b) / b) <= max_pct # 5%容忍度
|
||
```
|
||
|
||
**问题**:
|
||
- 如果止损价是 0.0900,平仓价是 0.0914,差距是 1.56%
|
||
- 但如果止损价计算错误(比如是 0.0920),平仓价 0.0914 与止损价 0.0920 的差距是 0.65%
|
||
- 在极端行情下,滑点可能超过5%,导致价格匹配失败
|
||
|
||
---
|
||
|
||
## 💡 解决方案
|
||
|
||
### 方案1:改进手动平仓识别逻辑(最高优先级)
|
||
|
||
**问题**:当前逻辑依赖 `reduceOnly` 字段,但币安API可能不准确。
|
||
|
||
**解决方案**:
|
||
1. **优先使用价格匹配**:如果平仓价格接近止损/止盈价(5%范围内),直接标记为对应类型
|
||
2. **检查持仓时间**:如果持仓时间很短(< 30分钟)且亏损,更可能是止损触发
|
||
3. **检查亏损比例**:如果亏损比例超过止损目标(如 -10%),更可能是止损触发
|
||
4. **检查订单来源**:如果是系统自动下单,不应该标记为手动平仓
|
||
|
||
**代码修改**:
|
||
```python
|
||
# 在 sync_positions_with_binance 中
|
||
# 1. 优先检查价格匹配(已实现,但需要提高优先级)
|
||
# 2. 如果价格不匹配,但满足以下条件,也标记为止损:
|
||
# - 持仓时间 < 30分钟
|
||
# - 亏损比例 > 止损目标
|
||
# - 是系统自动下单(有 trade_id)
|
||
```
|
||
|
||
---
|
||
|
||
### 方案2:放宽止损距离(提高 ATR 倍数)
|
||
|
||
**当前配置**:
|
||
- `ATR_STOP_LOSS_MULTIPLIER = 2.5`
|
||
|
||
**建议调整**:
|
||
- 提高到 **3.0-3.5**,给波动留出更多空间
|
||
- 或者根据币种波动率动态调整
|
||
|
||
**风险**:
|
||
- 止损距离放宽后,单笔亏损会增加
|
||
- 但如果固定风险2%生效,总亏损仍然可控
|
||
|
||
---
|
||
|
||
### 方案3:增强价格匹配逻辑
|
||
|
||
**当前问题**:
|
||
- 5%的容忍度可能不够(极端滑点)
|
||
- 只检查平仓价与止损价,没有检查实际亏损比例
|
||
|
||
**改进方案**:
|
||
1. **提高容忍度**:从5%提高到8-10%
|
||
2. **检查亏损比例**:如果实际亏损比例接近止损目标(如 -8% vs -10%),也标记为止损
|
||
3. **检查价格方向**:如果平仓价在止损价的方向上(BUY时平仓价 < 止损价),更可能是止损触发
|
||
|
||
---
|
||
|
||
### 方案4:确保固定风险百分比生效
|
||
|
||
**检查点**:
|
||
1. 确认 `USE_FIXED_RISK_SIZING = true`
|
||
2. 确认 `FIXED_RISK_PERCENT = 0.02`(2%)
|
||
3. 检查交易日志,确认是否显示"使用固定风险百分比计算仓位"
|
||
4. 如果固定风险计算失败,需要修复bug
|
||
|
||
---
|
||
|
||
## 🎯 立即行动
|
||
|
||
### 1. 修复手动平仓识别逻辑(紧急)
|
||
|
||
**修改文件**:`trading_system/position_manager.py`
|
||
|
||
**修改位置**:`sync_positions_with_binance` 方法中的 `exit_reason` 判断逻辑
|
||
|
||
**修改内容**:
|
||
1. 提高价格匹配的优先级
|
||
2. 增加持仓时间和亏损比例的检查
|
||
3. 如果满足止损特征,即使 `reduceOnly=false`,也标记为止损
|
||
|
||
---
|
||
|
||
### 2. 检查并调整止损距离
|
||
|
||
**检查**:
|
||
1. 查看这两笔交易的 ATR 值
|
||
2. 计算实际止损距离
|
||
3. 确认是否使用了 2.5 倍 ATR
|
||
|
||
**调整**:
|
||
- 如果 ATR 太小,考虑提高 `ATR_STOP_LOSS_MULTIPLIER` 到 3.0-3.5
|
||
- 或者设置最小止损距离(如 3%)
|
||
|
||
---
|
||
|
||
### 3. 验证固定风险百分比
|
||
|
||
**检查**:
|
||
1. 查看交易日志,确认是否使用固定风险计算
|
||
2. 如果未使用,检查失败原因
|
||
3. 修复bug,确保固定风险生效
|
||
|
||
---
|
||
|
||
## 📋 预期改善
|
||
|
||
修复后预期:
|
||
1. **准确识别平仓原因**:止损触发不再被误判为手动平仓
|
||
2. **止损距离更合理**:减少被随机波动扫损的概率
|
||
3. **单笔亏损可控**:固定风险2%生效,每笔亏损限制在总资金的2%左右
|
||
|
||
---
|
||
|
||
## 🔍 需要检查的数据
|
||
|
||
1. **交易日志**:
|
||
- 这两笔交易的 ATR 值
|
||
- 止损价格
|
||
- 是否使用固定风险计算
|
||
- 币安订单的 `reduceOnly` 字段
|
||
|
||
2. **配置快照**:
|
||
- `ATR_STOP_LOSS_MULTIPLIER` 的实际值
|
||
- `USE_FIXED_RISK_SIZING` 的实际值
|
||
- `FIXED_RISK_PERCENT` 的实际值
|
||
|
||
3. **数据库记录**:
|
||
- 这两笔交易的 `stop_loss_price` 字段
|
||
- `atr` 字段
|
||
- `exit_reason` 字段
|
||
|
||
---
|
||
|
||
## ⚠️ 重要提醒
|
||
|
||
这两笔交易亏损比例极高(-37%和-28.6%),说明:
|
||
1. **止损距离太紧**:价格只跌了1.86-2.45%就触发止损
|
||
2. **固定风险可能未生效**:如果固定风险2%生效,亏损比例不应该这么高
|
||
3. **手动平仓误判**:这两笔明显是止损触发,不应该标记为手动平仓
|
||
|
||
**必须立即修复**,否则系统会继续产生大额亏损。
|