78fd046fb6
Co-authored-by: Cursor <cursoragent@cursor.com>
87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
"""运行时交易所配置:DB 覆盖 env,切换时套用合约默认。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from ..config import EXCHANGE_MARKET_DEFAULTS, Settings, get_settings
|
|
|
|
|
|
def normalize_exchange_name(name: str | None) -> str:
|
|
n = (name or "okx").strip().lower()
|
|
if n in ("bn", "binance"):
|
|
return "binance"
|
|
return "okx"
|
|
|
|
|
|
def load_runtime_settings() -> Settings:
|
|
"""启动 / 切换后使用的有效 Settings(含 DB 覆盖)。"""
|
|
base = get_settings()
|
|
try:
|
|
from ..models.db import get_db
|
|
|
|
db = get_db()
|
|
except Exception:
|
|
return base
|
|
|
|
ex = normalize_exchange_name(db.get_setting("exchange", base.exchange))
|
|
defs = EXCHANGE_MARKET_DEFAULTS[ex]
|
|
ct_default = float(defs["option_ct_mult_default"])
|
|
raw_ct = db.get_setting("option_ct_mult_default")
|
|
if raw_ct not in (None, ""):
|
|
try:
|
|
ct_default = float(raw_ct)
|
|
except ValueError:
|
|
pass
|
|
return base.model_copy(
|
|
update={
|
|
"exchange": ex,
|
|
"perp_inst_id": str(
|
|
db.get_setting("perp_inst_id") or defs["perp_inst_id"]
|
|
),
|
|
"option_inst_family": str(
|
|
db.get_setting("option_inst_family") or defs["option_inst_family"]
|
|
),
|
|
"index_inst_id": str(
|
|
db.get_setting("index_inst_id") or defs["index_inst_id"]
|
|
),
|
|
"option_ct_mult_default": ct_default,
|
|
}
|
|
)
|
|
|
|
|
|
def persist_exchange_choice(name: str) -> Settings:
|
|
"""写入 exchange + 该所合约默认,返回 runtime settings。"""
|
|
from ..models.db import get_db
|
|
|
|
ex = normalize_exchange_name(name)
|
|
defs = EXCHANGE_MARKET_DEFAULTS[ex]
|
|
db = get_db()
|
|
db.set_setting("exchange", ex)
|
|
db.set_setting("perp_inst_id", str(defs["perp_inst_id"]))
|
|
db.set_setting("option_inst_family", str(defs["option_inst_family"]))
|
|
db.set_setting("index_inst_id", str(defs["index_inst_id"]))
|
|
db.set_setting("option_ct_mult_default", str(defs["option_ct_mult_default"]))
|
|
return load_runtime_settings()
|
|
|
|
|
|
async def reload_market_session(settings: Settings | None = None):
|
|
"""停旧会话、按 settings 重建交易所与策略会话并 start。"""
|
|
from .factory import set_exchange
|
|
from ..strategy.session import bootstrap_session, get_session, set_session
|
|
|
|
s = settings or load_runtime_settings()
|
|
old = None
|
|
try:
|
|
old = get_session()
|
|
except Exception:
|
|
old = None
|
|
if old is not None:
|
|
try:
|
|
await old.stop()
|
|
except Exception:
|
|
pass
|
|
set_session(None)
|
|
set_exchange(None)
|
|
sess = bootstrap_session(s)
|
|
await sess.start()
|
|
return sess
|