Форум сайта python.su
Здравствуйте,
import MetaTrader5 as mt5 import pandas as pd import numpy as np import time # Импортирую данные из Metatrader5. symbol_list = ['EURUSD','BTCUSDT.cfd'] timeframe = mt5.TIMEFRAME_H1 start_pos = 0 num_bars = 10 check_bar = pd.DataFrame(columns = ['time', 'symbol'], index = range(0, len(symbol_list))) check_bar['time'] = pd.to_datetime(1900-1-1) check_bar['symbol'] = symbol_list while True: for symbol in symbol_list: bars = mt5.copy_rates_from_pos(symbol, timeframe, start_pos, num_bars) df = pd.DataFrame(bars)[['time', 'open', 'high', 'low', 'close']] df['symbol'] = symbol df['time'] = pd.to_datetime(df['time'], unit='s') df.dropna(inplace=True) # Далее необходимо сравнить ячейку из check_bar['time'] соответствующего символа check_bar['symbol'] с # последней ячейкой df['symbol', 'time'], если время последнего бара текущего символа из df не соответствует # времени, записанного в check_bar, вернуть True и записать новое время в соответствующую ячейку
Отредактировано Partsofbody (Апрель 8, 2024 21:47:20)
Офлайн
я как то в мододсти был не сильно ращборчив и потому две бабы на меня одного было
Вопрос то в чем?
Офлайн
так можно получить последнее значение
last_bar_time = df.iloc[-1]['time']
if last_bar_time != check_bar.loc[i, 'time']: check_bar.loc[i, 'time'] = last_bar_time
Офлайн
xam1816В ‘check_bar’ несколько вариантов валюты. Сравнивать нужно именно с той ячейкой времени, которая соответствует строке валюты. Причем ‘check_bar’ не должен раздуваться. Количество строк всегда должно оставаться тем же. Изменяется только ячейка времени.
так можно получить последнее значение
Отредактировано Partsofbody (Апрель 9, 2024 21:05:51)
Офлайн
ZerGВопрос в том, как решить задачу сравнения и записи нового бара. Без раздутия “check_bars”
я как то в мододсти был не сильно ращборчив и потому две бабы на меня одного былоВопрос то в чем?
Офлайн
xam1816
if last_bar_time != check_bar.loc:
check_bar.loc = last_bar_time
for i in range(0, len(symbol_list)): if df.iloc[-1:]['time'] != check_bar.loc[i, 'time']: print(check_bar.loc[i,'symbol'], 'новый бар!') check_bar.loc[i, 'time'] = df.iloc[-1:]['time']
Офлайн
PartsofbodyКак теперь из dataframe перевести значения в сравниваемые?
Офлайн
Мне было бы понятнее что нужно, если бы был отрывок данных исходных, и то что нужно получить(прописать руками, как должно быть)
Офлайн
xam1816Код отрабатывает появления нового ценового бара в терминале MetaTrader5.
Мне было бы понятнее что нужно, если бы был отрывок данных исходных, и то что нужно получить(прописать руками, как должно быть)
Офлайн
import pandas as pd bars = [ {'time': 1632048000, 'open': 1.1701, 'high': 1.1725, 'low': 1.1698, 'close': 1.1715, 'tick_volume': 0, 'spread': 2, 'real_volume': 0}, {'time': 1632048060, 'open': 1.1716, 'high': 1.1722, 'low': 1.1714, 'close': 1.1717, 'tick_volume': 0, 'spread': 2, 'real_volume': 0}, {'time': 1632048120, 'open': 1.1716, 'high': 1.1719, 'low': 1.1711, 'close': 1.1712, 'tick_volume': 0, 'spread': 2, 'real_volume': 0} ] df = pd.DataFrame(bars) df['time'] = pd.to_datetime(df['time'], unit='s') last_bar_time = df.iloc[-1]['time'] print(df) print(last_bar_time) print(df.iloc[-1]['time']) print(last_bar_time == df.iloc[-1]['time'])
time open high ... tick_volume spread real_volume
0 2021-09-19 10:40:00 1.1701 1.1725 ... 0 2 0
1 2021-09-19 10:41:00 1.1716 1.1722 ... 0 2 0
2 2021-09-19 10:42:00 1.1716 1.1719 ... 0 2 0
[3 rows x 8 columns]
2021-09-19 10:42:00
2021-09-19 10:42:00
True
Process finished with exit code 0
Отредактировано xam1816 (Апрель 10, 2024 20:03:46)
Офлайн