Improve hedge-plan option board: moneyness, px/sz, accounts, and denser UI.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-14 12:27:09 +08:00
parent 4df2cb4253
commit 09cd680e4a
6 changed files with 333 additions and 69 deletions
+48 -2
View File
@@ -49,7 +49,7 @@ def install_hedge_plan(app: Flask, repo_root: str, app_module: Any) -> None:
def _build_cfg(app_module: Any) -> dict[str, Any]:
from lib.exchange.okx_options_lib import build_option_chain
from lib.exchange.okx_options_lib import build_option_chain, options_header_balances
return {
"get_db": app_module.get_db,
@@ -62,6 +62,7 @@ def _build_cfg(app_module: Any) -> dict[str, Any]:
"normalize_exchange_symbol": getattr(app_module, "normalize_exchange_symbol", None),
"ensure_markets_loaded": getattr(app_module, "ensure_markets_loaded", None),
"build_option_chain": build_option_chain,
"options_header_balances": options_header_balances,
"btc_leverage": int(getattr(app_module, "BTC_LEVERAGE", 10) or 10),
"alt_leverage": int(getattr(app_module, "ALT_LEVERAGE", 5) or 5),
"full_margin_buffer": float(getattr(app_module, "FULL_MARGIN_BUFFER_RATIO", 0.98) or 0.98),
@@ -69,6 +70,8 @@ def _build_cfg(app_module: Any) -> dict[str, Any]:
"options_enabled": _env_bool("OKX_OPTIONS_ENABLED", False),
"default_underly": (os.getenv("OKX_OPTIONS_DEFAULT_UNDERLY") or "ETH").strip().upper(),
"chain_max_dte": float(os.getenv("OKX_OPTIONS_CHAIN_MAX_DTE_DAYS") or os.getenv("OKX_OPTIONS_MAX_DTE_DAYS") or "14"),
"perp_account_label": (os.getenv("OKX_ACCOUNT_LABEL") or "合约账户").strip(),
"options_account_label": (os.getenv("OKX_OPTIONS_ACCOUNT_LABEL") or "期权账户").strip(),
}
@@ -132,6 +135,9 @@ def register_hedge_plan_routes(app: Flask, cfg: dict[str, Any]) -> None:
**data,
"gates": gates,
"sizing_mode": sizing_mode,
"account_kind": "perp",
"account_label": cfg.get("perp_account_label") or "合约账户",
"account_note": "永续腿使用合约(交易)账户可用 USDT",
}
return jsonify(out)
@@ -154,7 +160,19 @@ def register_hedge_plan_routes(app: Flask, cfg: dict[str, Any]) -> None:
)
except Exception as e:
return jsonify({"ok": False, "msg": f"拉取期权链失败: {e}"}), 500
return jsonify({"ok": True, **chain, "chain_max_dte_days": cfg.get("chain_max_dte")})
opt_acct = _options_account_snapshot(cfg)
return jsonify(
{
"ok": True,
**chain,
"underlying": u,
"chain_max_dte_days": cfg.get("chain_max_dte"),
"account_kind": "options",
"account_label": cfg.get("options_account_label") or "期权账户",
"account_note": "期权腿使用期权账户(交易 USDC)",
"options_account": opt_acct,
}
)
@app.route("/api/hedge-plan/preview", methods=["POST"])
@lr
@@ -318,6 +336,34 @@ def _fetch_perp_market(cfg: dict[str, Any], base: str) -> tuple[dict[str, Any],
}, None
def _options_account_snapshot(cfg: dict[str, Any]) -> dict[str, Any]:
"""期权账户资金快照(与期权页同源: exchange_options)."""
out: dict[str, Any] = {
"label": cfg.get("options_account_label") or "期权账户",
"trading_usdc": None,
"funding_usdc": None,
"trading_usdt": None,
"funding_usdt": None,
}
ex = cfg.get("exchange_options")
hdr = cfg.get("options_header_balances")
if ex is None or not callable(hdr):
return out
try:
trading_usdc, funding_usdc, funding_usdt, trading_usdt = hdr(ex, force=False)
out.update(
{
"trading_usdc": trading_usdc,
"funding_usdc": funding_usdc,
"trading_usdt": trading_usdt,
"funding_usdt": funding_usdt,
}
)
except Exception:
pass
return out
def _sf(v: Any) -> float | None:
if v is None or v == "":
return None