Технические особенности организации и хранения таймсерий

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

Прежде чем ценовые данные будут доступны в терминале для отображения на графиках и передачи в MQL-программы, они скачиваются с сервера и особым образом подготавливаются. Механизм обращения к серверу за данными не зависит от того, каким образом был инициирован запрос — пользователем при навигации по графику или программным способом на языке MQL5.

Данные поступают с сервера в сжатом формате: это экономно упакованные блоки минутных баров, которые, однако, не являются привычными барами M1.

Полученные с сервера данные автоматически распаковываются и сохраняются в специальном промежуточном формате HCC. Данные по каждому символу пишутся в отдельную папку {каталог_терминала}/bases/{имя_сервера}/history/{имя_символа}. Например, данные по символу EURUSD с торгового сервера MetaQuotes-Demo могут находиться в папке C:/Program Files/MetaTrader 5/bases/MetaQuotes-Demo/history/EURUSD/.

Данные записываются в файлы с расширением *.hcc: каждый файл хранит данные минутных баров за год. Например, файл 2021.hcc в папке EURUSD содержит минутные бары по символу EURUSD за 2021 год. Эти файлы используются для подготовки ценовых данных по всем таймфреймам и не предназначены для прямого доступа.

Служебные файлы в формате HCC исполняют роль источника данных для построения ценовых данных по конкретным таймфреймам. Они создаются только по запросу графика или MQL-программы и сохраняются для дальнейшего использования в файлах с расширением *.hc.

Для каждого таймфрейма данные подготавливаются независимо от других таймфреймов. Правила формирования и доступности данных одинаковы для всех таймфреймов, включая M1. То есть, несмотря на то, что единицей хранения данных в формате HCC является минутный бар, их наличие не означает наличие и доступность в том же объеме данных таймфрейма М1 в формате HC.

Для экономии ресурсов данные по таймфрейму загружаются и хранятся в оперативной памяти только по необходимости: при длительном отсутствии обращений к данным происходит их выгрузка из оперативной памяти (но они остаются в файле). Это может сказаться на увеличении времени исполнения последующего запроса таймсерии, если она давно не использовалась. Все востребованные таймсерии, в частности, те, для которых открыты графики, доступны практически мгновенно в отсутствие перегрузок по ресурсам компьютера.

Получение новых данных с сервера вызывает автоматическое обновление используемых ценовых данных в формате HC по всем таймфреймам и перерасчет всех зависящих от них индикаторов.

При обращении MQL-программы к данным по конкретному символу и таймфрейму есть вероятность, что требуемая таймсерия еще не сформирована или не синхронизирована с торговым сервером (например, на нем появились обновленные цены). В этом случае следует в том или ином виде реализовать ожидание готовности данных.

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

Для экспертов и индикаторов лучше использовать событийную модель обработки. Если при обработке события OnTick или OnCalculate не удалось получить все необходимые данные требуемой таймсерии, то следует выйти из обработчика события, ожидая их появления при следующих вызовах обработчика.

Максимальное количество баров
 
Стоит отметить, что максимальное количество баров, которое будет рассчитано для каждой запрошенной пары символ/таймфрейм, не превышает значение параметра Макс. баров в окне в диалоге Настроек терминала. Таким образом, данный параметр накладывает ограничение не только на графики любых таймфреймов, но и на все MQL-программы.
 
Это ограничение предназначено в первую очередь для экономии ресурсов. Устанавливая большие значения данного параметра, следует помнить, что при наличии достаточно глубокой истории ценовых данных для младших таймфреймов расход памяти на хранение таймсерий и буферов индикаторов может составить сотни мегабайт и занять всю оперативную память.
 
Изменение лимита баров вступает в силу только после перезапуска клиентского терминала. Оно влияет на объем запрашиваемых у сервера данных для построения требуемого количества баров рабочих таймфреймов.
 
Ограничение, задаваемое параметром, не является жестким и может быть превышено в определенных случаях. Например, если в начале сеанса история котировок по конкретному таймфрейму достаточна, чтобы выбрать весь лимит, то по мере формирования новых баров их количество может стать больше текущего значения параметра. Актуальное количество доступных баров возвращают функции Bars/iBars.