请求组成交易所
reqSmartComponents() 需要一个 bboExchange 字符串。这个字符串应该来自 tickReqParams() 回调,不应该手工猜测。
app.reqSmartComponents(reqId, bboExchange)它不是普通行情请求。调用它之前通常要先用 reqMktData() 建立一档行情订阅,并在 tickReqParams() 回调里拿到非空 bboExchange。
Python 示例
Section titled “Python 示例”def tickReqParams(self, tickerId, minTick, bboExchange, snapshotPermissions): """接收一档行情请求参数,并在 bboExchange 非空时查询组成交易所。""" print("BBO_EXCHANGE=", bboExchange)
if bboExchange: self.reqSmartComponents( 97302, # reqId:组成交易所请求编号 bboExchange, # 从 tickReqParams() 拿到的 BBO 交易所代码 )| 参数 | 中文解释 | 注意事项 |
|---|---|---|
reqId | 请求编号 | 用于关联 smartComponents() 回调 |
bboExchange | BBO 交易所代码 | 应来自 tickReqParams(),不要手写猜测;为空时先处理一档行情权限或合约问题 |
tickReqParams() 字段
Section titled “tickReqParams() 字段”| 字段 | 中文解释 | 使用方式 |
|---|---|---|
tickerId | 一档行情请求编号 | 对应前面的 reqMktData() 请求 |
minTick | 最小价格变动单位 | 可用于报价显示和价格校验 |
bboExchange | SMART BBO 组成交易所代码 | 非空时传给 reqSmartComponents() |
snapshotPermissions | 快照权限位信息 | 用来判断账户对快照行情的权限范围 |
直接用猜测的 a6 请求:
app.reqSmartComponents(97302, "a6")返回:
ERROR=reqId=97302;code=321;msg=确认请求时出错。:-'V':导致- Invalid BBO exchange/security type code这不是连接失败,而是 bboExchange 对这次请求无效。
| 步骤 | 做法 |
|---|---|
| 1 | 先用可用权限的合约请求 reqMktData() |
| 2 | 在 tickReqParams() 中读取非空 bboExchange |
| 3 | 用这个值调用 reqSmartComponents() |
| 4 | 在 smartComponents() 中保存映射结果 |
如果 bboExchange 为空,先处理行情权限和合约问题,而不是继续猜代码。
完整边界输出
Section titled “完整边界输出”CONNECTED=TrueTICK_REQ_PARAMS_ROWS=1TICK_REQ_PARAMS=tickerId=97301;minTick=0.01;bboExchange=;snapshotPermissions=0SMART_COMPONENT_ROWS=0ERROR=reqId=97301;code=10089;msg=请求的市场数据对于API来说需要额外订阅。点击“市场数据连接”对话框中的链接获取更多详情。:AAPL NASDAQ.NMS/TOP/ALLERROR=reqId=97302;code=321;msg=确认请求时出错。:-'V':导致- Invalid BBO exchange/security type codeERROR=reqId=97301;code=300;msg=无法使用tickerId找到EId::97301这组输出要分开理解:
| 结果 | 含义 |
|---|---|
TICK_REQ_PARAMS_ROWS=1 | 一档行情请求已进入 TWS,且收到了请求参数回调。 |
bboExchange= | BBO 代码为空,不能继续作为有效参数传给 reqSmartComponents()。 |
10089 | 一档行情缺少 API 市场数据订阅。 |
321 | 猜测的 bboExchange 无效。 |
300 | 取消未建立成功的一档行情订阅时产生的跟随错误。 |