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
它允许您跳过在您请求的日期没有数据的股票,这正是我需要的。
我正在请求几只股票的历史市场数据。我经常遇到这样的问题,即我在股票代码列表中的循环在某个点停止并且不再继续。在这种特定情况下,也没有收到我可以做出反应的错误代码。
我的代码如下:
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
它允许您跳过在您请求的日期没有数据的股票,这正是我需要的。