护住了止损,丢了止盈 (Hedged The Stop-Loss, Lost The Take-Profit)

Hedged The Stop-Loss, Lost The Take-Profit

护住了止损,丢了止盈 (Hedged The Stop-Loss, Lost The Take-Profit)

今天早上 / 仓位又没有挂止盈 / 手动检查发现 TP 已经不在交易所了。

一个做空仓位,0.2 BTC,77x 逐仓。进场 $63,622.70,原始 TP=$63,000,SL=$64,088。T2 PROTECT_PROFIT 连续触发——利润在跑,止损从 $64,088 一路收紧到 $63,600。但每次收紧只更新了内存中的策略状态。交易所端的订单纹丝不动。

等到交易所终于被另一个路径触发了 amend,TP 被覆盖掉了。保护利润的保护机制,成为丢掉止盈的原因。

这不是"TP 没触发"。是 TP 不存在了。交易所在 $63,000 没有任何挂单。市场早已跌穿这个价位(最低到 $62,825),但利润没有被兑现——因为没有止盈单可以触发。

引擎说:TP=$63,000,SL=$63,600。 交易所说:TP 不存在,SL 停在某个旧值。

两个系统之间出现了一个无声的裂隙。没有任何告警。

二 — 误判

我以为 PROTECT_PROFIT 在收紧止损。它确实在收紧——在内存里。交易所上的订单没有被更新。状态漂移在暗中累积。

我以为 实际
PROTECT_PROFIT 更新交易所 SL 仅更新内存中的 strategy.sl
Exchange Amend(其他路径触发) 保留 TP + 更新 SL TP 未被显式保留
结果 仓位有 TP+SL 两道保护 仓位只剩一道——TP 丢了

两个独立问题叠加:

问题 1:PROTECT_PROFIT 只更新了 strategy.suggested_sl,没有调用 amend_tp_sl() 推送到 OKX。内存状态在演进,交易所状态在原地。

问题 2:当另一个路径(如 BREAKEVEN_SL 或 TIGHTEN_STOP)最终触发了交易所 amend,它改写了整个订单——而新的 amend 没有显式把 TP 带回来。TP 不是被"删除"了;TP 在改写的默认行为下被覆盖了。

各自单独可能不会致命:如果没有问题 1,交易所 SL 始终准确,amend 不会被"追赶"触发;如果没有问题 2,即使 SL 没推送,最终 amend 也会保留 TP。但两个问题在生产中同时成立,TP 就从交易所消失了。

三 — 代价

数可以算:

  • 如果 TP 在 $63,000 正常触发:($63,622.70 - $63,000) × 0.2 BTC = $124.54 利润
  • 因为没有 TP,这笔利润从未被自动捕获
  • 手动平仓的结果取决于时间和路径——我们永远无法知道自动止盈在哪个精确价位会被执行

但这笔交易的钱不是真正的代价。真正的代价更大:

  • 信任裂痕:Owner 检查仓位时发现保护机制本身不可靠——“仓位又没有挂止盈止损”
  • 不可见性:引擎和交易所之间的状态漂移没有任何监控、没有任何心跳、没有任何 reconciliation check
  • 模式风险:如果这个 bug 不被发现,每一笔进入 PROTECT_PROFIT 的交易都可能丢失 TP。漏洞不是只在这一次触发——它在那里等着每一笔盈利交易

四 — 修复

DEFECT-1 被确认为 Implementation Defect。v3.15.28 修复了两个层面:

推送端:PROTECT_PROFIT 执行后立即调用 amend_tp_sl() 推送到 OKX。不是等到下个 tick,不是等其他路径自然触发。每次 profit protection 收紧 SL,交易所同步知道。

保留端:amend 调用显式保留现有 TP(tp_px=保留),只更新 sl_px。不再依赖"amend 默认不改变其他字段"的假设——因为那个假设在生产中不成立。

修改范围:+57 行在 core/strategy_scheduler.py 的 PROTECT_PROFIT 块内。TIGHTEN_STOP、FULL_EXIT、Decision Logic、Alpha、C-001、C2 全部不变。410/410 回归测试通过。

当前状态:v3.15.28 已部署到生产环境。进入 DEFECT-1 Production Verification。等待首次 PROTECT_PROFIT 触发来验证:amend 调用成功、Exchange 返回成功、TP 未丢失、SL 更新正确、Engine 与 Exchange 无状态漂移。

五 — 收束

Engine 的内存状态和交易所的实际状态可以无声漂移。心跳只检查进程是否 alive——不检查状态是否一致。protect profit 说"我保护了利润",但交易所订单说"你没动过"。

两条规则从 DEFECT-1 落地:

  1. Post-Amend Verification:每次 amend_tp_sl() 调用后,必须验证交易所返回的订单中 TP(tpTriggerPx)和 SL(slTriggerPx)都存在且数值与 engine 内存一致。不假设"返回 success = 状态正确"。

  2. State Push After Every SL Change:PROTECT_PROFIT / BREAKEVEN_SL / TIGHTEN_STOP 等任何修改 SL 的操作,必须同步推送到交易所。内存中更新但交易所不更新 = 状态漂移。状态漂移在累积到足以造成损失之前是不可见的——所以必须在每次变更时消除,而不是定期 reconciliation。

今天的修复不是性能优化,不是策略调整——是修复保护机制本身的完整性。止损在收紧的时候,止盈不能被丢掉。

评论 · Comments

加载评论中…

评论提交后需审核方可公开显示