CalendarValueLast

Получает массив значений по всем событиям с фильтрацией по стране и/или валюте с момента состояния базы Календаря с заданным change_id.

int  CalendarValueLast(
   ulong&               change_id,             // идентификатор изменения 
   MqlCalendarValue&    values[],              // массив для получения описаний значений 
   const string         country_code=NULL,     // кодовое имя страны по ISO 3166-1 alpha-2
   const string         currency=NULL          // кодовое наименование валюты страны 
   );

Параметры

change_id

[in][out]  Идентификатор изменения.

values[]

[out]  Массив типа MqlCalendarValue для получения значений события. Смотри пример обработки событий календаря.

country_code=NULL

[in]  Кодовое имя страны согласно ISO 3166-1 alpha-2

currency=NULL

[in]  Кодовое наименование валюты страны.

Возвращаемое значение

Количество полученных значений события. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Возможные ошибки:

  • 4001 – ERR_INTERNAL_ERROR  (общая ошибка исполняющей системы),
  • 4004 – ERR_NOT_ENOUGH_MEMORY (не достаточно памяти для выполнения запроса),
  • 5401 – ERR_CALENDAR_TIMEOUT (превышен лимит запроса по времени),
  • 5400 – ERR_CALENDAR_MORE_DATA (размер массива недостаточен для получения описаний всех значений, поэтому получили только то, что вместилось),
  • ошибки неудачного выполнения ArrayResize()

Примечание

Все функции для работы с Экономическим календарем используют время торгового сервера (TimeTradeServer). Это означает, что время в структуре MqlCalendarValue и входящие параметры времени в функциях CalendarValueHistoryByEvent/CalendarValueHistory задаются в таймзоне торгового сервера, а не в локальном времени пользователя.

Если в функцию был передан массив events[] фиксированной длины и в результате запроса не хватило места для сохранения всего результата, будет взведена ошибка ERR_CALENDAR_MORE_DATA (5400).

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

Для фильтров country_code и currency значения NULL и "" равносильны – означают отсутствие фильтра.

Для country_code следует использовать поле code структуры MqlCalendarCountry, например "US", "RU" или "EU".

Для currency следует использовать поле currency структуры MqlCalendarCountry, например "USD", "RUB" или "EUR".

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

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

Структура 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.

Пример эксперта, который слушает появление событий Экономического календаря:

#property description "Пример использования функции CalendarValueLast"
#property description " для создания слушателя событий Экономического календаря."
#property description "Для этого необходимо получить текущий идентификатор изменения"
#property description " базы Календаря. И затем по этому идентификатору получать"
#property description " только новые события для через опрос в таймере"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- идентификатор изменения базы Календаря
   static ulong calendar_change_id=0;
//--- признак первого запуска
   static bool first=true;
//--- массив значений событий
   MqlCalendarValue values[];
//--- проведем инициализацию - получим текущий calendar_change_id
   if(first)
     {
      //--- получим идентификатор изменения базы Календаря   
      if(CalendarValueLast(calendar_change_id,values)>0)
        {
         //--- этот блок кода не может выполниться при первом запуске, но мы его все равно пропишем
         PrintFormat("%s: Получен текущий идентификатор базы Календаря: change_id=%d",
                     __FUNCTION__,calendar_change_id);
         //--- выставим флаг и выйдем до следущего события таймера
         first=false;
         return;
        }
      else
        {
         //--- данные не получены (для первого запуска это нормально), проверим наличие ошибки
         int error_code=GetLastError();
         if(error_code==0)
           {
            PrintFormat("%s: Получен текущий идентификатор базы Календаря: change_id=%d",
                        __FUNCTION__,calendar_change_id);
            //--- выставим флаг и выйдем до следущего события таймера
            first=false;
            //--- теперь у нас есть значение calendar_change_id
            return;
           }
         else
           {
            //--- а вот это действительно ошибка            
            PrintFormat("%s: Не удалось получить события в CalendarValueLast. Код ошибки: %d",
                        __FUNCTION__,error_code);
            //--- неудачное завершение работы, попробуем провести инициализацию заново при следующем вызове таймера         
            return;
           }
        }
     }
 
//--- у нас есть последнее известное значение идентификатора изменения Календаря (change_id)
   ulong old_change_id=calendar_change_id;
//--- проверим - не появились ли новые события Календаря
   if(CalendarValueLast(calendar_change_id,values)>0)
     {
      PrintFormat("%s: Получены новые события Календаря: %d",
                  __FUNCTION__,ArraySize(values));
      //--- выведем в Журнал информацию из массива values 
      ArrayPrint(values);
      //--- выведем в Журнал значения предыдущего и нового идентификатора Календаря
      PrintFormat("%s: Предыдущий change_id=%d, новый change_id=%d",
                  __FUNCTION__,old_change_id,calendar_change_id);
      //--- выведем в Журнал новые события
      ArrayPrint(values);
      /* 
      пропишите здесь свой код, который будет обрабатывать появление событий
      */
     }
//---     
  }
/*
   Пример работы слушателя:
   OnTimer: Получен текущий идентификатор базы Календаря: change_id=33281792
   OnTimer: Получены новые события для Календаря: 1
        [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [reserved]
   [0] 91040   76020013 2019.03.20 15:30:00 1970.01.01 00:00:00          0       -5077000     -1913000 -9223372036854775808         -4077000             2          0
   OnTimer: Предыдущий change_id=33281792, новый change_id=33282048
        [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [reserved]
   [0] 91040   76020013 2019.03.20 15:30:00 1970.01.01 00:00:00          0       -5077000     -1913000 -9223372036854775808         -4077000             2          0
   OnTimer: Получены новые события для Календаря: 1
        [id] [event_id]              [time]            [period] [revision]       [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [reserved]
   [0] 91041   76020013 2019.03.27 15:30:00 1970.01.01 00:00:00          0 -9223372036854775808     -5077000 -9223372036854775808         -7292000             0          0
   OnTimer: Предыдущий change_id=33282048, новый change_id=33282560
        [id] [event_id]              [time]            [period] [revision]       [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [reserved]
   [0] 91041   76020013 2019.03.27 15:30:00 1970.01.01 00:00:00          0 -9223372036854775808     -5077000 -9223372036854775808         -7292000             0          0
 
*/  

Смотри также

CalendarValueLast, CalendarValueHistory, CalendarValueHistoryByEvent, CalendarValueById