Как перенести запрос на покупку из функции tickprice в nextValidId? - PullRequest
0 голосов
/ 11 октября 2019

У меня проблемы с отправкой сигнала .placeorder в TWS через текущие рыночные данные, которые я получаю.

  • Я попытался передать команду .placeorder внутри функции tickprice. Это работает только один раз, потому что после этого я получаю повторение orderId.

  • Я исправил эту проблему, переместив .placeorder в функцию nextValidId. Это работает для покупки более одного раза, но теперь я не могу сказать системе покупать, основываясь на поступающих рыночных данных.

  • Я попытался установить глобальные переменные и заставить nextValidID переписать целое число, котороеЯ мог бы тогда присвоить orderId. Однако, когда я пытаюсь напечатать целое число, оно всегда возвращает None.

  • Я пытаюсь торговать вне трендовых линий, поэтому мне нужно иметь возможность отправлять запросы на ордера, как только пересечется трендовая линия.

  • Я попытался использовать логическое значение place_request как способ сообщить функции nextValidId, когда покупать. однако я не могу получить доступ к логическому значению, потому что все функции находятся внутри класса TestApp

    from ibapi.client import EClient
    from ibapi.order import Order
    from ibapi.contract import *
    from ibapi import  wrapper
    from ibapi.utils import iswrapper
    import time
    mark_list = []
    place_request = True



    class TestApp(wrapper.EWrapper, EClient):
        def __init__(self):
            wrapper.EWrapper.__init__(self)
            EClient.__init__(self, self)


        def error(self, reqId, errorCode, errorString):
            print("Error: ", reqId, " ", errorCode, " ", errorString)


        def tickPrice(self, reqId, tickType, price, attrib):
            if tickType == 37: #TickType for a MARK return
                print(f"MARK Price:  {price}")
                mark_list.append(round(price, 2))
                if len(mark_list) > 5:
                    del mark_list[0]
                print(f"Mark List:  {mark_list}")
                print("-")
            if price > 0:
                place_request = True


        @iswrapper
        def nextValidId(self, orderId: int):
            super().nextValidId(orderId)
            self.nextValidOrderId = orderId
            if place_request is True:
                order = Order()
                order.action = "BUY"
                order.totalQuantity = 10
                order.orderType = "MKT"
                print(f"ORDER ID IS {orderId}")
                self.placeOrder(orderId, make_contract("AAPL", "STK", "SMART", "USD", "NASDAQ", 0), order)



    def make_contract(symbol, sec_type, exch, curr, prim_exch, conId):
        contract = Contract()
        contract.symbol = symbol
        contract.secType = sec_type
        contract.exchange = exch
        contract.primaryExchange = prim_exch
        contract.currency = curr
        contract.conId = conId
        return contract


    def main():
        app = TestApp()
        app.connect("127.0.0.1", 7496, 0)
        time.sleep(0.1)


        app.reqMarketDataType(3)
        app.reqMktData(1, make_contract("TSLA", "STK", "SMART", "USD", "NASDAQ", 0), "221", False, False, [])

        app.run()
        app.disconnect()

    main()

Полученные результаты показывают, что orderid не равен ни одному, если я его вызываювне функции. Мне нужно, чтобы он был равен фактическому значению orderid, чтобы при отправке заказа я мог назначить заказ со следующим идентификатором.

Вывод, который я ищу, - возможность функции tickprice отправлятьнесколько заказов без выдачи идентификаторов повторных заказов

...