Модуль MetaTrader для интеграции с Python

MQL5 предназначен для разработки высокопроизводительных торговых приложений на финансовых рынках и не имеет аналогов среди других специализованных языков, используемых в алготрейдинге. Синтаксис и скорость работы программ на MQL5 максимально приближены к С++, имеется поддержка OpenCL и интеграция с MS Visual Studio, доступны библиотеки статистики, нечеткой логики и ALGLIB. В среде разработки MetaEditor также имеется нативная поддержка .NET библиотек с "умным" импортом функций без написания специальных оберток, можно использовать сторонние C++ DLL.  Файлы исходных кодов на С++ (CPP и H) можно редактировать и компилировать в DLL прямо из редактора — для этого используется Microsoft Visual Studio, установленный на компьютере пользователя.

Python является современным высокоуровневым языком программирования для разработки сценариев и приложений. Содержит множество библиотек для машинного обучения, автоматизации процессов, анализа и визуализации данных.

Пакет MetaTrader для Python предназначен для удобного и быстрого получения биржевой информации через межпроцессное взаимодействие прямо из терминала MetaTrader 5. Полученные таким образом данные можно дальше использовать для статистических вычислений и машинного обучения.

Установка пакета в командной строке:

  pip install MetaTrader5

Обновление пакета в командной строке:

  pip install --upgrade MetaTrader5

Функции для интеграции MetaTrader 5 и Python

Функция

Действие

initialize

Устанавливает соединение с терминалом MetaTrader 5

login

Подключается к торговому счету с указанными параметрами

shutdown

Закрывает ранее установленное подключение к терминалу MetaTrader 5

version

Возвращает версию терминала MetaTrader 5

last_error

Возвращает информацию о последней ошибке

account_info

Получает информацию о текущем торговом счете

terminal_Info

Получает состояние и параметры подключенного терминала MetaTrader 5

symbols_total

Получает количество всех финансовых инструментов в терминале MetaTrader 5

symbols_get

Получает все финансовые инструменты из терминала MetaTrader 5

symbol_info

Получает информацию по указанному финансовому инструменту

symbol_info_tick

Получает последний тик по указанному финансовому инструменту

symbol_select

Выбирает символ в окне MarketWatch или убирает символ из этого окна

market_book_add

Производит подписку терминала MetaTrader 5 на получение событий об изменениях в стакане по указанному символу

market_book_get

Возвращает кортеж из BookInfo, содержащий записи стакана цен указанного символа

market_book_release

Отменяет подписку терминала MetaTrader 5 на получение событий об изменениях в стакане по указанному символу

copy_rates_from

Получает бары из терминала MetaTrader 5, начиная с указанной даты

copy_rates_from_pos

Получает бары из терминала MetaTrader 5, начиная с указанного индекса

copyrates_range

Получает бары в указанном диапазоне дат из терминала MetaTrader 5

copy_ticks_from

Получает тики из терминала MetaTrader 5, начиная с указанной даты

copy_ticks_range

Получает тики за указанный диапазон дат из терминала MetaTrader 5

orders_total

Получает количество действующих ордеров.

orders_get

Получает действующие ордеры с возможность фильтрации по символу или тикету

order_calc_margin

Возвращает размер маржи в валюте счета для проведения указанной торговой операции

order_calc_profit

Возвращает размер прибыли в валюте счета для указанной торговой операции

order_check

Проверяет достаточность средств для совершения требуемой торговой операции

order_send

Отправляет из терминала на торговый сервер запрос на совершение  торговой операции.

positions_total

Получает количество открытых позиций

positions_get

Получает открытые позиции с возможностью фильтрации по символу или тикету

history_orders_total

Получает количество ордеров в торговой истории в указанном интервале

history_orders_get

Получает ордеры из торговой истории с возможностью фильтрации по тикету или позиции

history_deals_total

Получает количество сделок в торговой истории в указанном интервале

history_deals_get

Получает сделки из торговой истории с возможностью фильтрации по тикету или позиции

