Files
eth_hedge_sim/scripts/smoke_market.py
T
2026-07-24 16:33:25 +08:00

76 lines
2.1 KiB
Python

#!/usr/bin/env python3
"""P0 行情连通性烟测:REST 对齐次日 ATM Call/Put,可选挂 WS 数秒。
用法(仓库根目录):
python scripts/smoke_market.py
python scripts/smoke_market.py --ws-seconds 8
"""
from __future__ import annotations
import argparse
import asyncio
import json
import sys
import time
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
BACKEND = ROOT / "backend"
sys.path.insert(0, str(BACKEND))
from app.config import get_settings # noqa: E402
from app.market import MarketGateway # noqa: E402
async def main() -> int:
parser = argparse.ArgumentParser(description="eth_hedge_sim P0 market smoke")
parser.add_argument("--ws-seconds", type=float, default=5.0, help="WS listen seconds")
args = parser.parse_args()
settings = get_settings()
print(f"MODE={settings.mode} REST={settings.okx_rest_base}")
print(f"perp={settings.perp_inst_id} family={settings.option_inst_family}")
gw = MarketGateway(settings)
t0 = time.time()
try:
pair = await asyncio.to_thread(gw.align_instruments)
except Exception as e:
print(f"FAIL align: {e}")
gw.rest.close()
return 1
print(f"aligned in {time.time() - t0:.2f}s")
print(json.dumps(pair.to_dict() if pair else None, ensure_ascii=False, indent=2))
snap = gw.snapshot_dict()
print("--- REST snapshot ---")
print(json.dumps(snap, ensure_ascii=False, indent=2))
if args.ws_seconds > 0:
print(f"--- WS listen {args.ws_seconds}s ---")
await gw.ws.start()
await asyncio.sleep(args.ws_seconds)
snap2 = gw.snapshot_dict()
print(json.dumps(snap2, ensure_ascii=False, indent=2))
await gw.ws.stop()
gw.rest.close()
ok = (
snap.get("perp", {}) or {}
).get("ask") is not None and (
snap.get("call", {}) or {}
).get("ask") is not None and (
snap.get("put", {}) or {}
).get("ask") is not None
if not ok:
print("FAIL: missing bid/ask on perp/call/put")
return 2
print("OK: market smoke passed")
return 0
if __name__ == "__main__":
raise SystemExit(asyncio.run(main()))