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()) Этот простой шаг открывает доступ к мощнейшим инструментам анализа временных рядов, машинному обучению и библиотекам визуализации.