Пример подключения Python к MetaTrader 5

  1. Скачайте последнюю версию Python 3.8 со страницы https://www.python.org/downloads/windows
  2. При установке Python отметьте чек-бокс "Add Python 3.8 to PATH%", чтобы можно было из командной строки запускать скрипты на Python.
  3. Установите модуль MetaTrader5 из командной строки

  pip install MetaTrader5

  1. Добавьте пакеты matplotlib и pandas

  pip install matplotlib
  pip install pandas

  1. Запустите тестовый скрипт

from datetime import datetime
import matplotlib.pyplot as plt
import pandas as pd
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
import MetaTrader5 as mt5
 
# подключимся к MetaTrader 5
if not mt5.initialize():
    print("initialize() failed")
    mt5.shutdown()
 
# запросим статус и параметры подключения
print(mt5.terminal_info())
# получим информацию о версии MetaTrader 5
print(mt5.version())
 
# запросим 1000 тиков с EURAUD 
euraud_ticks = mt5.copy_ticks_from("EURAUD"datetime(2020,1,28,13), 1000mt5.COPY_TICKS_ALL)
# запросим тики с AUDUSD в интервале 2019.04.01 13:00 - 2019.04.02 13:00 
audusd_ticks = mt5.copy_ticks_range("AUDUSD"datetime(2020,1,27,13), datetime(2020,1,28,13), mt5.COPY_TICKS_ALL)
 
# получим бары с разных инструментов разными способами
eurusd_rates = mt5.copy_rates_from("EURUSD"mt5.TIMEFRAME_M1datetime(2020,1,28,13), 1000)
eurgbp_rates = mt5.copy_rates_from_pos("EURGBP"mt5.TIMEFRAME_M101000)
eurcad_rates = mt5.copy_rates_range("EURCAD"mt5.TIMEFRAME_M1datetime(2020,1,27,13), datetime(2020,1,28,13))
 
# завершим подключение к MetaTrader 5
mt5.shutdown()
 
#DATA
print('euraud_ticks(', len(euraud_ticks), ')')
for val in euraud_ticks[:10]: print(val)
 
print('audusd_ticks(', len(audusd_ticks), ')')
for val in audusd_ticks[:10]: print(val)
 
print('eurusd_rates(', len(eurusd_rates), ')')
for val in eurusd_rates[:10]: print(val)
 
print('eurgbp_rates(', len(eurgbp_rates), ')')
for val in eurgbp_rates[:10]: print(val)
 
print('eurcad_rates(', len(eurcad_rates), ')')
for val in eurcad_rates[:10]: print(val)
 
#PLOT
# создадим из полученных данных DataFrame
ticks_frame = pd.DataFrame(euraud_ticks)
# сделаем отрисовку тиков на графике
plt.plot(ticks_frame['time'], ticks_frame['ask'], 'r-', label='ask')
plt.plot(ticks_frame['time'], ticks_frame['bid'], 'b-', label='bid')
 
# выведем легенды 
plt.legend(loc='upper left')
 
# добавим заголовок 
plt.title('EURAUD ticks')
 
# покажем график
plt.show()

  1. Получите данные и график
    python_script_chart

[2, 'MetaQuotes-Demo', '16167573']
[5002325, '19 Feb 2020']
 
