У меня проблемы с отправкой сигнала .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 отправлятьнесколько заказов без выдачи идентификаторов повторных заказов