Python IBAPI reqContractDetails не вернет результат при повторном запуске
Я хочу запросить сведения о контракте, и это сработало в первый раз, когда я запускаю код, но когда я нажимаю снова запустить, ничего не возвращается. Это будет работать, если я выйду из TWS и pycharm и попробую еще раз, я новичок в python и не понимаю, как это работает в целом, пожалуйста, помогите.
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.common import *
from ibapi.contract import *
from ContractSamples import ContractSamples
class TestApp(EClient, EWrapper):
def __init__(self):
EClient.__init__(self, self)
def error(self, reqId:TickerId, errorCode:int, errorString:str):
print("Error: ", reqId, "", errorCode, "", errorString)
def contractDetails(self, reqId:int, contractDetails:ContractDetails):
print("contractDetail: ", reqId, " ", contractDetails)
def main():
app = TestApp()
app.connect("127.0.0.1", 7496, 0)
contract = Contract()
contract.symbol = "AAPL"
contract.secType = "STK"
contract.exchange = "SMART"
contract.currency = "USD"
contract.primaryExchange = "NASDAQ"
app.reqContractDetails(10, contract)
app.run()
if __name__ == "__main__":
main()
Нет сообщения об ошибке, просто нет результата: "Процесс завершен с кодом выхода 0".
1 ответ
app.run()
запускает поток для чтения из сокета. Ваша программа никогда не останавливается, поэтому всегда подключена к TWS. Попробуйте нажать на кнопку меню данных в TWS. Он показывает все ваши связи. Вы увидите, что клиент 0 остается на связи. Очевидно закрытие pyCharm убивает программу.
Вы также запрашиваете детали контракта до того, как программа будет готова. Вы должны дождаться nextValidId и затем отправить запрос. Когда данные будут получены, вы можете остановить свою программу, и она освободит clientId для будущих подключений. Вот как я бы изменил вашу программу.
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.common import *
from ibapi.contract import *
from ContractSamples import ContractSamples
class TestApp(EClient, EWrapper):
def __init__(self):
EClient.__init__(self, self)
def nextValidId(self, orderId:int):
print("id", orderId)
contract = Contract()
contract.symbol = "IBKR"
contract.secType = "STK"
contract.exchange = "SMART"
contract.currency = "USD"
contract.primaryExchange = "NASDAQ"
self.reqContractDetails(10, contract)
def error(self, reqId:TickerId, errorCode:int, errorString:str):
print("Error: ", reqId, "", errorCode, "", errorString)
def contractDetails(self, reqId:int, contractDetails:ContractDetails):
print("contractDetail: ", reqId, " ", contractDetails)
def contractDetailsEnd(self, reqId:int):
print("end, disconnecting")
self.disconnect()
def main():
app = TestApp()
app.connect("127.0.0.1", 7496, 0)
app.run()
if __name__ == "__main__":
main()