Python IBAPI reqContractDetails не вернет результат при повторном запуске - PullRequest
0 голосов
/ 05 июля 2019

Я хочу запросить сведения о контракте, и это сработало при первом запуске кода, но когда я нажимаю снова запустить, ничего не возвращается.Это будет работать, если я выйду из 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 Ответ

0 голосов
/ 06 июля 2019

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...