Чтение котировок

Python API позволяет получить массивы цен (баров) с помощью 3 функций, отличающихся способом указания диапазона запрашиваемых данных: по номерам баров или по времени. Все функции аналогичны различным формам CopyRates.

У всех функций два первых параметра служат для указания имени символа и таймфрейма. Для таймфреймов в mt5 определено перечисление TIMEFRAME, аналогичное перечислению ENUM_TIMEFRAMES в MQL5.

Обратите внимание: по каким-то причинам в Python элементы этого перечисления имеют префикс TIMEFRAME_, в то время как элементы аналогичного перечисления в MQL5 имеют префиксы PERIOD_.

Идентификатор

Описание

TIMEFRAME_M1

1 минута

TIMEFRAME_M2

2 минуты

TIMEFRAME_M3

3 минуты

TIMEFRAME_M4

4 минуты

TIMEFRAME_M5

5 минут

TIMEFRAME_M6

6 минут

TIMEFRAME_M10

10 минут

TIMEFRAME_M12

12 минут

TIMEFRAME_M12

15 минут

TIMEFRAME_M20

20 минут

TIMEFRAME_M30

30 минут

TIMEFRAME_H1

1 час

TIMEFRAME_H2

2 часа

TIMEFRAME_H3

3 часа

TIMEFRAME_H4

4 часа

TIMEFRAME_H6

6 часов

TIMEFRAME_H8

8 часов

TIMEFRAME_H12

12 часов

TIMEFRAME_D1

1 день

TIMEFRAME_W1

1 неделя

TIMEFRAME_MN1

1 месяц

Все 3 функции возвращают бары в виде массива пакета numpy с именованными столбцами time, open, high, low, close, tick_volume, spread и real_volume. Массив numpy.ndarray является более эффективным аналогом именованных кортежей. Для доступа к колонкам используйте нотацию с квадратными скобками, array['column'].

В случае ошибки возвращается None.

Все параметры функций являются обязательными, неименованными.

numpy.ndarray copy_rates_from(symbol, timeframe, date_from, count)

Функция copy_rates_from запрашивает бары, начиная с указанной даты (date_from) в количестве count баров. Дату можно задавать объектом datetime или в виде количества секунд, прошедших с 1970.01.01.

При создании объекта datetime Python использует локальный часовой пояс, в то время как терминал MetaTrader 5 хранит время тиков и открытия баров в UTC (GMT, без смещения). Поэтому, для выполнения функций, использующих время, необходимо создавать переменные datetime в UTC-времени. Для настройки таймзон можно использовать пакет pytz. Например (см. MQL5/Scripts/MQL5Book/Python/eurusdrates.py),

from datetime import datetime
import MetaTrader5 as mt5   
import pytz                    # импортируем модуль pytz для работы с таймзоной
# установим подключение к терминалу MetaTrader 5
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   mt5.shutdown()
   quit()
   
# установим таймзону в UTC 
timezone = pytz.timezone("Etc/UTC")
   
# создадим объект datetime в таймзоне UTC, чтобы не применялось смещение локальной таймзоны
utc_from = datetime(2022110, tzinfo = timezone)
   
# получим 10 баров с EURUSD H1 начиная с 01.10.2022 в таймзоне UTC
rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_H1, utc_from, 10)
   
# завершим подключение к терминалу MetaTrader 5
mt5.shutdown()
   
# выведем каждый элемент полученных данных (кортеж)
for rate in rates:
   print(rate)

Образец полученных данных:

(1641567600, 1.12975, 1.13226, 1.12922, 1.13017, 8325, 0, 0)
(1641571200, 1.13017, 1.13343, 1.1299, 1.13302, 7073, 0, 0)
(1641574800, 1.13302, 1.13491, 1.13293, 1.13468, 5920, 0, 0)
(1641578400, 1.13469, 1.13571, 1.13375, 1.13564, 3723, 0, 0)
(1641582000, 1.13564, 1.13582, 1.13494, 1.13564, 1990, 0, 0)
(1641585600, 1.1356, 1.13622, 1.13547, 1.13574, 1269, 0, 0)
(1641589200, 1.13572, 1.13647, 1.13568, 1.13627, 1031, 0, 0)
(1641592800, 1.13627, 1.13639, 1.13573, 1.13613, 982, 0, 0)
(1641596400, 1.1361, 1.13613, 1.1358, 1.1359, 692, 1, 0)
(1641772800, 1.1355, 1.13597, 1.13524, 1.1356, 1795, 10, 0)

 

numpy.ndarray copy_rates_from_pos(symbol, timeframe, start, count)

Функция copy_rates_from_pos запрашивает бары, начиная с указанного индекса start, в количестве count.

Терминал MetaTrader 5 отдает бары только в пределах истории, доступной пользователю на графиках. Количество баров, которые доступны пользователю, задается в настройках параметром "Макс. баров в окне".

