接收 IB 公告
reqNewsBulletins() 的公告通过 updateNewsBulletin() 回调返回。
def updateNewsBulletin(self, msgId, msgType, newsMessage, originExch): ...每一条回调代表一条 IB 公告。
| 字段 | 中文含义 | 说明 |
|---|---|---|
msgId | 公告编号 | IB 公告的标识 |
msgType | 公告类型 | 用数字表示类型 |
newsMessage | 公告正文 | 公告消息内容,可能较长 |
originExch | 来源交易所 | 公告来源交易所;没有来源时可能为空 |
msgId 不是请求编号。公告接口没有 reqId,所以程序不能按请求编号区分多条公告,只能按是否已经订阅公告来管理状态。
msgType 类型
Section titled “msgType 类型”msgType | 含义 |
|---|---|
1 | 普通公告 |
2 | 交易所不再可用于交易 |
3 | 交易所恢复可用于交易 |
程序里建议把类型映射成中文含义后再展示:
MSG_TYPE_LABELS = { 1: "普通公告", 2: "交易所不可用", 3: "交易所恢复可用",}结构化处理示例
Section titled “结构化处理示例”def updateNewsBulletin(self, msgId, msgType, newsMessage, originExch): row = { "msgId": msgId, "msgType": msgType, "msgTypeLabel": MSG_TYPE_LABELS.get(msgType, "未知类型"), "message": newsMessage, "originExchange": originExch or "", }如果用于公开调试输出,不建议直接打印完整公告正文,可以先输出长度和类型统计:
safe_row = { "msgId": msgId, "msgType": msgType, "messageLength": len(newsMessage or ""), "originExchange": originExch or "EMPTY",}CONNECTED=TrueALL_MSGS=TrueREQUEST_SENT=TrueBULLETIN_CALLBACK_RECEIVED=FalseBULLETIN_ROW_COUNT=0MSG_TYPE_COUNTS=NONEORIGIN_EXCH_COUNTS=NONEMESSAGE_LENGTHS=EMPTYCANCEL_SENT=TrueROWS_BEFORE_CANCEL=0ROWS_AFTER_CANCEL_WAIT=0INFO_CODES=2104,2106,2158NON_INFO_ERROR_COUNT=0IS_CONNECTED_AFTER_DISCONNECT=False没有收到公告时,类型分布和来源交易所分布都会是 NONE。
为什么没有 reqId?
Section titled “为什么没有 reqId?”公告订阅接口本身不带请求编号。程序通常只需要知道“是否已经订阅公告”,不需要按多个请求编号区分。
公告正文可以直接展示给用户吗?
Section titled “公告正文可以直接展示给用户吗?”可以用于交易系统提示,但要注意它不是策略信号,也不是订单状态。展示时建议标明来源和类型。
没有公告回调怎么处理?
Section titled “没有公告回调怎么处理?”如果连接正常、请求已发出、取消订阅也没有非信息类错误,可以按“没有可用公告”处理。不要把 0 条公告当成连接失败。
收到交易所不可用公告后要自动停单吗?
Section titled “收到交易所不可用公告后要自动停单吗?”不要只靠公告做自动停单判断。公告可以作为风险提示,真正的下单前检查仍应依赖订单回调、错误码、交易所状态和业务风控。