Структуры экономического календаря

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

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

Описания стран задаются структурой MqlCalendarCountry. Используется в функциях CalendarCountryById() и CalendarCountries()

struct MqlCalendarCountry
  {
   ulong                               id;                    // идентификатор страны по стандарту ISO 3166-1
   string                              name;                  // текстовое имя страны (в текущей кодировке терминала)
   string                              code;                  // кодовое имя страны ISO 3166-1 alpha-2
   string                              currency;              // код валюты страны
   string                              currency_symbol;       // символ/знак валюты страны
   string                              url_name;              // имя страны, используемое в URL на сайте mql5.com
  };

 

Описания событий задаются структурой MqlCalendarEvent. Используется в функциях CalendarEventById(), CalendarEventByCountry() и CalendarEventByCurrency()

struct MqlCalendarEvent
  {
   ulong                               id;                    // идентификатор события
   ENUM_CALENDAR_EVENT_TYPE            type;                  // тип события из перечисления ENUM_CALENDAR_EVENT_TYPE
   ENUM_CALENDAR_EVENT_SECTOR          sector;                // сектор, к которому относится событие
   ENUM_CALENDAR_EVENT_FREQUENCY       frequency;             // частота (периодичность) события
   ENUM_CALENDAR_EVENT_TIMEMODE        time_mode;             // режим времени события
   ulong                               country_id;            // идентификатор страны
   ENUM_CALENDAR_EVENT_UNIT            unit;                  // единица измерения значения экономического индикатора
   ENUM_CALENDAR_EVENT_IMPORTANCE      importance;            // важность события
   ENUM_CALENDAR_EVENT_MULTIPLIER      multiplier;            // множитель значения экономического индикатора
   uint                                digits;                // количество знаков после запятой
   string                              source_url;            // URL источника, где публикуется событие
   string                              event_code;            // код события
   string                              name;                  // текстовое имя события на языке терминала (в текущей кодировке терминала)
  };

 

Значения событий задаются структурой MqlCalendarValue. Используется в функциях CalendarValueById(), CalendarValueHistoryByEvent(), CalendarValueHistory(), CalendarValueLastByEvent() и CalendarValueLast()

