#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
*/
|