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:
@@ -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
|
||||
# 恢复后按新状态继续本 tick(half_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")
|
||||
|
||||
Reference in New Issue
Block a user