struct MqlCalendarValue
  {
   ulong                               id;                    // ID значения
   ulong                               event_id;              // ID события
   datetime                            time;                  // время и дата события
   datetime                            period;                // отчетный период события
   int                                 revision;              // ревизия публикуемого индикатора по отношению к отчетному периоду
   long                                actual_value;          // актуальное значение в миллионных долях или LONG_MIN, если значение не задано
   long                                prev_value;            // предыдущее значение в миллионных долях или LONG_MIN, если значение не задано
   long                                revised_prev_value;    // пересмотренное предыдущее значение в миллионных долях или LONG_MIN, если значение не задано
   long                                forecast_value;        // прогнозное значение в миллионных долях или LONG_MIN, если значение не задано
   ENUM_CALENDAR_EVENT_IMPACT          impact_type;           // потенциальное влияние на курс валюты
   //--- функции для проверки значений
   bool                         HasActualValue(voidconst;   // возвращет true, если значение в поле actual_value задано
   bool                         HasPreviousValue(voidconst; // возвращет true, если значение в поле prev_value задано
   bool                         HasRevisedValue(voidconst;  // возвращет true, если значение в поле revised_prev_value задано
   bool                         HasForecastValue(voidconst; // возвращет true, если значение в поле forecast_value задано
   //--- функции для получение значений
   double                       GetActualValue(voidconst;   // возвращает actual_value или nan, если значение не задано
   double                       GetPreviousValue(voidconst; // возвращает prev_value или nan, если значение не задано
   double                       GetRevisedValue(voidconst;  // возвращает revised_prev_value или nan, если значение не задано
   double                       GetForecastValue(voidconst; // возвращает forecast_value или nan, если значение не задано
  };

Структура MqlCalendarValue предоставляет методы для проверки и получения значений из полей actual_value, forecast_value, prev_value и revised_prev_value. Если значение поля не задано, то поле хранит значение LONG_MIN (-9223372036854775808).

При этом необходимо иметь в виду, что значения в этих полях хранятся увеличенными в миллион раз. Это означает, что при получении значений в MqlCalendarValue функциями CalendarValueById, CalendarValueHistoryByEvent, CalendarValueHistory, CalendarValueLastByEvent и CalendarValueLast, значения этих полей нужно проверять на равенство LONG_MIN, и если значение в поле задано, то для получения значения необходимо разделить значение поля на 1 000 000 (миллион). Другой способ получения значений – делать проверку и получать значения функциями самой структуры MqlCalendarValue.

Пример обработки событий календаря:

//--- создадим свою структуру под хранение событий календаря с вещественными значениям вместо целочисленных
struct AdjustedCalendarValue
  {
   ulong                               id;                    // ID значения
   ulong                               event_id;              // ID события
   datetime                            time;                  // время и дата события
   datetime                            period;                // отчетный период события
   int                                 revision;              // ревизия публикуемого индикатора по отношению к отчетному периоду
   double                              actual_value;          // актуальное значение показателя
   double                              prev_value;            // предыдущее значение показателя
   double                              revised_prev_value;    // пересмотренное предыдущее значение показателя
   double                              forecast_value;        // прогнозное значение показателя
   ENUM_CALENDAR_EVENT_IMPACT          impact_type;           // потенциальное влияние на курс валюты
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
//--- код страны для Европейского союза по стандарту ISO 3166-1 Alpha-2
   string EU_code="EU";
//--- получим все значения событий по Европейскому союзу
   MqlCalendarValue values[];
//--- зададим границы диапазона, из которого берем события
   datetime date_from=D'01.01.2021';  // берем все события с 2021 года
   datetime date_to=0;                // 0 означает все известные события, даже те, что не наступили еще
//--- запросим историю события по Европейскому союзу с 2021 года
   if(!CalendarValueHistory(valuesdate_fromdate_toEU_code))
     {
      PrintFormat("Ошибка! Не удалось получить события по стране country_code=%s"EU_code);
      PrintFormat("Код ошибки: %d"GetLastError());
      return;
     }
   else
      PrintFormat("Получены значения событий по country_code=%s: %d",
                  EU_codeArraySize(values));
//--- уменьшим размер массива для вывода в Журнал
   if(ArraySize(values)>5)
      ArrayResize(values5);
//--- выведем значения событий в Журнал как есть, без проверок и приведения к актуальным значениям
   Print("Выводим значения календаря как есть");
   ArrayPrint(values);
 
//--- проверим значения полей и приведем к актуальным значениям
//--- первый вариант проверок и получения значений
   AdjustedCalendarValue values_adjusted_1[];
   int total=ArraySize(values);
   ArrayResize(values_adjusted_1total);
//--- копируем значения с проверками и корректировками
   for(int i=0i<totali++)
     {
      values_adjusted_1[i].id=values[i].id;
      values_adjusted_1[i].event_id=values[i].event_id;
      values_adjusted_1[i].time=values[i].time;
      values_adjusted_1[i].period=values[i].period;
      values_adjusted_1[i].revision=values[i].revision;
      values_adjusted_1[i].impact_type=values[i].impact_type;
      //--- делаем проверки значений и делим на 1 000 000
      if(values[i].actual_value==LONG_MIN)
         values_adjusted_1[i].actual_value=double("nan");
      else
         values_adjusted_1[i].actual_value=values[i].actual_value/1000000.;
 
      if(values[i].prev_value==LONG_MIN)
         values_adjusted_1[i].prev_value=double("nan");
      else
         values_adjusted_1[i].prev_value=values[i].prev_value/1000000.;
 
      if(values[i].revised_prev_value==LONG_MIN)
         values_adjusted_1[i].revised_prev_value=double("nan");
      else
         values_adjusted_1[i].revised_prev_value=values[i].revised_prev_value/1000000.;
 
      if(values[i].forecast_value==LONG_MIN)
         values_adjusted_1[i].forecast_value=double("nan");
      else
         values_adjusted_1[i].forecast_value=values[i].forecast_value/1000000.;
     }
   Print("Первый способ проверки и получения значений календаря");
   ArrayPrint(values_adjusted_1);
 
//--- второй вариант проверок и получения значений
   AdjustedCalendarValue values_adjusted_2[];
   ArrayResize(values_adjusted_2total);
//--- копируем значения с проверками и корректировками
   for(int i=0i<totali++)
     {
      values_adjusted_2[i].id=values[i].id;
      values_adjusted_2[i].event_id=values[i].event_id;
      values_adjusted_2[i].time=values[i].time;
      values_adjusted_2[i].period=values[i].period;
      values_adjusted_2[i].revision=values[i].revision;
      values_adjusted_2[i].impact_type=values[i].impact_type;
      //--- делаем проверки и получаем значения
      if(values[i].HasActualValue())
         values_adjusted_2[i].actual_value=values[i].GetActualValue();
      else
         values_adjusted_2[i].actual_value=double("nan");
 
      if(values[i].HasPreviousValue())
         values_adjusted_2[i].prev_value=values[i].GetPreviousValue();
      else
         values_adjusted_2[i].prev_value=double("nan");
 
      if(values[i].HasRevisedValue())
         values_adjusted_2[i].revised_prev_value=values[i].GetRevisedValue();
      else
         values_adjusted_2[i].revised_prev_value=double("nan");
 
      if(values[i].HasForecastValue())
         values_adjusted_2[i].forecast_value=values[i].GetForecastValue();
      else
         values_adjusted_2[i].forecast_value=double("nan");
     }
   Print("Второй способ проверки и получения значений календаря");
   ArrayPrint(values_adjusted_2);
 
//--- третий вариант получения значений - без проверок
   AdjustedCalendarValue values_adjusted_3[];
   ArrayResize(values_adjusted_3total);
//--- копируем значения с проверками и корректировками
   for(int i=0i<totali++)
     {
      values_adjusted_3[i].id=values[i].id;
      values_adjusted_3[i].event_id=values[i].event_id;
      values_adjusted_3[i].time=values[i].time;
      values_adjusted_3[i].period=values[i].period;
      values_adjusted_3[i].revision=values[i].revision;
      values_adjusted_3[i].impact_type=values[i].impact_type;
      //--- получаем значения без проверок
      values_adjusted_3[i].actual_value=values[i].GetActualValue();
      values_adjusted_3[i].prev_value=values[i].GetPreviousValue();
      values_adjusted_3[i].revised_prev_value=values[i].GetRevisedValue();
      values_adjusted_3[i].forecast_value=values[i].GetForecastValue();
     }
   Print("Третий способ получения значений календаря - без проверок");
   ArrayPrint(values_adjusted_3);
  }
/*
   Получены значения событий по country_code=EU1051
   Выводим значения календаря как есть
         [id] [event_id]              [time]            [period] [revision]       [actual_value]         [prev_value] [revised_prev_value]     [forecast_value] [impact_type] [reserved]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3             55200000             55500000 -9223372036854775808             55500000             2        ...
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0            143100000            143900000 -9223372036854775808 -9223372036854775808             0        ...
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808             0        ...
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0             11000000             10500000 -9223372036854775808             11000000             0        ...
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0              3100000              3100000              3200000              3100000             0        ...
   Первый способ проверки и получения значений календаря
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
   Второй способ проверки и получения значений календаря
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
   Третий способ получения значений календаря - без проверок
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
*/

 

Частота (периодичность) события указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_FREQUENCY

Идентификатор

Описание

CALENDAR_FREQUENCY_NONE

Частота публикации не задана

CALENDAR_FREQUENCY_WEEK

Публикация один раз в неделю

CALENDAR_FREQUENCY_MONTH

Публикация один раз в месяц

CALENDAR_FREQUENCY_QUARTER

Публикация один раз в квартал

CALENDAR_FREQUENCY_YEAR

Публикация один раз в год

CALENDAR_FREQUENCY_DAY

Публикация один раз в день

 

Тип события указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_TYPE

Идентификатор

Описание

CALENDAR_TYPE_EVENT

Событие (митинг, речь и так далее)

CALENDAR_TYPE_INDICATOR

Индикатор

CALENDAR_TYPE_HOLIDAY

Праздник

 

Сектор экономики, к которому относится событие, указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_SECTOR

Идентификатор

Описание

CALENDAR_SECTOR_NONE

Сектор не задан

CALENDAR_SECTOR_MARKET

Рынок, биржа

CALENDAR_SECTOR_GDP

Валовый внутренний продукт (GDP)

CALENDAR_SECTOR_JOBS

Рынок труда

CALENDAR_SECTOR_PRICES

Цены

CALENDAR_SECTOR_MONEY

Деньги

CALENDAR_SECTOR_TRADE

Торговля

CALENDAR_SECTOR_GOVERNMENT

Правительство

CALENDAR_SECTOR_BUSINESS

Бизнес

CALENDAR_SECTOR_CONSUMER

Потребление

CALENDAR_SECTOR_HOUSING

Жилье

CALENDAR_SECTOR_TAXES

Налоги

CALENDAR_SECTOR_HOLIDAYS

Праздники

 

Важность события указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_IMPORTANCE

Идентификатор

Описание

CALENDAR_IMPORTANCE_NONE

Степень важности не задана

CALENDAR_IMPORTANCE_LOW

Низкая важность

CALENDAR_IMPORTANCE_MODERATE

Средняя важность

CALENDAR_IMPORTANCE_HIGH

Высокая важность

 

Тип единицы измерения, в которых даются значения события, указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_UNIT

Идентификатор

Описание

CALENDAR_UNIT_NONE

Единица измерения не задана

CALENDAR_UNIT_PERCENT

Проценты

CALENDAR_UNIT_CURRENCY

Национальная валюта

CALENDAR_UNIT_HOUR

Количество часов

CALENDAR_UNIT_JOB

Количество рабочих мест

CALENDAR_UNIT_RIG

Буровые установки

CALENDAR_UNIT_USD

Доллары США

CALENDAR_UNIT_PEOPLE

Число людей

CALENDAR_UNIT_MORTGAGE

Количество ипотечных кредитов

CALENDAR_UNIT_VOTE

Число голосов

CALENDAR_UNIT_BARREL

Количество баррелях

CALENDAR_UNIT_CUBICFEET

Объем в кубических футах

CALENDAR_UNIT_POSITION

Чистый объем спекулятивных позиций в контрактах

CALENDAR_UNIT_BUILDING

Количество строений

 

В некоторых случаях значения экономического показателя требуют указания множителя, который указывается в структуре MqlCalendarEvent. Возможные значения множителей указаны в перечислении ENUM_CALENDAR_EVENT_MULTIPLIER

Идентификатор

Описание

CALENDAR_MULTIPLIER_NONE

Множитель не задан

CALENDAR_MULTIPLIER_THOUSANDS

Тысячи

CALENDAR_MULTIPLIER_MILLIONS

Миллионы

CALENDAR_MULTIPLIER_BILLIONS

Миллиарды

CALENDAR_MULTIPLIER_TRILLIONS

Триллионы

 

Потенциальное влияние события на курс национальной валюты указывается в структуре MqlCalendarValue. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_IMPACT

Идентификатор

Описание

CALENDAR_IMPACT_NA

Влияния не указано

CALENDAR_IMPACT_POSITIVE

Положительное влияние

CALENDAR_IMPACT_NEGATIVE

Отрицательное влияние

 

Время наступления события указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_TIMEMODE

Идентификатор

Описание

CALENDAR_TIMEMODE_DATETIME

Источник публикует точное время наступления события

CALENDAR_TIMEMODE_DATE

Событие занимает весь день

CALENDAR_TIMEMODE_NOTIME

Источник не публикует время события

CALENDAR_TIMEMODE_TENTATIVE

Источник не публикует предварительно точное время события, только его день. Время уточняется по факту наступления события

 

Смотри также

Экономический календарь