组成交易所
组成交易所用于解释 SMART 行情里的交易所映射。某些一档行情回调会给出一个 bboExchange 代码,程序再用 reqSmartComponents() 查询这个代码对应的交易所组成。
官方参考:Component Exchanges
它解决什么问题
Section titled “它解决什么问题”SMART 行情可能不是直接显示一个普通交易所名称,而是用 IBKR 返回的代码表示一组组成交易所。reqSmartComponents() 的作用是把这个代码转换成可读映射,方便程序知道 BBO 数据来自哪些交易所。
| 步骤 | 接口 / 回调 | 说明 |
|---|---|---|
| 1 | reqMktData() | 先请求一档行情 |
| 2 | tickReqParams() | 从回调里拿 bboExchange |
| 3 | reqSmartComponents() | 用 bboExchange 请求组成交易所 |
| 4 | smartComponents() | 接收映射结果 |
参考边界样例
Section titled “参考边界样例”请求 AAPL 一档行情时,连接正常,但账户没有对应 API 行情权限。TWS 仍返回了 tickReqParams(),只是 bboExchange 为空:
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/ALL随后直接猜测 bboExchange="a6" 请求组成交易所,TWS 返回参数错误:
ERROR=reqId=97302;code=321;msg=确认请求时出错。:-'V':导致- Invalid BBO exchange/security type codeERROR=reqId=97301;code=300;msg=无法使用tickerId找到EId::97301这说明 bboExchange 不能靠猜。正确流程是先拿到有效行情请求返回的非空 bboExchange,再请求组成交易所。
取消前面权限失败的一档行情订阅时,还可能看到 300。这通常只是前一个订阅没有真正建立导致的后续结果,根因仍然是行情权限或 bboExchange 无效。
如果只是想拿 AAPL 的最新价、买一卖一或成交量,不需要先研究组成交易所。先把一档行情权限、reqMktData()、tickPrice()、tickSize() 跑通;只有在需要解释 SMART BBO 来源时,再使用本组接口。
和普通一档行情的关系
Section titled “和普通一档行情的关系”| 问题 | 是否需要组成交易所 |
|---|---|
| 显示最新价、买一、卖一 | 通常不需要。 |
| 解释 SMART BBO 来自哪些交易所 | 需要。 |
| 排查为什么路由到了某些报价源 | 可能需要。 |
| 解决行情权限错误 | 不能直接解决,仍要处理市场数据订阅。 |