Следующий пример (MQL5/Scripts/MQL5Book/Python/ratescorr.py) демонстрирует графическое представление корреляционной матрицы нескольких валют на основе котировок.

import MetaTrader5 as mt5
import pandas as pd              # подключаем модуль pandas для вывода данных
import matplotlib.pyplot as plt  # подключаем модуль matplotlib для рисования
   
# установим подключение к терминалу MetaTrader 5
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   mt5.shutdown()
   quit()
   
# создадим путь в песочнице для картинки с результатом
image = mt5.terminal_info().data_path + r'\MQL5\Files\MQL5Book\ratescorr'
   
# список рабочих валют для расчета корреляции
sym = ['EURUSD','GBPUSD','USDJPY','USDCHF','AUDUSD','USDCAD','NZDUSD','XAUUSD']
   
# копируем цены закрытия баров в структуры DataFrame
d = pd.DataFrame()
for i in sym:        # для каждого символа по 1000 последних баров M1
   rates = mt5.copy_rates_from_pos(i, mt5.TIMEFRAME_M1, 01000)
   d[i] = [y['close'for y in rates]
   
# завершим подключение к терминалу MetaTrader 5
mt5.shutdown()
   
# вычислим изменение цен в процентах
rets = d.pct_change()
   
# вычислим корреляции
corr = rets.corr()
   
# рисуем корреляционную матрицу
fig = plt.figure(figsize = (55))
fig.add_axes([0.150.10.80.8])
plt.imshow(corr, cmap = 'RdYlGn', interpolation = 'none', aspect = 'equal')
plt.colorbar()
plt.xticks(range(len(corr)), corr.columns, rotation = 'vertical')
plt.yticks(range(len(corr)), corr.columns)
plt.show()
plt.savefig(image)

Файл с изображением ratescorr.png формируется в "песочнице" текущей рабочей копии MetaTrader 5. Интерактивный показ изображения в отдельном окне с помощью вызова plt.show() может не сработать, если ваша установка Python не включает дополнительную опцию (Optional Features) — "tcl/tk and IDLE" или если не добавить пакет pip install tk.

Корреляционная матрица валют Forex

Корреляционная матрица валют Forex

numpy.ndarray copy_rates_range(symbol, timeframe, date_from, date_to)

Функция copy_rates_range позволяет получить бары в указанном диапазоне даты и времени, между date_from и date_to: оба значения задаются как количество секунд с начала 1970-го года, в часовом поясе UTC (поскольку Python использует в переменных datetime локальную таймзону, выполняйте конвертацию с помощью модуля pytz). В результат попадают бары с временем открытия time >= date_from и time <= date_to.

В следующем скрипте запросим бары в конкретном временном диапазоне.

from datetime import datetime
import MetaTrader5 as mt5
import pytz             # подключаем модуль pytz для работы с таймзоной
import pandas as pd     # подключаем модуль pandas для вывода данных в табличной форме
   
pd.set_option('display.max_columns'500# сколько столбцов показываем
pd.set_option('display.width'1500)      # макс. ширина таблицы для показа
   
# установим подключение к терминалу MetaTrader 5
if not mt5.initialize():
   print("initialize() failed, error code =", mt5.last_error())
   quit()
   
# установим таймзону в UTC
timezone = pytz.timezone("Etc/UTC")
# создадим объекты datetime в таймзоне UTC, чтобы не применялось смещение локальной таймзоны
utc_from = datetime(2020110, tzinfo=timezone)
utc_to = datetime(2020110, minute = 30, tzinfo=timezone)
   
# получим бары с USDJPY M5 в интервале 2020.01.10 00:00 - 2020.01.10 00:30 в таймзоне UTC
rates = mt5.copy_rates_range("USDJPY", mt5.TIMEFRAME_M5, utc_from, utc_to)
   
# завершим подключение к терминалу MetaTrader 5
mt5.shutdown()
   
# создадим из полученных данных DataFrame
rates_frame = pd.DataFrame(rates)
# сконвертируем время из количества секунд в формат datetime
rates_frame['time'] = pd.to_datetime(rates_frame['time'], unit = 's')
   
# выведем данные
print(rates_frame)

Пример результата:

                 time     open     high      low    close  tick_volume  spread  real_volume 

0 2020-01-10 00:00:00  109.513  109.527  109.505  109.521           43       2            0 

1 2020-01-10 00:05:00  109.521  109.549  109.518  109.543          215       8            0 

2 2020-01-10 00:10:00  109.543  109.543  109.466  109.505           98      10            0 

3 2020-01-10 00:15:00  109.504  109.534  109.502  109.517          155       8            0 

4 2020-01-10 00:20:00  109.517  109.539  109.513  109.527           71       4            0 

5 2020-01-10 00:25:00  109.526  109.537  109.484  109.520          106       9            0 

6 2020-01-10 00:30:00  109.520  109.524  109.508  109.510          205       7            0