44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
"""冒烟:拉一次 OKX 指数 + 选 ATM 并打印(不强制写库)。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(ROOT))
|
|
os.chdir(ROOT)
|
|
|
|
from apps.collector.okx_rest import OkxRestClient
|
|
from apps.collector.selectors import rows_to_contracts, select_atm_pair
|
|
from packages.config import get_settings
|
|
from packages.domain import option_leverage
|
|
|
|
|
|
def main() -> int:
|
|
s = get_settings()
|
|
with OkxRestClient(base_url=s.okx_base_url, proxy=s.okx_proxy or None) as client:
|
|
idx = client.fetch_index_ticker(s.index_inst_id)
|
|
print(f"index {s.index_inst_id} = {idx}")
|
|
raw = client.fetch_option_instruments(s.option_inst_family)
|
|
contracts = rows_to_contracts(raw)
|
|
print(f"live contracts = {len(contracts)}")
|
|
pair = select_atm_pair(contracts, index_px=float(idx or 0), min_hours=s.min_option_hours)
|
|
if not pair:
|
|
print("no ATM pair")
|
|
return 1
|
|
print(
|
|
f"ATM expiry={pair.expiry_ymd} strike={pair.strike} "
|
|
f"C={pair.call_inst_id} P={pair.put_inst_id}"
|
|
)
|
|
for side, inst in (("C", pair.call_inst_id), ("P", pair.put_inst_id)):
|
|
ask, bid, *_ = client.fetch_books(inst)
|
|
lev = option_leverage(float(idx), ask)
|
|
print(f" {side}: ask={ask} bid={bid} leverage={lev}")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|