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:
@@ -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)
|
||||
|
||||
# 期期 opening:perp_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(
|
||||
|
||||
Reference in New Issue
Block a user