【发布时间】:2020-06-15 21:21:44
【问题描述】:
当我试图获取没有历史数据的合约的历史数据时,我陷入了一种无限循环。
在下面的代码中,我试图获取一个股票期权的 3 次罢工和一次到期的历史数据。存在第 1 次和第 3 次罢工的历史数据,但没有第 2 次罢工的历史数据。
import time
import pandas as pd
import collections
import datetime as dt
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.common import BarData
class TestApp(EClient, EWrapper):
def __init__(self):
EClient.__init__(self, self)
self.data=collections.defaultdict(list)
def error(self, reqId:int, errorCode:int, errorString:str):
print("Error: ", reqId, "", errorCode, "", errorString)
def historicalData(self, reqId:int, bar:BarData):
print(bar.date, bar.close)
def historicalDataEnd(self, reqId: int, start: str, end: str):
print("HistoricalDataEnd. ReqId:", reqId, "from", start, "to", end)
self.disconnect()
print("finished")
def get_option_histo_prices(strike:str):
app = TestApp()
app.connect("127.0.0.1", 7496, 5)
time.sleep(1)
contract = Contract()
contract.symbol = "UNH"
contract.lastTradeDateOrContractMonth = "20200619"
contract.secType = "OPT"
contract.right = "C"
contract.exchange = "SMART"
contract.currency = "USD"
contract.multiplier = "100"
contract.strike = strike
app.reqHistoricalData(1, contract, "","1 W", "8 hours", "TRADES", 1, 1, False, [])
app.run()
for strike in ["280","140","240"]:
try:
prices = get_option_histo_prices(strike)
except:
print("no data for",strike)
我获得了第一次罢工的历史数据,但随后收到以下错误消息
错误:1 162 历史市场数据服务错误消息:HMDS 查询未返回数据:UNH 200619C00140000@SMART Trades
然后代码卡住了,它继续运行,就像它处于无限循环中一样。也许有更好的办法来处理这个例外。
【问题讨论】:
-
如果代码停止,您必须显示代码。错误消息只是信息,不会停止正常代码。您可能想阅读interactivebrokers.github.io/tws-api/…,但除非您想尽可能回到过去,否则没有必要。
-
@brian,我已经编辑了我的消息以显示代码。我尝试了 reqHeadTimestamp 但它没有解决问题。如果合约没有历史数据,它会让我陷入“无限循环”。
-
这不是一个例外,它只是信息。错误回调中永远不会抛出异常。如果您的代码中发生异常,API 会立即断开连接。你的问题是代码没有断开连接。您永远不会收到 HistDataEnd 调用,因此永远不会发生断开连接,因此您无法再次连接。您还为每个历史数据请求连接和断开连接。这是不必要的,如果 TWS 释放客户端 ID 的速度很慢,可能会导致问题。
-
@布赖恩,谢谢你的回答。如果我收到此信息,如何强制代码访问 HistDataEnd 调用?
-
@Brian,根据您的消息,我在错误函数中添加了一个条件。如果错误代码是 162,它将断开连接。它似乎工作,谢谢。你有一些改进代码的建议吗?您提到为每个历史数据请求连接和断开连接不是一个好习惯。你有一些我可以遵循的方向吗?
标签: python api interactive-brokers tws ib-api