Экспорт тиковой истории из MT5 в CSV с помощью CopyTicksRange

Экспорт тиковой истории из MT5 в CSV с помощью CopyTicksRange КРЕДИТЫ, ИПОТЕКА и БАНКИ
Пошаговое руководство по экспорту тиковой истории из MetaTrader 5 в формат CSV с помощью функции CopyTicksRange для последующего анализа в Python.
Суть: Скрипт на MQL5 использует функцию CopyTicksRange для эффективной выгрузки тиковой истории (время в миллисекундах, Bid, Ask, Last, Volume, Flags) в CSV-файл, который затем легко импортируется в Python через pandas.read_csv() для количественного анализа и бэктестинга.

Исходный код

Для разработки качественных торговых роботов и проведения количественных исследований (Quantitative Analysis) стандартных минутных баров часто недостаточно. Нам необходима полная тиковая история. Терминал MetaTrader 5 предоставляет мощный инструментарий для работы с тиками, однако проводить глубокий статистический анализ, применять машинное обучение или строить сложные модели гораздо удобнее в экосистеме Python.

В этой статье мы создадим профессиональный скрипт на MQL5, который выгружает тиковую историю за заданный диапазон дат в оптимизированный CSV-формат. Полученные данные будут содержать точные временные метки в миллисекундах, цены Bid/Ask, цены сделок Last, реальные объемы и системные флаги тиков.

Ниже представлен полный код скрипта для MetaTrader 5. Скрипт автоматически определяет разрядность котировок (знаки после запятой) и сохраняет файл в локальную папку терминала MQL5/Files.

//+------------------------------------------------------------------+
//|                                            ExportTicksToCSV.mq5  |
//|                                  Copyright 2024, Finfluct.com    |
//|                                             https://finfluct.com |
//+------------------------------------------------------------------+
#property copyright "Finfluct.com"
#property link      "https://finfluct.com"
#property version   "1.00"
#property script_show_inputs

//--- Входные параметры
input datetime InpStartDate = D'2024.01.01 00:00:00'; // Дата начала
input datetime InpEndDate   = D'2024.01.02 00:00:00'; // Дата окончания
input string   InpSymbol    = "";                     // Инструмент (пусто - текущий)

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   string symbol = (InpSymbol == "") ? _Symbol : InpSymbol;
   datetime start_time = InpStartDate;
   datetime end_time = InpEndDate;

   PrintFormat("Запуск экспорта тиков для %s с %s по %s", symbol, TimeToString(start_time), TimeToString(end_time));

   // Переводим время в миллисекунды для CopyTicksRange
   long start_ms = (long)start_time * 1000;
   long end_ms = (long)end_time * 1000;

   MqlTick ticks[];
   ResetLastError();
   
   // Запрашиваем тики из базы терминала
   int copied = CopyTicksRange(symbol, ticks, COPY_TICKS_ALL, start_ms, end_ms);
   if(copied <= 0)
   {
      PrintFormat("Ошибка копирования тиков. Код ошибки: %d", GetLastError());
      return;
   }

   PrintFormat("Успешно получено %d тиков. Запись в CSV...", copied);

   // Формируем имя файла
   string filename = symbol + "_ticks.csv";

   // Открываем файл для записи в режиме ANSI
   int file_handle = FileOpen(filename, FILE_WRITE|FILE_CSV|FILE_ANSI, ',');
   if(file_handle == INVALID_HANDLE)
   {
      PrintFormat("Не удалось открыть файл %s. Код ошибки: %d", filename, GetLastError());
      return;
   }

   // Записываем заголовки столбцов
   FileWrite(file_handle, "time_ms", "bid", "ask", "last", "volume", "flags");

   int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);

   // Записываем тиковые данные
   for(int i = 0; i < copied; i++)
   {
      FileWrite(file_handle, 
                ticks[i].time_msc, 
                DoubleToString(ticks[i].bid, digits), 
                DoubleToString(ticks[i].ask, digits), 
                DoubleToString(ticks[i].last, digits), 
                ticks[i].volume_real, 
                ticks[i].flags);
   }

   FileClose(file_handle);
   PrintFormat("Экспорт завершен. Файл сохранен: MQL5\\Files\\%s", filename);
}

Разбор параметров

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

  • InpStartDate: Начальная дата и время для выгрузки истории. По умолчанию установлена на начало 2024 года.
  • InpEndDate: Конечная дата и время выгрузки. Позволяет точно ограничить размер получаемого файла.
  • InpSymbol: Строковый параметр для указания тикера. Если оставить поле пустым, скрипт автоматически возьмет текущий инструмент с графика.
  • CopyTicksRange: Системная функция MQL5, которая извлекает тики из локальной базы данных терминала. Мы используем флаг COPY_TICKS_ALL для получения полной информации (включая транзакции Last и объемы).
  • ticks[i].time_msc: Время прихода тика в миллисекундах с 01.01.1970. Это критически важно для высокочастотного анализа (HFT), где несколько тиков могут прийти в течение одной секунды.

Как запустить

Для успешного экспорта данных выполните следующие шаги:

1. Откройте MetaEditor в MT5 (клавиша F4), создайте новый Скрипт, назовите его ExportTicksToCSV и вставьте код выше. Скомпилируйте его.

2. Вернитесь в терминал MT5, найдите скрипт в окне 'Навигатор' и перетащите его на график нужного инструмента.

3. В появившемся окне параметров укажите интересующий вас диапазон дат и нажмите ОК.

4. После завершения работы скрипта откройте папку файлов терминала: Файл -> Открыть каталог данных, перейдите по пути MQL5/Files/ и найдите ваш CSV-файл.

Полученные тиковые данные с объемами и флагами сделок идеально подходят для построения сложных микроструктурных индикаторов. Например, вы можете использовать эту историю для того, чтобы реализовать алгоритм Bid/Ask Imbalance в MQL5 или прототипировать его на Python.

Если вы анализируете взаимосвязи между различными классами активов, экспорт тиков поможет провести расчет корреляции VIX и валют в MT5: Custom Symbol на более глубоком тиковом уровне.

Для визуализации результатов анализа обратно в терминале часто требуются интерактивные элементы. О том, как управлять уровнями на графике, читайте в статье про MQL5 Drag-and-Drop: Перетаскивание торговых уровней на графике.

Анализ данных в Python

После экспорта вы можете легко загрузить данные в Python с помощью библиотеки pandas для дальнейшего анализа:

import pandas as pd

# Загрузка данных
df = pd.read_csv('EURUSD_ticks.csv')

# Преобразование миллисекунд в datetime
df['datetime'] = pd.to_datetime(df['time_ms'], unit='ms')
df.set_index('datetime', inplace=True)

print(df.head())

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

Оцените статью
FinFluct