BLPAPI中如何在运行中的会话追加新订阅?是否需要终止会话重新创建?
在BLPAPI会话中追加新订阅的可行方案
先给你明确答案:完全可以在已运行的BLPAPI会话中动态追加新订阅,根本不需要终止当前会话再重新创建。SDK里的示例预先定义标的只是为了演示基础流程,实际场景完全支持动态新增订阅的需求。
具体实现思路
- 保留活跃会话:只要你的
session对象还处于连接状态(没调用session.stop()或session.close()),就可以随时调用session.subscribe()来添加新的订阅项。 - 复用现有逻辑:新增订阅的流程和初始化订阅时几乎一致——构造新的标的信息、关联ID,加入订阅集合后,再次调用
session.subscribe()即可。
基于你代码的修改示例
你可以新增一个专门处理动态订阅的函数,在会话运行过程中随时调用:
def add_new_subscription(session, p_identity, target_topic): # 可以复用原有的字段列表,也可以根据新标的调整 fieldList = [ "SUBSCRIPTION_DATA", "LAST_PRICE", "BID", "ASK", "EID", "MKTDATA_EVENT_TYPE", "MKTDATA_EVENT_SUBTYPE", "IS_DELAYED_STREAM" ] subscriptionOptions = [] # 构造新标的的关联信息 cInfo = CorrelationInfo(target_topic) cId = blpapi.CorrelationId(cInfo) # 添加到全局订阅集合 g_subscriptions.add(cInfo.getTopic(), fieldList, subscriptionOptions, cId) # 调用subscribe方法追加新订阅 session.subscribe(g_subscriptions, p_identity)
比如你需要新增"EUR CURNCY"这个标的,直接在会话运行时调用:
add_new_subscription(session, your_identity_instance, "EUR CURNCY")
几个关键注意点
- 确保调用追加订阅时,会话已经完成授权(也就是你的
processEvent已经处理完授权成功的事件),否则新订阅可能无法正常接收数据。 - 你的事件处理器
eventHandler.processEvent不需要额外修改,新增标的的市场数据会通过同样的回调流程返回,和初始订阅的处理逻辑一致即可。 - 现有订阅不会受到影响,BLPAPI会自动同时管理新旧订阅的数据流。
内容的提问来源于stack exchange,提问作者JackTheKnife
相关产品推荐
相关产品推荐

