Add Binance SIM market adapter and exchange switch in settings.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
"""运行时交易所配置: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
|
||||
Reference in New Issue
Block a user