Невозможно подключить python к TWS с помощью ibapi

#interactive-brokers #tws #ib-api

#interactive-brokers #tws #ib-api

Вопрос:

Это мой код:

 from threading import Timer
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.order import *

class TestApp(EWrapper, EClient):

    def __init__(self):
        EClient.__init__(self, self)

    def Error(self, reqID, errorCode, errorString):
        print('Error :', reqID, '', errorCode,'', errorString)

    def contractDetails(self, reqID, contractDetails):
        print('Contract Details :', reqID, '', contractDetails)

    def nextValidId(self, orderId):
        self.nextOrderID = orderId
        self.run()

    def orderStatus(self, orderId, status, filled, remaining, avgFillPrice, permID, lastFillprice, cliendId, whyHeld, mktCapPrice):
        print('Orderstatus Id. ', orderId, 'Status: ', status, 'Filled: ', 'Remaining: ', remaining, 'Last Fill Price: ', lastFillprice)

    def openOrderEnd(self, orderId, contract, order, orderState):
        print('Open Order ID. ', orderId, contract.symbol, contract.secType, '@', contract.exchange, ': ', order.action, order.orderType, order.totalQuantity, orderState.status)

    def execDetails(self, reqId, contract, execution):
        print('Exec Details. ', reqId, contract.symbol, contract.secType, contract.currency, execution.execId, execution.orderId, execution.shares, execution.lastLiquidity)

    def accountSummary(self, reqId, account, tag, value, currency):
        print('Account Summary. ', reqId, account, tag, value, currency)

    def start(self):
        contract = Contract()
        contract.symbol = 'NFLX'
        contract.secType = 'STK'
        contract.exchange = 'SMART'
        contract.currency = 'USD'
        contract.primaryExchange = 'NASDAQ'

        order = Order()
        order.action = 'BUY'
        order.totalQuantity = 2
        order.orderType = 'LMT'
        order.lmtPrice = 539.50

        self.placeOrder(self.nextOrderID, contract, order)

    def stop(self):
        self.done = True
        self.disconnect()


def main():
    app = TestApp()
    app.nextOrderID = 0
    app.connect('127.0.0.1', 7497, 0)

    Timer(3, app.stop).start()
    app.run()


if __name__ == '__main__':
    main()
 

Я просто получаю основные сообщения при выполнении этого кода:

ОШИБКА -1 2104 Подключение к ферме рыночных данных в порядке: ОШИБКА hfarm -1 2104 Подключение к ферме рыночных данных в порядке: ОШИБКА usfarm.nj -1 2104 Подключение к ферме рыночных данных в порядке: ОШИБКА usfuture -1 2104 Подключение к ферме рыночных данных в порядке: ОШИБКА jfarm -1 2104 Подключение к ферме рыночных данных в порядке: ошибка eufarm -1 2104Подключение к ферме рыночных данных в порядке: ошибка cashfarm -1 2104 Подключение к ферме рыночных данных в ПОРЯДКЕ: ОШИБКА usfarm -1 2106 Подключение к ферме данных HMDS в порядке: ОШИБКА euhmds -1 2106 Подключение к ферме данных HMDS в порядке: ОШИБКА fundfarm -1 2106 Подключение к ферме данных HMDS в порядке: ошибка ushmds -1 2158 Сек.подключение в порядке: secdefnj

Я скопировал код из онлайн-видео IBKR. Я не знаю, что я делаю не так. Я был бы очень признателен за любую помощь.

Ответ №1:

Вы подключены, вы просто никогда не размещали заказ в своем методе запуска. Подумайте о переименовании вашего метода start, поскольку, возможно, вызов Timer.start сбивает с толку.

 from threading import Timer
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.order import *

class TestApp(EWrapper, EClient):

    def __init__(self):
        EClient.__init__(self, self)
        self.nextOrderID = 0 # if this is init code put it in init

    def Error(self, reqID, errorCode, errorString):
        print('Error :', reqID, '', errorCode,'', errorString)

    def contractDetails(self, reqID, contractDetails):
        print('Contract Details :', reqID, '', contractDetails)

    def nextValidId(self, orderId):
        self.nextOrderID = orderId
        #self.run() you already called app.run
        self.start() # call your start function, you never did so order wasn't placed.
    
    # you missed parentId, just copy these big defs from the source
    def orderStatus(self, orderId, status, filled, remaining, avgFillPrice, permId, parentId, lastFillPrice, clientId, whyHeld, mktCapPrice):
        print('Orderstatus Id. ', orderId, 'Status: ', status, 'Filled: ', 'Remaining: ', remaining, 'Last Fill Price: ', lastFillPrice)
        #maybe disconnect when order is filled
        if remaining == 0.0:
            self.stop()

    def openOrderEnd(self, orderId, contract, order, orderState):
        print('Open Order ID. ', orderId, contract.symbol, contract.secType, '@', contract.exchange, ': ', order.action, order.orderType, order.totalQuantity, orderState.status)

    def execDetails(self, reqId, contract, execution):
        print('Exec Details. ', reqId, contract.symbol, contract.secType, contract.currency, execution.execId, execution.orderId, execution.shares, execution.lastLiquidity)
        
    def accountSummary(self, reqId, account, tag, value, currency):
        print('Account Summary. ', reqId, account, tag, value, currency)

    def start(self):
        contract = Contract()
        contract.symbol = 'NFLX'
        contract.secType = 'STK'
        contract.exchange = 'SMART'
        contract.currency = 'USD'
        #contract.primaryExchange = 'NASDAQ'#??may be ISLAND, but not needed for nflx

        order = Order()
        order.action = 'BUY'
        order.totalQuantity = 2
        order.orderType = 'LMT'
        order.lmtPrice = 539.50
        
        self.placeOrder(self.nextOrderID, contract, order)
        self.nextOrderID  =1 # always increment after use

    def stop(self):
        #self.done = True # unnecessary 
        if self.isConnected() : 
            print("disconnecting")
            self.disconnect()
        
def main():
    app = TestApp()
    app.connect('127.0.0.1', 7497, 123)

    #Timer(3, app.stop).start() #means you want to stop in 3 seconds no matter what
    app.run()

if __name__ == '__main__':
    main()
 

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

1. Спасибо вам за это. Однако я не могу запустить функции AccountSummary и openOrderEnd. Как я могу это исправить?

2. Вы их не запрашиваете. Проверьте документы о том, как их запросить. например. interactivebrokers.github.io/tws-api /…

3. Эта функция находится в классе TestApp

4. def AccountSummary(self, запрос, учетная запись, тег, значение, валюта): self.reqAccountSummary(запрос, учетная запись, тег, значение) print(‘Сводка по счету. ‘, запрос, учетная запись, тег, значение, валюта)

5. Он по-прежнему не показывает это в консоли python. Как я должен это исправить?