我正在尝试从 IBKR 获取特定股票的历史数据,但这里的 testApp() 函数似乎没有被调用或什么的。我可以连接到 TWS 站,但不知何故我没有收到数据,所以想知道我的 Wrapper 功能是否有问题?
此外,当我运行代码时,我收到此错误消息:“未找到该请求的安全定义”。
关于如何解决这个问题有什么建议吗?
class TestClient(EClient):
def __init__(self, wrapper):
EClient.__init__(self, wrapper)
class TestWrapper(wrapper.EWrapper):
def __init__(self):
wrapper.EWrapper.__init__(self)
class TestApp(TestWrapper, TestClient):
def __init__(self):
TestWrapper.__init__(self)
TestClient.__init__(self, wrapper=self)
def error(self, reqid, errorcode, errorstring):
print("Error: ", reqid, " ", errorcode, " ", errorstring)
def historicalData(self, reqid: int, bar: BarData):
print("HistoricalData. ReqId:", reqid, "BarData.", bar)
def historicalDataUpdate(self, reqid: int, bar: BarData):
print("HistoricalDataUpdate. ReqId:", reqid, "BarData.", bar)
def historicalDataEnd(self, reqid: int, start: str, end: str):
print("HistoricalDataEnd. ReqId:", reqid, "from", start, "to", end)
app.disconnect()
print("Finished")
def nextValidId(self, orderId: int):
super().nextValidId(orderId)
logging.debug("setting nextValidOrderId: %d", orderId)
self.nextValidOrderId = orderId
print("NextValidId:", orderId)
def contractDetails(self, reqId: int, contractDetails: ContractDetails):
super().contractDetails(reqId, contractDetails)
printinstance(contractDetails)
self.reqContractDetails(10004, ContractSamples.NewsFeedForQuery())
def contractDetailsEnd(self, reqId: int):
super().contractDetailsEnd(reqId)
print("ContractDetailsEnd. ReqId:", reqId)
def main():
app = TestApp()
app.connect("127.0.0.1", 7497, clientId=1)
print(app.isConnected())
time.sleep(1)
contract = Contract()
contract.secType = "STK"
contract.symbol = "AAPL"
contract.currency = "USD"
contract.exchange = "NASDAQ"
querytime = (datetime.datetime.today() - datetime.timedelta(days=180)).strftime("%Y%m%d %H:%M:%S")
app.reqHistoricalData(4001, contract, querytime, "1 M", "1 day", "MIDPOINT", 1, 1, False, [])
app.run()
if __name__ == "__main__":
main()
答案 0 :(得分:0)
交易所应该是 SMART 的,以便智能路由到所有可用的交易所。如果您真的只想使用纳斯达克,那么我认为交易所应该是 ISLAND。我知道它有效,因为我测试过它,但从未在实际交易中使用它来处理回扣之类的事情。我也不知道它是否会提供一个交易所的历史数据,但我严重怀疑。
您已经实现了 contractDetails,因此您始终可以先调用它,然后您就可以通过指定 contract.conId = 265598