我正在请求几只股票的历史市场数据。我经常遇到这样的问题,我在股票代码列表中的循环在某个点停止,不再继续。在这种特定的情况下,我也没有收到可以做出反应的错误代码。
我的代码如下:
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()
我发现问题可能是,我查询股票的历史数据的时间早于可用时间。这方面的一个例子是ticker ID"1";14D1";2021年8月20日的历史数据(20。2021年8月(。在TWS中,我看到没有早于2021年5月10日的历史数据,但在请求早于该数据的数据时,我没有收到错误消息,代码只是永远运行而没有结果。
由于我无法对给出的任何错误消息做出反应,我想如果代码占用的时间太长(比如几秒钟以上(,我需要一些东西来允许我的代码继续到数据帧中的下一个ticker ID。或者一个接收股票最新历史数据点的命令,这样我就可以调整我的queryTime请求。
如有任何帮助,我们将不胜感激!
我想我找到了这个问题的解决方案:
在IB APU中,有一个可用的功能可以为您提供股票的最后可用数据点。你可以在这里找到:
https://interactivebrokers.github.io/tws-api/head_timestamp.html#reqHeadTimeStamp
它可以让你跳过一只没有你要求的日期数据的股票,这正是我所需要的。