使用Interactive Brokers API获取VIX期货实时数据失败求助
使用Interactive Brokers API获取VIX期货实时数据返回None的问题排查
我在使用Interactive Brokers API获取VIX期货实时数据时遇到问题,获取指数或ETF数据正常,但运行以下代码后输出为none,无法得到预期的价格数值,请求协助排查。
# Get VIX M1 #added 3/30/2023 try: VIX_CELL_M1='D58' class IBapi(EWrapper, EClient): def __init__(self): EClient.__init__(self, self) self.data = [] def tickPrice(self, reqId, tickType, price, attrib): if tickType == 4: # Last Price self.data.append([datetime.datetime.now().strftime("%Y%m%d %H:%M:%S"), price]) def run_loop(): app.run() app = IBapi() app.connect("127.0.0.1", 7496, 123) contract = Contract() contract.symbol = "VXJ3" contract.secType = "FUT" contract.exchange = "CFE" contract.currency = "USD" contract.lastTradeDateOrContractMonth = "20230418" app.reqMarketDataType(3) latest_vix_price_M1=app.reqMktData(1, contract, "", False, False, []) print(latest_vix_price_M1)
问题原因及修正方案
reqMktData不返回数据:这个方法仅向IB服务器发送数据请求,本身不会返回价格,直接赋值给变量自然得到None,价格数据需要通过tickPrice回调函数接收- 未启动事件循环:IB API依赖事件循环处理回调,发送请求后必须调用
run_loop(),否则无法接收服务器返回的数据 - 缺失模块导入:代码使用了
datetime但未导入,需要在开头添加import datetime - 回调未关联请求ID:如果存在多个数据请求,需在
tickPrice里判断reqId对应到目标VIX请求(这里是1),避免数据混淆 - 缺少等待逻辑:发送请求后需要给服务器响应时间,不能立刻打印数据,可使用
time.sleep()或等待回调触发后再输出
修正后的示例代码
import datetime import time from ibapi.client import EClient from ibapi.wrapper import EWrapper from ibapi.contract import Contract # Get VIX M1 #added 3/30/2023 VIX_CELL_M1='D58' class IBapi(EWrapper, EClient): def __init__(self): EClient.__init__(self, self) self.latest_vix_price = None def tickPrice(self, reqId, tickType, price, attrib): # 只处理VIX请求的回调(reqId=1)和最新成交价(tickType=4) if reqId == 1 and tickType == 4: self.latest_vix_price = price print(f"当前VIX期货价格: {price}") # 拿到数据后断开连接 self.disconnect() def run_loop(): app.run() app = IBapi() app.connect("127.0.0.1", 7496, 123) # 定义VIX期货合约 contract = Contract() contract.symbol = "VXJ3" contract.secType = "FUT" contract.exchange = "CFE" contract.currency = "USD" contract.lastTradeDateOrContractMonth = "20230418" # 请求实时数据(市场数据类型3=实时) app.reqMarketDataType(3) app.reqMktData(1, contract, "", False, False, []) # 启动事件循环,同时等待回调 import threading api_thread = threading.Thread(target=run_loop, daemon=True) api_thread.start() # 等待获取数据,最多等5秒 time.sleep(5) # 打印最终获取到的价格 print(f"最终获取的VIX期货价格: {app.latest_vix_price}")
内容的提问来源于stack exchange,提问作者Vittorio Manente
相关产品推荐
相关产品推荐

