diff --git a/py-client/config/__init__.py b/py-client/config/__init__.py index 43e68f4..01d4b98 100644 --- a/py-client/config/__init__.py +++ b/py-client/config/__init__.py @@ -7,7 +7,7 @@ from pathlib import Path import yaml -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class SignalConfig: """单个交易信号的数据源及开仓限制配置。""" @@ -21,7 +21,7 @@ class SignalConfig: gt_last_price_is_open: bool = False -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class GlobalConfig: """所有主机共享的系统配置。""" @@ -37,7 +37,7 @@ class GlobalConfig: signals: dict[str, SignalConfig] = field(default_factory=dict) -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class AccountConfig: """当前主机所使用的账户及交易策略参数。""" diff --git a/py-client/libs/signal.py b/py-client/libs/signal.py index 2ce60a9..d0a892c 100644 --- a/py-client/libs/signal.py +++ b/py-client/libs/signal.py @@ -4,12 +4,12 @@ import secrets from .http import get_json -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class SignalItem: signal_key: str = ""; code: str = ""; name: str = ""; desc: str = ""; last_close: float = 0 tech_indicator: dict[str, float] = field(default_factory=dict) -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class SignalResult: code: str = ""; total: int = 0; updated: str = ""; data: dict[str, SignalItem] = field(default_factory=dict); message: str = "" diff --git a/py-client/sdk/models.py b/py-client/sdk/models.py index ee2c2ae..b3d02de 100644 --- a/py-client/sdk/models.py +++ b/py-client/sdk/models.py @@ -11,7 +11,7 @@ def _number(value: Any, kind: type = float) -> Any: return kind() -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class OrderItem: """由 QMT 委托明细解析得到的标准订单记录。""" id: str @@ -64,7 +64,7 @@ class OrderItem: ) -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class PositionItem: stock_code: str = "" stock_name: str = "" @@ -122,7 +122,7 @@ class PositionItem: ) -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class Assets: total: float = 0.0 available: float = 0.0 @@ -136,7 +136,7 @@ class Assets: ) -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class Portfolio: assets: Assets positions: dict[str, PositionItem] @@ -152,7 +152,7 @@ def _trade_datetime(data: dict[str, Any]) -> datetime | None: return None -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class Tick: last_price: float = 0.0 last_close: float = 0.0 @@ -169,7 +169,7 @@ class Tick: ) -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class HistoryDataRequest: length: int = 10 period: str = "" @@ -178,7 +178,7 @@ class HistoryDataRequest: skip_paused: bool = True -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class MarketDataRequest: fields: list[str] = field(default_factory=list) stocks: list[str] = field(default_factory=list) @@ -189,7 +189,7 @@ class MarketDataRequest: count: int = 0 -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class FinancialDataRequest: tabname: str = ""; colname: str = ""; market: str = ""; code: str = "" report_type: str = ""; barpos: int = 0 @@ -197,22 +197,22 @@ class FinancialDataRequest: start_date: str = ""; end_date: str = "" -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class FactorDataRequest: field_list: list[str] = field(default_factory=list); stock_list: list[str] = field(default_factory=list) stock_code: str = ""; start_date: str = ""; end_date: str = "" -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class BSMPriceRequest: option_type: str; object_prices: Any; strike_price: float; risk_free: float; sigma: float; days: int; dividend: float -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class BSMIVRequest: option_type: str; object_prices: float; strike_price: float; option_price: float; risk_free: float; days: int; dividend: float -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class LocalDataRequest: stock_code: str; start_time: str = ""; end_time: str = ""; period: str = ""; divid_type: str = ""; count: int = 0 diff --git a/py-client/strategy/trend/runtime.py b/py-client/strategy/trend/runtime.py index fcf3ce7..b137f88 100644 --- a/py-client/strategy/trend/runtime.py +++ b/py-client/strategy/trend/runtime.py @@ -14,7 +14,7 @@ from .state import State from .watch import DipWatch -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class Runtime: """集中保存趋势策略运行期间共享的依赖和状态。 diff --git a/py-client/strategy/trend/state.py b/py-client/strategy/trend/state.py index 7351e3a..4abfd29 100644 --- a/py-client/strategy/trend/state.py +++ b/py-client/strategy/trend/state.py @@ -17,7 +17,7 @@ from sdk import OrderItem, PositionItem TERMINAL_STATUSES = {"53", "54", "56", "57"} -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class StateItem: code: str base_order_id: str = "" @@ -35,7 +35,7 @@ class StateItem: return self.added_amount / self.added_qty if self.added_qty else 0.0 -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class PendingOrder: order_id: str kind: str diff --git a/py-client/strategy/trend/watch.py b/py-client/strategy/trend/watch.py index b5f3626..d883e3e 100644 --- a/py-client/strategy/trend/watch.py +++ b/py-client/strategy/trend/watch.py @@ -4,7 +4,7 @@ from datetime import datetime, timedelta from threading import Lock -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class _Entry: last_close: float expires_at: datetime diff --git a/py-client/strategy/zt/runtime.py b/py-client/strategy/zt/runtime.py index cc86012..ab685f5 100644 --- a/py-client/strategy/zt/runtime.py +++ b/py-client/strategy/zt/runtime.py @@ -11,7 +11,7 @@ from strategy.trend.watch import DipWatch from .state import TState -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class Runtime: client: Client global_cfg: GlobalConfig diff --git a/py-client/strategy/zt/state.py b/py-client/strategy/zt/state.py index 84de7b1..9f3531f 100644 --- a/py-client/strategy/zt/state.py +++ b/py-client/strategy/zt/state.py @@ -17,7 +17,7 @@ BUYING = "BUYING" DONE = "DONE" -@dataclass(slots=True) +@dataclass(frozen=True, slots=True) class TStateItem: code: str base_qty: int = 0