CalendarValueLastByEvent

Получает массив значений события по его ID c момента состояния базы Календаря с заданным change_id.

int  CalendarValueLastByEvent(
   ulong                event_id,      // идентификатор события 
   ulong&               change_id,     // идентификатор значения события 
   MqlCalendarValue&    values[]       // массив для получения описаний значений 
   );

Параметры

event_id

[in]  Идентификатор события.

change_id

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

values[]

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

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

Количество полученных значений события. Чтобы получить информацию об ошибке, необходимо вызвать функцию 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 возвращается текущее состояние базы Календаря.

Функция возвращает массив значений для заданной новости и новое 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.

Пример эксперта, который слушает выход отчета по Nonfarm payrolls:

#property description "Пример использования функции CalendarValueLastByEvent"
#property description " для отлавливания выхода отчета по событию Nonfarm Payrolls."
#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;
//--- идентификатор события   
   static ulong event_id=0;
//--- имя события   
   static string event_name=NULL;
//--- массив значений событий
   MqlCalendarValue values[];
//--- проведем инициализацию - получим текущий calendar_change_id
   if(first)
     {
      MqlCalendarEvent events[];
      //--- код страны для США по стандарту ISO 3166-1 Alpha-2 
      string USA_code="US";
      //--- получим события для США    
      int events_count=CalendarEventByCountry(USA_code,events);
      //--- позиция нужного нам события в массиве events
      int event_pos=-1;
      //--- выведем события для США в Журнал
      if(events_count>0)
        {
         PrintFormat("%s: События для США: %d",__FUNCTION__,events_count);
         for(int i=0;i<events_count;i++)
           {
            string event_name_low=events[i].name;
            //--- приведем к нижнему регистру имя события            
            if(!StringToLower(event_name_low))
              {
               PrintFormat("StringToLower() вернула ошибку %d",GetLastError());
               //--- досрочно выходим из функции
               return;
              }
            //--- поищем событие "Nonfarm Payrolls"            
            if(StringFind(event_name_low,"nonfarm payrolls")!=-1)
              {
               //--- событие найдено, запомним его id
               event_id=events[i].id;
               //--- запишем для события "Nonfarm Payrolls" его имя 
               event_name=events[i].name;
               //--- запомним позицию событий в массиве events[]               
               event_pos=i;
               //--- на самом деле в Календаре есть несколько событий, которые содержат в имени "nonfarm payrolls", имейте в виду
               PrintFormat("Событие \"Nonfarm Payrolls\" найдено: event_id=%d  event_name=%s",event_id,event_name);
               //--- посмотрите все события, закомментировав ниже оператор break, чтобы лучше понять данный пример
               break;
              }
           }
         //--- сократим список, удалим события после события "Nonfarm Payrolls"
         ArrayRemove(events,event_pos+1);
         //--- для удобства изучения оставим 9 событий перед "Nonfarm Payrolls"         
         ArrayRemove(events,0,event_pos-9);
         ArrayPrint(events);
        }
      else
        {
         PrintFormat("%s: CalendarEventByCountry(%s) вернуло 0 событий, код ошибки=%d",
                     USA_code,__FUNCTION__,GetLastError());
         //--- неудачное завершение работы, попробуем заново при следующем вызове таймера         
         return;
        }
 
      //--- получим для указанного события идентификатор изменения базы Календаря   
      if(CalendarValueLastByEvent(event_id,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: Не удалось получить значения для события event_id=%d",__FUNCTION__,event_id);
            PrintFormat("Код ошибки: %d",error_code);
            //--- неудачное завершение работы, попробуем заново при следующем вызове таймера         
            return;
           }
        }
     }
 
//--- у нас есть последнее известное значение идентификатора изменения Календаря (change_id)
   ulong old_change_id=calendar_change_id;
//--- проверим - не появилось ли новое значение события "Nonfarm Payrolls"
   if(CalendarValueLastByEvent(event_id,calendar_change_id,values)>0)
     {
      PrintFormat("%s: Получены новые события для \"%s\": %d",
                  __FUNCTION__,event_name,ArraySize(values));
      //--- выведем в Журнал информацию из массива values 
      ArrayPrint(values);
      //--- выведем в Журнал значения предыдущего и нового идентификатора Календаря
      PrintFormat("%s: Предыдущий change_id=%d, новый change_id=%d",
                  __FUNCTION__,old_change_id,calendar_change_id);
/* 
      пропишите здесь свой код, который будет обрабатывать публикацию данных по "Nonfarm Payrolls"
      */
     }
//---     
  }
/*
   Результат:
   OnTimer: События для США: 202
   Событие "Nonfarm Payrolls" найдено: event_id=840030016  event_name=Nonfarm Payrolls
            [id] [type] [sector] [frequency] [time_mode] [country_id] [unit] [importance] [multiplier] [digits]          [source_url]                             [event_code]                   [name] [reserved]
   [0] 840030007      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "consumer-price-index-yy"                "CPI y/y"                         0
   [1] 840030008      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "consumer-price-index-ex-food-energy-yy" "Core CPI y/y"                    0
   [2] 840030009      1        4           2           0          840      0            1            0        3 "https://www.bls.gov" "consumer-price-index-nsa"               "CPI n.s.a."                      0
   [3] 840030010      1        4           2           0          840      0            1            0        3 "https://www.bls.gov" "consumer-price-index-ex-food-energy"    "Core CPI"                        0
   [4] 840030011      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "import-price-index-mm"                  "Import Price Index m/m"          0
   [5] 840030012      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "import-price-index-yy"                  "Import Price Index y/y"          0
   [6] 840030013      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "export-price-index-mm"                  "Export Price Index m/m"          0
   [7] 840030014      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "export-price-index-yy"                  "Export Price Index y/y"          0
   [8] 840030015      1        3           2           0          840      1            2            0        1 "https://www.bls.gov" "unemployment-rate"                      "Unemployment Rate"               0
   [9] 840030016      1        3           2           0          840      4            3            1        0 "https://www.bls.gov" "nonfarm-payrolls"                       "Nonfarm Payrolls"                0
   OnTimer: Получен текущий идентификатор базы Календаря: change_id=33986560
 
*/  

Смотри также

CalendarValueLast, CalendarValueHistory, CalendarValueHistoryByEvent, CalendarValueById