Интерактивный брокер — определение безопасности для запроса не найдено

#python #interactive-brokers

#python #interactive-brokers

Вопрос:

Я пытаюсь получить исторические данные о конкретном складе из IBKR, но похоже, что функция TestApp() здесь не вызывается или что-то в этом роде. Я могу подключиться к станции TWS, но почему-то мне не возвращаются данные, поэтому мне было интересно, что-то не так с моей функцией-оболочкой?

Кроме того, когда я запускаю код, я возвращаю это сообщение об ошибке: «Определение безопасности для запроса не найдено».

Любые предложения относительно того, как я могу это исправить?

 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()
 

Комментарии:

1. Похоже, что ошибка, которую вы получаете, отвечает на ваш вопрос о том, почему вы не получаете никаких данных. Я предполагаю, что вы не возвращаете данные, потому что вы не сообщили действительную безопасность, для которой возвращать данные. Я предполагаю, что ваша проблема заключается в том, что Contract создаваемый вами объект неправильно определяет запрос, который вы делаете для данных. Я не знаю конкретного API. Может быть, кто-то увидит это, кто знает API. Все, что я могу предложить, это просмотреть документы и примеры и попытаться выяснить, почему содержимое вашего запроса приводит к этой ошибке.

Ответ №1:

Обмен должен быть ИНТЕЛЛЕКТУАЛЬНЫМ для разумной маршрутизации ко всем доступным обменам. Если вы действительно хотите просто использовать NASDAQ, то обмен должен быть ОСТРОВНЫМ, я думаю. Я знаю, что это работает, потому что я его тестировал, но никогда не использовал его в реальной торговле для таких вещей, как скидки. Я также понятия не имею, даст ли это исторические данные только для одного обмена, но я серьезно сомневаюсь в этом.

У вас реализован contractDetails, поэтому вы всегда можете сначала вызвать его, а затем вы можете торговать AAPL, указав только contract.conId = 265598