#property description "Exemple d'utilisation de la fonction CalendarValueLastByEvent"
#property description " pour suivre la publication du rapport des Emplois Non Agricoles."
#property description "Pour cela, récupère l'identifiant du changement courant"
#property description " de la base de données du Calendrier. Utilise ensuite cet identifiant pour ne récupérer"
#property description " que les nouveaux évènements via le timer"
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- crée le timer
EventSetTimer(60);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- détruit le timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Fonction tick de l'expert |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Fonction Timer |
//+------------------------------------------------------------------+
void OnTimer()
{
//--- Identifiant de changement de la base de données du Calendrier
static ulong calendar_change_id=0;
//--- attribut de 1er lancement
static bool first=true;
//--- identifiant de l'évènement
static ulong event_id=0;
//--- nom de l'évènement
static string event_name=NULL;
//--- tableau de valeurs des évènements
MqlCalendarValue values[];
//--- effecture l'initialisation - récupère le calendar_change_id courant
if(first)
{
MqlCalendarEvent events[];
//--- code du pays pour les USA (ISO 3166-1 Alpha-2)
string USA_code="US";
//--- récupère les évènements pour les USA
int events_count=CalendarEventByCountry(USA_code,events);
//--- position d'un évènement nécessaire dans le tableau 'events'
int event_pos=-1;
//--- affiche les évènements des USA dans le Journal
if(events_count>0)
{
PrintFormat("%s: évènements de USA: %d",__FUNCTION__,events_count);
for(int i=0;i<events_count;i++)
{
string event_name_low=events[i].name;
//--- modifie le nom de l'évènement en minuscules
if(!StringToLower(event_name_low))
{
PrintFormat("StringToLower() a retourné l'erreur %d ",GetLastError());
//--- sors de la fonction rapidement
return;
}
//--- cherche l'évènement "Nonfarm Payrolls"
if(StringFind(event_name_low,"nonfarm payrolls")!=-1)
{
//--- évènement trouvé, conserve son identifiant
event_id=events[i].id;
//--- écrit le nom de l'évènement "Nonfarm Payrolls"
event_name=events[i].name;
//--- stocke la position de l'évènement dans le tableau 'events[]'
event_pos=i;
//--- rappelez-vous que le Calendrier comporte plusieurs événements dont le nom contient "nonfarm payrolls" dans leurs noms
PrintFormat("Evènement \"Nonfarm Payrolls\" trouvé: event_id=%d event_name=%s",event_id,event_name);
//--- visualisez tous les événements en commentant l'opérateur 'break' pour mieux comprendre cet exemple
break;
}
}
//--- réduit la liste en supprimant les évènements après les "Nonfarm Payrolls"
ArrayRemove(events,event_pos+1);
//--- conserve 9 évènements avant "Nonfarm Payrolls" pour une meilleure analyse
ArrayRemove(events,0,event_pos-9);
ArrayPrint(events);
}
else
{
PrintFormat("%s: CalendarEventByCountry(%s) a retourné 0 évènement, code d'erreur=%d",
USA_code,__FUNCTION__,GetLastError());
//--- opération terminée en échec, réessaye au prochain appel du timer
return;
}
//--- récupère l'identifiant de changement de la base de données du Calendrier pour l'évènement spécifié
if(CalendarValueLastByEvent(event_id,calendar_change_id,values)>0)
{
//--- ce bloc de code ne peut pas être exécuté pendant le 1er lancement, mais nous pouvons quand même l'ajouter
PrintFormat("%s: Identifiant reçu courant de la base de données du Calendrier : change_id=%d",
__FUNCTION__,calendar_change_id);
//--- définit le flag et sort avant le prochain évènement du timer
first=false;
return;
}
else
{
//--- les données ne sont pas reçus (normal au 1er lancement), vérifie s'il y a une erreur
int error_code=GetLastError();
if(error_code==0)
{
PrintFormat("%s: Identifiant courant reçu de la base de données du Calendrier: change_id=%d",
__FUNCTION__,calendar_change_id);
//--- définit le flag et sort avant le prochain évènement du timer
first=false;
//--- nous avons maintenant la valeur de calendar_change_id
return;
}
else
{
//--- c'est vraiment une erreur
PrintFormat("%s: Echec de l'obtention des valeurs pour event_id=%d",__FUNCTION__,event_id);
PrintFormat("Code d'erreur: %d",error_code);
//--- opération terminée en échec, réessaye au prochain appel du timer
return;
}
}
}
//--- nous avons la dernière valeur connue de l'identifiant du changement du calendrier (change_id)
ulong old_change_id=calendar_change_id;
//--- vérifie l'existence d'une nouvelle valeur pour l'évènement Nonfarm Payrolls
if(CalendarValueLastByEvent(event_id,calendar_change_id,values)>0)
{
PrintFormat("%s: Nouveaux évèenements reçus pour \"%s\": %d",
__FUNCTION__,event_name,ArraySize(values));
//--- affiche les données du tableau 'values' dans le Journal
ArrayPrint(values);
//--- affiche les valeurs des identifiants précédents et des nouveaux dans le Journal
PrintFormat("%s: change_id précédent=%d, nouveau change_id=%d",
__FUNCTION__,old_change_id,calendar_change_id);
/*
écrivez ici votre code pour gérer la survenue d'évènements "Nonfarm Payrolls"
*/
}
//---
}
/*
Résultat :
OnTimer: Evènements de USA : 202
Evènement "Nonfarm Payrolls" trouvé: event_id=840030016 event_name=Nonfarm Payrolls
[id] [type] [secteur][fréquence] [time_mode] [country_id] [unité][importance] [multiplicateur] [décimales] [url_source] [code_évènement] [nom] [réservé]
[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: Identifiant courant reçu de la base de données du Calendrier: change_id=33281792
*/
|