У меня есть класс, который устанавливает несколько потоков рыночных данных и сохраняет их в массиве.Затем другая функция в том же классе обращается к массиву и запрашивает данные из потоков, но все значения выводятся как NaN.
Вот пример:
from ib_insync import *
class Trading:
def __init__(...):
self.dataStreams = []
self.conn = IB() #establish connecting to the api
self.tickers = [('BMW', 'IBIS'), ('BAYN', 'IBIS'), .. ]
def _stream_data(self): # this function established the data stream and appends it to an array
for contract in self.tickers:
stock = Stock(contract[0], contract[1], 'EUR')
stream = self.conn.reqMktData(stock, '', False, False)
self.dataStreams.append(stream)
self.conn.sleep(1)
def start(self):
self._stream_data() # fill the datastream array
print(self.dataStreams[0].last + self.dataStreams[1].last) # so this should return the sum of two prices, but it does not
Поэтому, когда я инициализирую вышеуказанный класс в интерпретаторе:
strategy = Trading()
strategy.start()
strategy.start()
выведет NaN
, потому чтоданные из потоков поступают как NaN
.Однако, если я получу доступ к массиву потоков данных из объекта стратегии, например, так:
strategy.dataStreams[0].last
правильно выведет последнюю цену.
Я думаю, что эта проблема связана с природой IB APIработает асинхронно, но у меня недостаточно опыта, чтобы обойти это.Мне нужно сделать другие функции внутри класса, чтобы иметь возможность извлекать данные из потоков и выполнять вычисления.
Можно ли сделать с логикой выше?или мне нужно переместить потоки данных в отдельный класс и инициализировать его отдельно, чтобы иметь доступ к данным?