跳转到内容

接收 IB 公告

reqNewsBulletins() 的公告通过 updateNewsBulletin() 回调返回。

def updateNewsBulletin(self, msgId, msgType, newsMessage, originExch):
...

每一条回调代表一条 IB 公告。

字段中文含义说明
msgId公告编号IB 公告的标识
msgType公告类型用数字表示类型
newsMessage公告正文公告消息内容,可能较长
originExch来源交易所公告来源交易所;没有来源时可能为空

msgId 不是请求编号。公告接口没有 reqId,所以程序不能按请求编号区分多条公告,只能按是否已经订阅公告来管理状态。

msgType含义
1普通公告
2交易所不再可用于交易
3交易所恢复可用于交易

程序里建议把类型映射成中文含义后再展示:

MSG_TYPE_LABELS = {
1: "普通公告",
2: "交易所不可用",
3: "交易所恢复可用",
}
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=True
ALL_MSGS=True
REQUEST_SENT=True
BULLETIN_CALLBACK_RECEIVED=False
BULLETIN_ROW_COUNT=0
MSG_TYPE_COUNTS=NONE
ORIGIN_EXCH_COUNTS=NONE
MESSAGE_LENGTHS=EMPTY
CANCEL_SENT=True
ROWS_BEFORE_CANCEL=0
ROWS_AFTER_CANCEL_WAIT=0
INFO_CODES=2104,2106,2158
NON_INFO_ERROR_COUNT=0
IS_CONNECTED_AFTER_DISCONNECT=False

没有收到公告时,类型分布和来源交易所分布都会是 NONE

公告订阅接口本身不带请求编号。程序通常只需要知道“是否已经订阅公告”,不需要按多个请求编号区分。

公告正文可以直接展示给用户吗?

Section titled “公告正文可以直接展示给用户吗?”

可以用于交易系统提示,但要注意它不是策略信号,也不是订单状态。展示时建议标明来源和类型。

如果连接正常、请求已发出、取消订阅也没有非信息类错误,可以按“没有可用公告”处理。不要把 0 条公告当成连接失败。

收到交易所不可用公告后要自动停单吗?

Section titled “收到交易所不可用公告后要自动停单吗?”

不要只靠公告做自动停单判断。公告可以作为风险提示,真正的下单前检查仍应依赖订单回调、错误码、交易所状态和业务风控。