from ibapi.client import EClient
from ibapi.wrapper import EWrapper
class MyWrapper(EWrapper):
def nextValidId(self, orderId:int):
print("setting nextValidOrderId: %d", orderId)
self.nextValidOrderId = orderId
# start program here or use threading
app.reqContractDetails(4444, contract)
def contractDetails(self, reqId, contractDetails):
print(reqId, contractDetails.contract)# my version doesnt use summary
def contractDetailsEnd(self, reqId):
print("ContractDetailsEnd. ", reqId)
# this is the logical end of your program
app.disconnect() # delete if threading and you want to stay connected
def error(self, reqId, errorCode, errorString):
print("Error. Id: " , reqId, " Code: " , errorCode , " Msg: " , errorString)
wrapper = MyWrapper()
app = EClient(wrapper)
app.connect("127.0.0.1", 7497, clientId=123)
print("serverVersion:%s connectionTime:%s" % (app.serverVersion(), app.twsConnectionTime()))
from ibapi.contract import Contract
contract = Contract()
contract.symbol = "XAUUSD"
contract.secType = "CMDTY"
contract.exchange = "SMART"
contract.currency = "USD"
app.run() # delete this line if threading
# def runMe():
# app.run()
# import threading
# thread = threading.Thread(target = runMe)
# thread.start()
# input('enter to disconnect')
# app.disconnect()
Вы запрашиваете данные, прежде чем запустить программу чтения сообщений. Может быть, вы получите данные до его начала.
IB рекомендует запускать программу после получения nextValidId, чтобы вы знали, что все работает правильно. Поскольку Python API блокирует в цикле чтения сообщений, вам необходимо реализовать многопоточность или структурировать вашу программу для асинхронного запуска.
Я показал, как это сделать, чтобы он просто работал без ввода данных пользователем и управлялся событиями или был асинхронным. Это означает, что программа ждет, пока она должна что-то сделать, а затем она это делает.
Я включил параметр потоков, просто измените комментарии.
ContractDetails.summary был изменен на контракт. Я не уверен, что это когда-либо было обобщением в python, не знаю, откуда вы это взяли.