fix(hub): merge mark price from Flask snapshot and fix board refresh

Sync hub positions with instance price_snapshot (order_prices and position_marks).
Fix monitor board UI when hub restarts (version rewind) and queue snapshot fetches.
Expose board aggregate status on /api/ping for diagnostics.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-03 22:44:01 +08:00
parent 2a9602610e
commit d07357b98e
9 changed files with 275 additions and 31 deletions
+3 -23
View File
@@ -31,6 +31,7 @@ _REPO_ROOT = Path(__file__).resolve().parents[1]
if str(_REPO_ROOT) not in sys.path:
sys.path.insert(0, str(_REPO_ROOT))
from hub_ohlcv_lib import format_price_by_tick, price_tick_from_market
from hub_position_metrics import parse_position_mark_price
import ccxt
from fastapi import FastAPI, Header, HTTPException, Request
@@ -409,29 +410,8 @@ def _position_entry_price(p: dict[str, Any]) -> float | None:
def _position_mark_price(p: dict[str, Any]) -> float | None:
"""四所 ccxt 持仓统一解析标记价(用于强平/浮盈计算)。"""
info = p.get("info") or {}
if not isinstance(info, dict):
info = {}
for key in (
p.get("markPrice"),
p.get("mark_price"),
p.get("mark"),
info.get("markPx"),
info.get("mark_price"),
info.get("markPrice"),
info.get("last"),
info.get("lastPrice"),
):
px = _finite_or_none(key)
if px is not None and px > 0:
return px
contracts = _position_contracts(p)
if abs(contracts) >= 1e-12:
notional = _finite_or_none(p.get("notional"))
if notional is not None and abs(notional) > 0:
return abs(notional) / abs(contracts)
return None
"""四所 ccxt 持仓统一解析标记价(与实例 parse_ccxt_position_metrics 一致)。"""
return parse_position_mark_price(p)
def _ticker_mark_price(ex: Any, symbol: str) -> float | None: