IB API - 如果没有收到数据则取消历史市场数据请求

IB API - Cancel historic market data request if no data received

我正在请求几只股票的历史市场数据。我经常遇到这样的问题,即我在股票代码列表中的循环在某个点停止并且不再继续。在这种特定情况下,也没有收到我可以做出反应的错误代码。

我的代码如下:

from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.common import BarData

for i in range(len(df)):

        class MyWrapper(EWrapper):

            def nextValidId(self, orderId:int):
                self.nextValidOrderId = orderId
                self.start()

            def historicalData(self, reqId:int, bar: BarData):
                print("HistoricalData. ReqId:", reqId, "BarData.", bar)

            def error(self, reqId, errorCode, errorString):

                print("Error. Id: " , reqId, " Code: " , errorCode , " Msg: " , errorString)

                if errorCode == 200 or errorCode == 162:
                    app.disconnect()

            def historicalDataEnd(self, reqId: int, start: str, end: str):
                app.disconnect()

            def start(self):
                queryTime = df.iloc[i]["Date"]
                contract = Contract()
                contract.symbol = df.iloc[i]["IBS"]
                contract.secType = 'STK'
                contract.exchange = 'IBIS'
                contract.currency = "EUR"

                app.reqHistoricalData(4102, contract, queryTime,"1 D", "1 day", "MIDPOINT", 1, 1, False, [])

        app = EClient(MyWrapper())
        app.connect("127.0.0.1", 7497, clientId=123) 
        app.run() 

我发现问题可能出在我查询股票历史数据的时间早于它可用的时间。一个示例是代码 ID“14D1”,其历史数据为 08/20/2021(2021 年 8 月 20 日)。在 TWS 中,我看到没有早于 2021 年 5 月 10 日的历史数据,但是在请求比该数据更早的数据时我没有收到错误消息,代码一直运行而没有结果。

由于我无法对给出的任何错误消息做出反应,我想我需要一些东西,如果代码花费的时间太长(比如超过几秒钟)。或者接收股票最新历史数据点的命令,以便我可以调整我的 queryTime 请求。

如有任何帮助,我们将不胜感激!

我想我找到了解决这个问题的方法:

在 IB APU 中,有一个功能可以为您提供股票的最后可用数据点。你可以在这里找到它:

https://interactivebrokers.github.io/tws-api/head_timestamp.html#reqHeadTimeStamp

它允许您跳过在您请求的日期没有数据的股票,这正是我需要的。