跳转到内容

接收组成交易所

smartComponents()reqSmartComponents() 的回调,用来返回 BBO 代码对应的组成交易所映射。

def smartComponents(self, reqId, smartComponentMap):
"""接收 SMART 组成交易所映射。"""
for bit_number, exchange, exchange_letter in smartComponentMap:
print(
reqId, # 请求编号
bit_number, # 交易所位编号
exchange, # 交易所名称或代码
exchange_letter, # 交易所字母标识
)
字段中文解释使用建议
reqId请求编号。对应 reqSmartComponents() 传入的编号。
bit_number交易所位编号,通常用于映射。保存原值,不要把它当交易所排序。
exchange交易所名称或代码。可用于展示和排查 SMART BBO 来源。
exchange_letter交易所字母标识。保存原值,不要自行翻译或重编码。
字段建议
bboExchange和映射结果一起保存,方便后续复用
exchange用作展示或排查
exchange_letter保留原始值,不要自行翻译
updated_at记录映射获取时间

如果请求前没有拿到有效 bboExchange,或者账户行情权限不足,可能收不到 smartComponents()。AAPL 参考输出如下:

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

遇到这种情况,应先回到一档行情请求,确认 tickReqParams() 中的 bboExchange 是否非空,再排查组成交易所接口本身。

smart_component_rows = []
def smartComponents(self, reqId, smartComponentMap):
for bit_number, exchange, exchange_letter in smartComponentMap:
row = {
"reqId": reqId,
"bitNumber": bit_number,
"exchange": exchange,
"exchangeLetter": exchange_letter,
}
smart_component_rows.append(row)

这类映射数据变化频率不高,可以作为参考表保存。真正的一档报价仍然来自 tickPrice()tickSize()tickString() 等行情回调。