Fix LIVE SoT P0/P1: closing state machine, OO exchange fills, BN balances.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-08 15:54:45 +08:00
parent 99e58910d3
commit 8d67f3fc6c
10 changed files with 864 additions and 167 deletions
+36 -7
View File
@@ -278,14 +278,21 @@ def recover_stuck_opening(executor) -> CloseResult | None:
group_id = str(pos.get("group_id") or "")
perp_inst = resolve_perp_inst_id(executor.db, group_id=group_id or None)
# 期期 openingperp_side 形如 oo_put:{put_inst}
oo_put_inst = ""
if perp_side.startswith("oo_put:"):
oo_put_inst = perp_side.split(":", 1)[1].strip()
perp_total = 0.0
for side in ("long", "short"):
sz = exchange_perp_abs_size(client, ex_name or "", perp_inst, side)
if sz is None:
return CloseResult(ok=False, detail="recover_opening: 无法查永续")
perp_total += float(sz)
if not oo_put_inst:
for side in ("long", "short"):
sz = exchange_perp_abs_size(client, ex_name or "", perp_inst, side)
if sz is None:
return CloseResult(ok=False, detail="recover_opening: 无法查永续")
perp_total += float(sz)
opt_sz = 0.0
put_sz = 0.0
if option_inst:
raw = exchange_option_abs_size(client, option_inst)
if raw is None:
@@ -304,12 +311,34 @@ def recover_stuck_opening(executor) -> CloseResult | None:
),
)
opt_sz = 0.0
if oo_put_inst:
raw_p = exchange_option_abs_size(client, oo_put_inst)
if raw_p is None:
return CloseResult(ok=False, detail="recover_opening: 无法查期期 Put")
put_sz = float(raw_p)
# 两边皆空 → 清槽
if opt_sz <= _OPT_EPS and perp_total <= _PERP_EPS:
# 两边皆空 → 清槽(期期须 Call+Put 皆空)
if opt_sz <= _OPT_EPS and put_sz <= _OPT_EPS and perp_total <= _PERP_EPS:
release_open_slot_if_opening(executor.db)
return CloseResult(ok=True, detail="recover_opening: 交易所空仓,已释放 opening")
# 期期:任一腿残留且无完整双边 → 禁止清槽;仅 Call 则 half_open repair
if oo_put_inst:
if put_sz > _OPT_EPS and opt_sz <= _OPT_EPS:
return CloseResult(
ok=False,
detail=(
f"recover_opening: 期期 Put 残留({oo_put_inst}) Call 已空,"
"禁止清槽,请人工核对"
),
)
if opt_sz > _OPT_EPS and put_sz > _OPT_EPS:
return CloseResult(
ok=False,
detail="recover_opening: 期期两腿均在交易所,请人工核对后 promote",
)
# 仅 Call → 落入下方 half_open
# 无元数据但有仓 → 不自动处理
if not option_inst:
return CloseResult(