import { useEffect, useState } from "react"; import { apiFetch, MarketSnapshot } from "../api/client"; function fmt(n: number | null | undefined, d = 2) { if (n == null || Number.isNaN(n)) return "—"; return n.toFixed(d); } export default function PlanPage() { const [snap, setSnap] = useState(null); const [err, setErr] = useState(""); useEffect(() => { let alive = true; const load = async () => { try { const data = await apiFetch("/api/market/snapshot"); if (alive) { setSnap(data); setErr(""); } } catch (e) { if (alive) setErr(e instanceof Error ? e.message : String(e)); } }; load(); const t = window.setInterval(load, 2000); return () => { alive = false; window.clearInterval(t); }; }, []); const bias = snap?.ask_compare?.bias; const biasTag = bias === "call_ask_gt_put" ? ( Call卖一 > Put卖一 → 永续多+期权空 ) : bias === "put_ask_gt_call" ? ( Put卖一 > Call卖一 → 永续空+期权多 ) : ( 等待 / 相等 ); return (

自动对冲计划

P0 行情只读 · 策略开平仓待拍板后接入

{err ?
{err}
: null}
模式 SIM · 测试环境
行情连接 {snap?.connected ? "WS 已连接" : "REST/未连"}
指数 {fmt(snap?.index_px)}
选约 {snap?.pair ? `${snap.pair.expiry_ymd} @ ${snap.pair.strike}` : "—"}
选向 {biasTag}

永续 ETH-USDT-SWAP

买一 {fmt(snap?.perp?.bid)} × {fmt(snap?.perp?.bid_sz, 2)}
卖一 {fmt(snap?.perp?.ask)} × {fmt(snap?.perp?.ask_sz, 2)}
标记 {fmt(snap?.perp?.mark_px)}

期权 ATM

Call 卖一 {fmt(snap?.call?.ask)} / 买一 {fmt(snap?.call?.bid)}
Put 卖一 {fmt(snap?.put?.ask)} / 买一 {fmt(snap?.put?.bid)}
Call {snap?.pair?.call_inst_id || "—"}
Put {snap?.pair?.put_inst_id || "—"}
); }