Fix trailing break-even stop loss not linked to CTP positions.

Match pending monitors to filled positions, reconcile pending on fast refresh, and refresh CTP before promote.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-29 09:26:54 +08:00
parent 45ae57ed43
commit d366344b0f
2 changed files with 32 additions and 2 deletions
+31 -1
View File
@@ -698,6 +698,26 @@ def install_trading(app, *, login_required, require_nav, get_db, get_setting, se
return row
return None
def _find_pending_monitor(conn, symbol: str, direction: str) -> Optional[dict]:
"""开仓委托 pending 仍带止损/移动保本元数据,需与 CTP 持仓关联展示。"""
direction = (direction or "long").strip().lower()
for r in conn.execute(
"SELECT * FROM trade_order_monitors WHERE status='pending' ORDER BY id DESC"
).fetchall():
row = dict(r)
if (row.get("direction") or "long") != direction:
continue
if _match_ctp_symbol(symbol, row.get("symbol") or ""):
return row
return None
def _has_pending_monitors(conn) -> bool:
return bool(
conn.execute(
"SELECT 1 FROM trade_order_monitors WHERE status='pending' LIMIT 1"
).fetchone()
)
def _revive_closed_monitor(conn, symbol: str, direction: str) -> Optional[dict]:
"""柜台仍有持仓但本地监控被误关时,恢复最近一条同品种记录。"""
direction = (direction or "long").strip().lower()
@@ -1459,6 +1479,10 @@ def install_trading(app, *, login_required, require_nav, get_db, get_setting, se
mon = mv
break
ths = _ctp_pos_to_ths_code(p) or (p.get("symbol") or "")
if not mon:
mon = _find_pending_monitor(
conn, ths, p.get("direction") or "long",
)
if mon and not fast:
_sync_monitor_from_ctp(
conn, int(mon["id"]), mon.get("symbol") or ths,
@@ -1495,8 +1519,9 @@ def install_trading(app, *, login_required, require_nav, get_db, get_setting, se
mode = get_trading_mode(get_setting)
ctp_st = ctp_status(mode)
capital = _capital(conn)
if ctp_st.get("connected") and not fast:
if ctp_st.get("connected") and (not fast or _has_pending_monitors(conn)):
_reconcile_pending(conn, mode, capital=capital)
if ctp_st.get("connected") and not fast:
_sync_trade_monitors_with_ctp(conn, mode)
rows = _build_trading_live_rows(conn, fast=fast)
active_orders = _build_active_orders(
@@ -2281,6 +2306,11 @@ def install_trading(app, *, login_required, require_nav, get_db, get_setting, se
order_price=price,
)
conn.commit()
try:
with _ctp_td_lock:
get_bridge().refresh_positions()
except Exception:
pass
_reconcile_pending(conn, mode, capital=_capital(conn))
st_row = conn.execute(
"SELECT status FROM trade_order_monitors WHERE id=?", (mid,),