跳转到内容

接收行情类型

marketDataType() 用来告诉程序某个行情订阅实际使用的行情类型。它按 reqId 返回,因为每个行情请求都可能处于不同状态。

官方参考:Market Data Types

def marketDataType(self, reqId, marketDataType):
print(reqId, marketDataType)
参数类型中文含义说明
reqIdint行情请求编号对应 reqMktData() 传入的编号。
marketDataTypeint实际行情类型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 已经判断了该订阅的行情类型,不代表一定会收到价格。

延迟快照的典型回调:

MARKET_DATA_TYPE=reqId=95253;name=delayed_snapshot;marketDataType=3
PRICE=reqId=95253;name=delayed_snapshot;tickType=68;price=291.52
PRICE=reqId=95253;name=delayed_snapshot;tickType=72;price=297.14
SIZE=reqId=95253;name=delayed_snapshot;tickType=71;size=66
SNAPSHOT_ENDS=95253

应按下面顺序判断:

检查项判断
是否收到 marketDataType()收到说明请求进入了行情类型判断。
是否收到 tickPrice() / tickSize()收到后再按 tickType 映射成买价、卖价、最新价、成交量等字段。
是否收到 10089对应市场数据需要额外订阅或授权。
是否收到 10167没有实时订阅,但 TWS 正在显示延迟行情。
是否收到 200合约字段无法识别,先修合约定义。
是否取消失败请求后收到 300常见于请求没有建立成功,取消时 TWS 找不到 tickerId。

一个请求可能不止一次触发 marketDataType()。例如延迟冻结快照可能先显示为延迟行情,再根据市场状态或 TWS 判断切换为延迟冻结行情。本机样本中这次只返回了 3

MARKET_DATA_TYPE=reqId=95224;name=delayed_frozen_snapshot;marketDataType=3
ERROR=reqId=95224;name=delayed_frozen_snapshot;code=10167;msg=请求的市场数据没有订阅。显示延迟市场数据。

程序界面建议把同一个 reqIdmarketDataType()tickPrice()tickSize()error() 放在同一条请求记录里。这样用户看到 marketDataType=3、价格字段和 10167 时,就能理解:请求已经到达 TWS,实时行情没有订阅,延迟行情正在返回。