接收行情类型
marketDataType() 用来告诉程序某个行情订阅实际使用的行情类型。它按 reqId 返回,因为每个行情请求都可能处于不同状态。
官方参考:Market Data Types
def marketDataType(self, reqId, marketDataType): print(reqId, marketDataType)| 参数 | 类型 | 中文含义 | 说明 |
|---|---|---|---|
reqId | int | 行情请求编号 | 对应 reqMktData() 传入的编号。 |
marketDataType | int | 实际行情类型 | 1 实时,2 冻结,3 延迟,4 延迟冻结。 |
class MarketDataTypeApp(EWrapper, EClient): def __init__(self): EClient.__init__(self, self) self.market_data_types = {} self.errors = []
def marketDataType(self, reqId, marketDataType): # 同一个 reqId 可能多次回调,保存最后一次状态。 self.market_data_types[reqId] = marketDataType
def tickPrice(self, reqId, tickType, price, attrib): print("价格:", reqId, tickType, price)
def tickSize(self, reqId, tickType, size): print("数量:", reqId, tickType, size)
def tickSnapshotEnd(self, reqId): print("快照结束:", reqId)
def error(self, reqId, errorTime, errorCode, errorString, advancedOrderRejectJson=""): self.errors += [(reqId, errorCode, errorString)]| 回调 | 说明 |
|---|---|
marketDataType() | 告诉你该订阅实际使用哪种行情类型。 |
tickPrice() | 返回价格字段,例如买价、卖价、最新价、最高价、最低价。 |
tickSize() | 返回数量字段,例如买量、卖量、成交量。 |
tickString() | 返回字符串字段,例如部分成交明细或时间字段。 |
tickSnapshotEnd() | 快照请求结束。 |
error() | 权限、合约、请求或取消错误。 |
marketDataType() 不是价格回调。收到它只能说明 TWS 已经判断了该订阅的行情类型,不代表一定会收到价格。
同时看行情类型和价格字段
Section titled “同时看行情类型和价格字段”延迟快照的典型回调:
MARKET_DATA_TYPE=reqId=95253;name=delayed_snapshot;marketDataType=3PRICE=reqId=95253;name=delayed_snapshot;tickType=68;price=291.52PRICE=reqId=95253;name=delayed_snapshot;tickType=72;price=297.14SIZE=reqId=95253;name=delayed_snapshot;tickType=71;size=66SNAPSHOT_ENDS=95253应按下面顺序判断:
| 检查项 | 判断 |
|---|---|
是否收到 marketDataType() | 收到说明请求进入了行情类型判断。 |
是否收到 tickPrice() / tickSize() | 收到后再按 tickType 映射成买价、卖价、最新价、成交量等字段。 |
是否收到 10089 | 对应市场数据需要额外订阅或授权。 |
是否收到 10167 | 没有实时订阅,但 TWS 正在显示延迟行情。 |
是否收到 200 | 合约字段无法识别,先修合约定义。 |
是否取消失败请求后收到 300 | 常见于请求没有建立成功,取消时 TWS 找不到 tickerId。 |
多次回调怎么处理
Section titled “多次回调怎么处理”一个请求可能不止一次触发 marketDataType()。例如延迟冻结快照可能先显示为延迟行情,再根据市场状态或 TWS 判断切换为延迟冻结行情。本机样本中这次只返回了 3:
MARKET_DATA_TYPE=reqId=95224;name=delayed_frozen_snapshot;marketDataType=3ERROR=reqId=95224;name=delayed_frozen_snapshot;code=10167;msg=请求的市场数据没有订阅。显示延迟市场数据。程序界面建议把同一个 reqId 的 marketDataType()、tickPrice()、tickSize() 和 error() 放在同一条请求记录里。这样用户看到 marketDataType=3、价格字段和 10167 时,就能理解:请求已经到达 TWS,实时行情没有订阅,延迟行情正在返回。