fix bug
This commit is contained in:
@@ -14,6 +14,7 @@ def _number(value: Any, kind: type = float) -> Any:
|
||||
@dataclass(slots=True)
|
||||
class OrderItem:
|
||||
"""由 QMT 委托明细解析得到的标准订单记录。"""
|
||||
|
||||
id: str
|
||||
code: str
|
||||
side: str
|
||||
@@ -64,11 +65,74 @@ class OrderItem:
|
||||
)
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class DealItem:
|
||||
"""由 QMT Deal 成交对象解析得到的标准成交记录。"""
|
||||
|
||||
id: str
|
||||
order_id: str
|
||||
code: str
|
||||
side: str
|
||||
remark: str
|
||||
traded_at: datetime | None
|
||||
volume: int
|
||||
price: float
|
||||
amount: float
|
||||
local_order_id: str = ""
|
||||
order_ref: str = ""
|
||||
exchange_id: str = ""
|
||||
name: str = ""
|
||||
account_id: str = ""
|
||||
commission: float = 0.0
|
||||
trade_date: str = ""
|
||||
trade_time: str = ""
|
||||
|
||||
@classmethod
|
||||
def from_trade_detail(cls, data: dict[str, Any]) -> "DealItem":
|
||||
"""从 TradeDetailData 的 QMT Deal 原始字段创建成交记录。"""
|
||||
instrument_id = str(data.get("m_strInstrumentID") or "")
|
||||
exchange_id = str(data.get("m_strExchangeID") or "")
|
||||
code = (
|
||||
f"{instrument_id}.{exchange_id}"
|
||||
if instrument_id and exchange_id
|
||||
else instrument_id
|
||||
)
|
||||
remark = str(data.get("m_strRemark") or "")
|
||||
trade_date = str(data.get("m_strTradeDate") or "")
|
||||
trade_time = str(data.get("m_strTradeTime") or "")
|
||||
return cls(
|
||||
id=str(data.get("m_strTradeID") or ""),
|
||||
order_id=str(data.get("m_strOrderSysID") or ""),
|
||||
code=code,
|
||||
side={"23": "BUY", "24": "SELL", "48": "BUY", "49": "SELL"}.get(
|
||||
str(data.get("m_nOffsetFlag")), ""
|
||||
),
|
||||
remark=remark,
|
||||
traded_at=_parse_datetime(trade_date, trade_time),
|
||||
volume=_number(data.get("m_nVolume"), int),
|
||||
price=_number(data.get("m_dPrice")),
|
||||
amount=_number(data.get("m_dTradeAmount")),
|
||||
local_order_id=remark.split("|", 1)[0] if remark else "",
|
||||
order_ref=str(data.get("m_strOrderRef") or ""),
|
||||
exchange_id=exchange_id,
|
||||
name=str(data.get("m_strInstrumentName") or ""),
|
||||
account_id=str(data.get("m_strAccountID") or ""),
|
||||
commission=_number(
|
||||
data.get(
|
||||
"m_dCommission",
|
||||
data.get("m_dComission", data.get("m_dComssion")),
|
||||
)
|
||||
),
|
||||
trade_date=trade_date,
|
||||
trade_time=trade_time,
|
||||
)
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class PositionItem:
|
||||
stock_code: str = ""
|
||||
stock_name: str = ""
|
||||
trade_id:str = ""
|
||||
trade_id: str = ""
|
||||
direction: Any = None
|
||||
volume: int = 0
|
||||
open_cost: float = 0.0
|
||||
@@ -88,15 +152,24 @@ class PositionItem:
|
||||
@classmethod
|
||||
def from_dict(cls, data: dict[str, Any], code: str = "") -> "PositionItem":
|
||||
return cls(
|
||||
stock_code=str(data.get("StockCode") or code), stock_name=str(data.get("StockName") or ""),
|
||||
trade_id=str(data.get("TradeID") or ""),open_cost=_number(data.get("OpenCost")),
|
||||
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 ""),
|
||||
stock_code=str(data.get("StockCode") or code),
|
||||
stock_name=str(data.get("StockName") or ""),
|
||||
trade_id=str(data.get("TradeID") or ""),
|
||||
open_cost=_number(data.get("OpenCost")),
|
||||
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 ""),
|
||||
)
|
||||
|
||||
@classmethod
|
||||
@@ -146,8 +219,14 @@ class Portfolio:
|
||||
|
||||
|
||||
def _trade_datetime(data: dict[str, Any]) -> datetime | None:
|
||||
date = str(data.get("m_strInsertDate") or "")
|
||||
clock = str(data.get("m_strInsertTime") or "").replace(":", "").zfill(6)
|
||||
return _parse_datetime(
|
||||
str(data.get("m_strInsertDate") or ""),
|
||||
str(data.get("m_strInsertTime") or ""),
|
||||
)
|
||||
|
||||
|
||||
def _parse_datetime(date: str, clock: str) -> datetime | None:
|
||||
clock = clock.replace(":", "").zfill(6)
|
||||
try:
|
||||
return datetime.strptime(date + clock, "%Y%m%d%H%M%S")
|
||||
except ValueError:
|
||||
@@ -165,8 +244,12 @@ class Tick:
|
||||
if not isinstance(data, dict):
|
||||
return cls()
|
||||
return cls(
|
||||
last_price=_number(data.get("lastPrice", data.get("last_price", data.get("LastPrice")))),
|
||||
last_close=_number(data.get("lastClose", data.get("last_close", data.get("LastClose")))),
|
||||
last_price=_number(
|
||||
data.get("lastPrice", data.get("last_price", data.get("LastPrice")))
|
||||
),
|
||||
last_close=_number(
|
||||
data.get("lastClose", data.get("last_close", data.get("LastClose")))
|
||||
),
|
||||
raw=data,
|
||||
)
|
||||
|
||||
@@ -193,28 +276,54 @@ class MarketDataRequest:
|
||||
|
||||
@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 = ""
|
||||
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 = ""
|
||||
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
|
||||
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
|
||||
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
|
||||
stock_code: str
|
||||
start_time: str = ""
|
||||
end_time: str = ""
|
||||
period: str = ""
|
||||
divid_type: str = ""
|
||||
count: int = 0
|
||||
|
||||
Reference in New Issue
Block a user