def tickPrice(self, reqId, tickType, price, attrib):
cas = datetime.now()
cas = cas.strftime("%d/%m/%Y %H:%M")
# data pro SPY
if reqId == 1 and tickType == 2 and price != -1.0:
self.update_bardata(self.SPY_data, cas, price)
# data pro TSLA
elif reqId == 4 and tickType == 2 and price != -1.0:
self.update_bardata(self.TSLA_data, cas, price)
# data pro NVDA
elif reqId == 5 and tickType == 2 and price != -1.0:
self.update_bardata(self.NVDA_data, cas, price)
# data pro AMZN
elif reqId == 6 and tickType == 2 and price != -1.0:
self.update_bardata(self.AMZN_data, cas, price)
def tickSize(self, reqId, tickType, size):
cas = datetime.now()
cas = cas.strftime("%d/%m/%Y %H:%M")
# volume pro SPY
if reqId == 1 and tickType == 8 and size != -1.0:
self.update_tickdata(self.SPY_data, cas, size)
# volume pro TSLA
elif reqId == 4 and tickType == 8 and size != -1.0:
self.update_tickdata(self.TSLA_data,cas, size)
# volume pro NVDA
elif reqId == 5 and tickType == 8 and size != -1.0:
self.update_tickdata(self.NVDA_data, cas, size)
# data pro AMZN
elif reqId == 6 and tickType == 8 and size != -1.0 :
self.update_tickdata(self.AMZN_data, cas, size)
def update_tickdata(self, data_frame,cas, size):
if cas in data_frame.index:
data_frame.at[cas, 'volume total']=size
data_frame.iat[-1, 9] = size - data_frame.iat[-2, 8]
def update_bardata(self, data_frame, cas, price):
data_frame.loc[cas] = {'price': price}
Но это работает неправильно. цена в порядке, всегда включается в окончательный data_frame, но размер включается в 70-80% ячеек, это означает, что есть пустые ячейки. Некоторые data_frames лучше, AMZN заполнен на 95 %, некоторые очень плохие SPY отсутствуют на 50 % (только размер, цена всегда присутствует).
size поток данных - кажется, все в порядке, когда я его печатаю, поток данных очень богатый - поступает больше раз в секунду
Я изменил def update_bardata (self, data_frame, cas, цена) на это:
но я получаю ошибки из-за отсутствия цены или размера, а также из-за катастрофического сочетания данных о цене и размере в столбец «цена» и пустой столбец «общий объем»
чем (с поддержкой ИИ) я попробовал построить список внутри функции update_bardata, которая собрала цену и размер и добавила ее в data_frame
if price is not None:
data_to_update['price'] = price
if size is not None:
data_to_update['size'] = size
data_frame.loc[cas] = data_to_update
но это только устранило ошибку из Pandas, но остальное снова было таким же: сочетание данных о цене и размере в 'price ' столбец и пустой столбец "общий объем"
use data_frame.loc[cas] = {'volume total': size в def update_tickdata, но результатом снова было сочетание цены и данные размера в первом столбце «цена»
используйте разные data_frames, один отдельный для цены, а другой для размера, например:
результат был пустым data_frames_size, без какого-либо значения, и снова в data_frame сочетание данных о цене и размере в «цене»
А теперь у меня закончились идеи
Я использую этот код для получения данных о ценах и размерах различных акций через API IBKR: [code]def tickPrice(self, reqId, tickType, price, attrib): cas = datetime.now() cas = cas.strftime("%d/%m/%Y %H:%M") # data pro SPY if reqId == 1 and tickType == 2 and price != -1.0: self.update_bardata(self.SPY_data, cas, price) # data pro TSLA elif reqId == 4 and tickType == 2 and price != -1.0: self.update_bardata(self.TSLA_data, cas, price) # data pro NVDA elif reqId == 5 and tickType == 2 and price != -1.0: self.update_bardata(self.NVDA_data, cas, price) # data pro AMZN elif reqId == 6 and tickType == 2 and price != -1.0: self.update_bardata(self.AMZN_data, cas, price)
def tickSize(self, reqId, tickType, size): cas = datetime.now() cas = cas.strftime("%d/%m/%Y %H:%M") # volume pro SPY if reqId == 1 and tickType == 8 and size != -1.0: self.update_tickdata(self.SPY_data, cas, size) # volume pro TSLA elif reqId == 4 and tickType == 8 and size != -1.0: self.update_tickdata(self.TSLA_data,cas, size) # volume pro NVDA elif reqId == 5 and tickType == 8 and size != -1.0: self.update_tickdata(self.NVDA_data, cas, size) # data pro AMZN elif reqId == 6 and tickType == 8 and size != -1.0 : self.update_tickdata(self.AMZN_data, cas, size)
def update_tickdata(self, data_frame,cas, size): if cas in data_frame.index: data_frame.at[cas, 'volume total']=size data_frame.iat[-1, 9] = size - data_frame.iat[-2, 8]
def update_bardata(self, data_frame, cas, price): data_frame.loc[cas] = {'price': price} [/code] Но это работает неправильно. цена в порядке, всегда включается в окончательный data_frame, но размер включается в 70-80% ячеек, это означает, что есть пустые ячейки. Некоторые data_frames лучше, AMZN заполнен на 95 %, некоторые очень плохие SPY отсутствуют на 50 % (только размер, цена всегда присутствует). [list] [*]size поток данных - кажется, все в порядке, когда я его печатаю, поток данных очень богатый - поступает больше раз в секунду
[/list] но я получаю ошибки из-за отсутствия цены или размера, а также из-за катастрофического сочетания данных о цене и размере в столбец «цена» и пустой столбец «общий объем» [list] [*]чем (с поддержкой ИИ) я попробовал построить список внутри функции update_bardata, которая собрала цену и размер и добавила ее в data_frame [code]if price is not None: data_to_update['price'] = price if size is not None: data_to_update['size'] = size
data_frame.loc[cas] = data_to_update [/code]
[/list] но это только устранило ошибку из Pandas, но остальное снова было таким же: сочетание данных о цене и размере в 'price ' столбец и пустой столбец "общий объем" [list] [*]use data_frame.loc[cas] = {'volume total': size в def update_tickdata, но результатом снова было сочетание цены и данные размера в первом столбце «цена»
[*]используйте разные data_frames, один отдельный для цены, а другой для размера, например: [code]def update_tickdata(self, data_frame_size,cas, size): data_frame_size.loc[cas] = {'volume total': size}
[/list] результат был пустым data_frames_size, без какого-либо значения, и снова в data_frame сочетание данных о цене и размере в «цене» А теперь у меня закончились идеи