跳转到内容

请求组成交易所

reqSmartComponents() 需要一个 bboExchange 字符串。这个字符串应该来自 tickReqParams() 回调,不应该手工猜测。

app.reqSmartComponents(reqId, bboExchange)

它不是普通行情请求。调用它之前通常要先用 reqMktData() 建立一档行情订阅,并在 tickReqParams() 回调里拿到非空 bboExchange

def tickReqParams(self, tickerId, minTick, bboExchange, snapshotPermissions):
"""接收一档行情请求参数,并在 bboExchange 非空时查询组成交易所。"""
print("BBO_EXCHANGE=", bboExchange)
if bboExchange:
self.reqSmartComponents(
97302, # reqId:组成交易所请求编号
bboExchange, # 从 tickReqParams() 拿到的 BBO 交易所代码
)
参数中文解释注意事项
reqId请求编号用于关联 smartComponents() 回调
bboExchangeBBO 交易所代码应来自 tickReqParams(),不要手写猜测;为空时先处理一档行情权限或合约问题
字段中文解释使用方式
tickerId一档行情请求编号对应前面的 reqMktData() 请求
minTick最小价格变动单位可用于报价显示和价格校验
bboExchangeSMART BBO 组成交易所代码非空时传给 reqSmartComponents()
snapshotPermissions快照权限位信息用来判断账户对快照行情的权限范围

直接用猜测的 a6 请求:

app.reqSmartComponents(97302, "a6")

返回:

ERROR=reqId=97302;code=321;msg=确认请求时出错。:-'V':导致- Invalid BBO exchange/security type code

这不是连接失败,而是 bboExchange 对这次请求无效。

步骤做法
1先用可用权限的合约请求 reqMktData()
2tickReqParams() 中读取非空 bboExchange
3用这个值调用 reqSmartComponents()
4smartComponents() 中保存映射结果

如果 bboExchange 为空,先处理行情权限和合约问题,而不是继续猜代码。

CONNECTED=True
TICK_REQ_PARAMS_ROWS=1
TICK_REQ_PARAMS=tickerId=97301;minTick=0.01;bboExchange=;snapshotPermissions=0
SMART_COMPONENT_ROWS=0
ERROR=reqId=97301;code=10089;msg=请求的市场数据对于API来说需要额外订阅。点击“市场数据连接”对话框中的链接获取更多详情。:AAPL NASDAQ.NMS/TOP/ALL
ERROR=reqId=97302;code=321;msg=确认请求时出错。:-'V':导致- Invalid BBO exchange/security type code
ERROR=reqId=97301;code=300;msg=无法使用tickerId找到EId::97301

这组输出要分开理解:

结果含义
TICK_REQ_PARAMS_ROWS=1一档行情请求已进入 TWS,且收到了请求参数回调。
bboExchange=BBO 代码为空,不能继续作为有效参数传给 reqSmartComponents()
10089一档行情缺少 API 市场数据订阅。
321猜测的 bboExchange 无效。
300取消未建立成功的一档行情订阅时产生的跟随错误。