HistorySelect может приводить к утечкам памяти, зависаниям терминала или неполной загрузке сделок. Решение — фрагментированная (почаночная) загрузка истории с шагом в N дней, что гарантирует стабильность и низкое потребление RAM.Исходный код
Ниже представлен готовый класс CHistoryLoader, реализующий паттерн постраничной/фрагментированной выборки сделок из базы данных терминала MT5. Этот подход критически важен для высокочастотных роботов и систем бэктестинга, оперирующих миллионами транзакций.
Для построения сложных торговых систем и выгрузки отчетов во внешние сервисы, например, в Telegram, вам может потребоваться Асинхронный Telegram-бот в MQL5 через Socket API.
//+------------------------------------------------------------------+
//| HistoryLoader.mq5 |
//| Copyright 2024, Finfluct |
//+------------------------------------------------------------------+
#property strict
class CHistoryLoader
{
private:
datetime m_from;
datetime m_to;
int m_chunk_days;
public:
CHistoryLoader(datetime from, datetime to, int chunk_days = 30)
: m_from(from), m_to(to), m_chunk_days(chunk_days) {}
ulong LoadDeals()
{
ulong total_deals_processed = 0;
datetime current_from = m_from;
datetime step_seconds = m_chunk_days * 24 * 3600;
while(current_from < m_to)
{
datetime current_to = current_from + step_seconds;
if(current_to > m_to)
current_to = m_to;
ResetLastError();
if(HistorySelect(current_from, current_to))
{
int deals_in_chunk = HistoryDealsTotal();
for(int i = 0; i < deals_in_chunk; i++)
{
ulong ticket = HistoryDealGetTicket(i);
if(ticket > 0)
{
// Здесь выполняется процессинг сделки
total_deals_processed++;
}
}
}
else
{
PrintFormat("Ошибка загрузки истории для интервала %s - %s. Код ошибки: %d",
TimeToString(current_from), TimeToString(current_to), GetLastError());
}
current_from = current_to + 1; // Сдвигаем на 1 секунду вперед во избежание дублирования на стыках
}
return total_deals_processed;
}
};
void OnStart()
{
datetime to = TimeCurrent();
datetime from = to - 365 * 24 * 3600; // Запрос истории за 1 год
CHistoryLoader loader(from, to, 30); // Чанки по 30 дней
ulong total = loader.LoadDeals();
PrintFormat("Успешно обработано сделок: %d", total);
} Разбор параметров
from: Начальная дата и время, с которых начинается выборка торговой истории.to: Конечная дата и время, до которых запрашивается история сделок.chunk_days: Размер временного интервала (в днях) для одного запросаHistorySelect. Оптимальное значение — от 7 до 30 дней в зависимости от интенсивности торговли на счете.
Как запустить
1. Откройте MetaEditor в терминале MetaTrader 5.
2. Создайте новый скрипт (MQL5 Wizard -> Скрипт) и назовите его, например, HistoryLoaderScript.mq5.
3. Скопируйте представленный выше код и вставьте его в созданный файл.
4. Скомпилируйте скрипт, нажав клавишу F7.
5. Перетащите скомпилированный скрипт из навигатора MetaTrader 5 на любой открытый график.
6. Вкладка ‘Эксперты’ в терминале отобразит лог выполнения и количество успешно обработанных сделок.
Если вы работаете на срочном рынке РФ, обратите внимание на Расчет лота для фьючерсов MOEX в MQL5 с учетом шага цены.
Для анализа эффективности торговли по средневзвешенной цене объема используйте Реализация сессионного VWAP в MQL5: Пошаговое руководство.