euraud_ticks( 1000 )
(1580209200, 1.63412, 1.63437, 0., 0, 1580209200067, 130, 0.)
(1580209200, 1.63416, 1.63437, 0., 0, 1580209200785, 130, 0.)
(1580209201, 1.63415, 1.63437, 0., 0, 1580209201980, 130, 0.)
(1580209202, 1.63419, 1.63445, 0., 0, 1580209202192, 134, 0.)
(1580209203, 1.6342, 1.63445, 0., 0, 1580209203004, 130, 0.)
(1580209203, 1.63419, 1.63445, 0., 0, 1580209203487, 130, 0.)
(1580209203, 1.6342, 1.63445, 0., 0, 1580209203694, 130, 0.)
(1580209203, 1.63419, 1.63445, 0., 0, 1580209203990, 130, 0.)
(1580209204, 1.63421, 1.63445, 0., 0, 1580209204194, 130, 0.)
(1580209204, 1.63425, 1.63445, 0., 0, 1580209204392, 130, 0.)
audusd_ticks( 40449 )
(1580122800, 0.67858, 0.67868, 0., 0, 1580122800244, 130, 0.)
(1580122800, 0.67858, 0.67867, 0., 0, 1580122800429, 4, 0.)
(1580122800, 0.67858, 0.67865, 0., 0, 1580122800817, 4, 0.)
(1580122801, 0.67858, 0.67866, 0., 0, 1580122801618, 4, 0.)
(1580122802, 0.67858, 0.67865, 0., 0, 1580122802928, 4, 0.)
(1580122809, 0.67855, 0.67865, 0., 0, 1580122809526, 130, 0.)
(1580122809, 0.67855, 0.67864, 0., 0, 1580122809699, 4, 0.)
(1580122813, 0.67855, 0.67863, 0., 0, 1580122813576, 4, 0.)
(1580122815, 0.67856, 0.67863, 0., 0, 1580122815190, 130, 0.)
(1580122815, 0.67855, 0.67863, 0., 0, 1580122815479, 130, 0.)
eurusd_rates( 1000 )
(1580149260, 1.10132, 1.10151, 1.10131, 1.10149, 44, 1, 0)
(1580149320, 1.10149, 1.10161, 1.10143, 1.10154, 42, 1, 0)
(1580149380, 1.10154, 1.10176, 1.10154, 1.10174, 40, 2, 0)
(1580149440, 1.10174, 1.10189, 1.10168, 1.10187, 47, 1, 0)
(1580149500, 1.10185, 1.10191, 1.1018, 1.10182, 53, 1, 0)
(1580149560, 1.10182, 1.10184, 1.10176, 1.10183, 25, 3, 0)
(1580149620, 1.10183, 1.10187, 1.10177, 1.10187, 49, 2, 0)
(1580149680, 1.10187, 1.1019, 1.1018, 1.10187, 53, 1, 0)
(1580149740, 1.10187, 1.10202, 1.10187, 1.10198, 28, 2, 0)
(1580149800, 1.10198, 1.10198, 1.10183, 1.10188, 39, 2, 0)
eurgbp_rates( 1000 )
(1582236360, 0.83767, 0.83767, 0.83764, 0.83765, 23, 9, 0)
(1582236420, 0.83765, 0.83765, 0.83764, 0.83765, 15, 8, 0)
(1582236480, 0.83765, 0.83766, 0.83762, 0.83765, 19, 7, 0)
(1582236540, 0.83765, 0.83768, 0.83758, 0.83763, 39, 6, 0)
(1582236600, 0.83763, 0.83768, 0.83763, 0.83767, 21, 6, 0)
(1582236660, 0.83767, 0.83775, 0.83765, 0.83769, 63, 5, 0)
(1582236720, 0.83769, 0.8377, 0.83758, 0.83764, 40, 7, 0)
(1582236780, 0.83766, 0.83769, 0.8376, 0.83766, 37, 6, 0)
(1582236840, 0.83766, 0.83772, 0.83763, 0.83772, 22, 6, 0)
(1582236900, 0.83772, 0.83773, 0.83768, 0.8377, 36, 5, 0)
eurcad_rates( 1441 )
(1580122800, 1.45321, 1.45329, 1.4526, 1.4528, 146, 15, 0)
(1580122860, 1.4528, 1.45315, 1.45274, 1.45301, 93, 15, 0)
(1580122920, 1.453, 1.45304, 1.45264, 1.45264, 82, 15, 0)
(1580122980, 1.45263, 1.45279, 1.45231, 1.45277, 109, 15, 0)
(1580123040, 1.45275, 1.4528, 1.45259, 1.45271, 53, 14, 0)
(1580123100, 1.45273, 1.45285, 1.45269, 1.4528, 62, 16, 0)
(1580123160, 1.4528, 1.45284, 1.45267, 1.45282, 64, 14, 0)
(1580123220, 1.45282, 1.45299, 1.45261, 1.45272, 48, 14, 0)
(1580123280, 1.45272, 1.45275, 1.45255, 1.45275, 74, 14, 0)
(1580123340, 1.45275, 1.4528, 1.4526, 1.4528, 94, 13, 0)