from __future__ import annotations from dataclasses import dataclass, field from typing import Any def _number(value: Any, kind: type = float) -> Any: try: return kind(value or 0) except (TypeError, ValueError): return kind() @dataclass(slots=True) class Position: stock_code: str = "" stock_name: str = "" direction: Any = None volume: int = 0 open_price: float = 0.0 float_profit: float = 0.0 market_value: float = 0.0 stock_holder: str = "" frozen_volume: int = 0 can_use_volume: int = 0 on_road_volume: int = 0 yesterday_volume: int = 0 last_price: float = 0.0 profit_rate: float = 0.0 future_trade_type: Any = None expire_date: str = "" @classmethod def from_dict(cls, data: dict[str, Any], code: str = "") -> "Position": return cls( stock_code=str(data.get("StockCode") or code), stock_name=str(data.get("StockName") or ""), direction=data.get("Direction"), volume=_number(data.get("Volume"), int), open_price=_number(data.get("OpenPrice")), float_profit=_number(data.get("FloatProfit")), market_value=_number(data.get("MarketValue")), stock_holder=str(data.get("StockHolder") or ""), frozen_volume=_number(data.get("FrozenVolume"), int), can_use_volume=_number(data.get("CanUseVolume"), int), on_road_volume=_number(data.get("OnRoadVolume"), int), yesterday_volume=_number(data.get("YesterdayVolume"), int), last_price=_number(data.get("LastPrice")), profit_rate=_number(data.get("ProfitRate")), future_trade_type=data.get("FutureTradeType"), expire_date=str(data.get("ExpireDate") or ""), ) @dataclass(slots=True) class Assets: total: float = 0.0 available: float = 0.0 @dataclass(slots=True) class Tick: last_price: float = 0.0 last_close: float = 0.0 raw: dict[str, Any] = field(default_factory=dict) @dataclass(slots=True) class HistoryDataRequest: length: int = 10 period: str = "" field: str = "" dividend_type: int = 0 skip_paused: bool = True @dataclass(slots=True) class MarketDataRequest: fields: list[str] = field(default_factory=list) stocks: list[str] = field(default_factory=list) start_time: str = "" end_time: str = "" period: str = "" dividend_type: str = "" count: int = 0 @dataclass(slots=True) class FinancialDataRequest: tabname: str = ""; colname: str = ""; market: str = ""; code: str = "" report_type: str = ""; barpos: int = 0 field_list: list[str] = field(default_factory=list); stock_list: list[str] = field(default_factory=list) start_date: str = ""; end_date: str = "" @dataclass(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) class BSMPriceRequest: option_type: str; object_prices: Any; strike_price: float; risk_free: float; sigma: float; days: int; dividend: float @dataclass(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) class LocalDataRequest: stock_code: str; start_time: str = ""; end_time: str = ""; period: str = ""; divid_type: str = ""; count: int = 0