Отслеживание изменений событий по типу

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

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

int CalendarValueLastByEvent(ulong id, ulong &change_id, MqlCalendarValue &values[])

Функция заполняет передаваемый по ссылке массив values записями о событиях конкретного вида с идентификатором id, которые произошли с момента change_id. Данный параметр change_id является одновременно и входным, и выходным: вызывающий код передает в нем метку прошлого состояния календаря, после которой запрашиваются изменения, а при возврате управления функция записывает в change_id текущую метку состояния базы календаря. Её следует использовать при следующем вызове функции.

Если в функцию передать нулевой change_id, то она не заполняет массив, а просто сообщает через параметр change_id текущее состояние базы.

Массив может быть динамическим (тогда он будет автоматически подстроен под объем данных) или фиксированного размера (если его размер окажется недостаточным, скопируется только то, что уместится).  

Выходное значение функции равно количеству элементов, скопированных в массив values. Если изменений нет, или при вызове было указано change_id = 0, функция вернет 0.

Для проверки на ошибку следует анализировать встроенную переменную _LastError. Некоторые из возможных кодов ошибок:

  • 4004 – ERR_NOT_ENOUGH_MEMORY (недостаточно памяти для выполнения запроса),
  • 5401 – ERR_CALENDAR_TIMEOUT (превышено время ожидания запроса),
  • 5400 – ERR_CALENDAR_MORE_DATA (размер фиксированного массива недостаточен для получения всех значений).

Мы не станем приводить отдельный пример для CalendarValueLastByEvent. Вместо этого обратимся к более сложной, но востребованной задаче по запросу и фильтрации записей календаря с произвольными условиями на атрибуты новостей, где будут задействованы все "календарные" функции API. Этому будет посвящен целиком следующий раздел.