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