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

6.9 KiB
Raw Permalink Blame History

交易亏损分析报告 - 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价格匹配容忍度可能不够

当前逻辑

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. 检查订单来源:如果是系统自动下单,不应该标记为手动平仓

代码修改

# 在 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.022%
  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. 手动平仓误判:这两笔明显是止损触发,不应该标记为手动平仓

必须立即修复,否则系统会继续产生大额亏损。