add launcher
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
"""策略单次运行所需的公共上下文对象。"""
|
||||
|
||||
import logging
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from dataclasses import dataclass
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
from config import AccountConfig, GlobalConfig
|
||||
from config import AccountConfig, GlobalConfig, HTTP_TIMEOUT
|
||||
from sdk import Client
|
||||
from libs.grid_take_profit import GridTrailingTracker
|
||||
from libs.http import get_json
|
||||
from libs.order import OrderBook
|
||||
from libs.watch import DipWatch
|
||||
|
||||
@@ -22,3 +24,23 @@ class Runtime:
|
||||
add_watch: DipWatch
|
||||
profit_tracker: GridTrailingTracker
|
||||
executor: ThreadPoolExecutor | None = None
|
||||
server_inital: dict[str, list[str]] = field(init=False)
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
"""读取服务端初始化数据,失败时保留空证券列表。"""
|
||||
self.server_inital = {"all_codes": [], "today_pass_codes": []}
|
||||
try:
|
||||
url = f"{self.global_cfg.api_host.rstrip('/')}/a/initial"
|
||||
payload = get_json(url, HTTP_TIMEOUT)
|
||||
if not isinstance(payload, dict) or str(payload.get("code")) != "0":
|
||||
raise ValueError(f"服务端初始化响应失败: {payload!r}")
|
||||
data = payload.get("data")
|
||||
if not isinstance(data, dict):
|
||||
raise ValueError("服务端初始化 data 必须为对象")
|
||||
for key in ("all_codes", "today_pass_codes"):
|
||||
codes = data.get(key)
|
||||
if not isinstance(codes, list) or not all(isinstance(code, str) for code in codes):
|
||||
raise ValueError(f"服务端初始化 {key} 必须为字符串列表")
|
||||
self.server_inital = data
|
||||
except Exception:
|
||||
logging.exception("[初始化] 获取服务端初始化数据失败")
|
||||
|
||||
Reference in New Issue
Block a user