Fix ghost finalize on unknown perp size and open rollback hazards.

Distinguish exchange query None from flat zero; keep opening when size unknown; idempotent half_open cash; scan options while opening; continue manage after recover.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-29 20:47:29 +08:00
parent e2a19a1614
commit 101cb3c045
6 changed files with 153 additions and 76 deletions
+17 -4
View File
@@ -556,9 +556,6 @@ class StrategyEngine:
r = await asyncio.to_thread(recover)
self._note_retry_result("opening", ok=r.ok, detail=r.detail)
if r.ok:
self._set_state(phase="idle", last_error=None)
if "half_open" in (r.detail or "") or "提升为 open" in (r.detail or ""):
pass # 继续本 tick 后续逻辑由下一轮处理
try:
from ..notify import wecom
@@ -569,6 +566,20 @@ class StrategyEngine:
)
except Exception:
pass
# 恢复后按新状态继续本 tickhalf_open/open/flat
pos = self.matcher.current_position()
st_pos = str(pos.get("status") or "flat")
if st_pos == "opening":
self._set_state(phase="opening_stuck", last_error=r.detail)
return
if st_pos == "flat":
self._set_state(phase="idle", last_error=None)
return
# half_open / open / pending:落入下方分支
self._set_state(
phase="open" if st_pos == "open" else "closing",
last_error=None,
)
else:
self._set_state(phase="opening_stuck", last_error=r.detail)
try:
@@ -581,7 +592,9 @@ class StrategyEngine:
)
except Exception:
pass
return
return
else:
return
if st_pos == "half_open":
allowed, left = self._retry_allowed("half_open")