IG Lightstreamer服务器始终每秒推送更新,无法按指定间隔获取K线数据
IG Lightstreamer服务器始终每秒推送更新,无法按指定间隔获取K线数据
我之前用Python对接IG的Lightstreamer获取K线数据时也遇到过一模一样的问题!当时折腾了好一阵子才找到原因,给你几个排查和解决的方向:
- 先修正代码的类定义顺序:你的代码里
SubListener类是在创建订阅之后才定义的,这在Python中会直接抛出NameError(除非你实际运行的代码顺序不是这样)。正确的做法是先定义监听器类,再创建它的实例添加到订阅中,不然代码根本跑不起来。调整后的基础代码结构如下:
from lightstreamer.client import * loggerProvider = ConsoleLoggerProvider(ConsoleLogLevel.WARN) LightstreamerClient.setLoggerProvider(loggerProvider) # 先定义监听器类 class SubListener: def onItemUpdate(self, update): # 后续添加过滤逻辑 print(update.getValue("BID_CLOSE")) ls_client = LightstreamerClient("https://demo-apd.marketdatasystems.com", None) ls_client.connectionDetails.setUser("...") ls_client.connectionDetails.setPassword("...") ls_client.connect() subscription = Subscription( mode="MERGE", items=["CHART:CS.D.BITCOIN.CFD.IP:1MINUTE"], fields=["BID_CLOSE", "CONFIRMED", "TIMESTAMP"]) # 补充关键字段 subscription.addListener(SubListener()) # 请求快照,确保初始能拿到最新的已确认K线 subscription.setRequestedSnapshot("YES") ls_client.subscribe(subscription) input() ls_client.unsubscribe(subscription) ls_client.disconnect()
- 核心问题:区分实时中间数据和已确认K线:你看到的每秒更新其实是当前正在形成的K线的实时中间数据,而不是完整的分钟级K线。IG的CHART类item在MERGE模式下会实时推送当前K线的最新bid/ask价格,只有当K线周期结束时,服务器才会将该K线标记为已确认(
CONFIRMED字段值为1)。而IG的Streaming Companion默认只展示已确认的完整K线,所以你看到的是每分钟更新一次。
要过滤出真正的分钟级K线数据,只需在监听器里判断CONFIRMED字段的值:
class SubListener: def onItemUpdate(self, update): # 仅处理已确认的完整K线 if update.getValue("CONFIRMED") == "1": close_price = update.getValue("BID_CLOSE") timestamp = update.getValue("TIMESTAMP") print(f"已确认的1分钟K线收盘价: {close_price},时间戳: {timestamp}")
- 额外优化:请求初始快照:通过
subscription.setRequestedSnapshot("YES")让服务器在连接成功后推送最新的一条已确认K线,避免错过订阅前已经生成的K线数据。
这样调整后,你应该就能只收到每分钟一次的完整K线更新了,和Streaming Companion的表现完全一致。
备注:内容来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

