CalendarValueLastByEvent

Retourne le tableau des valeurs d'un évènement par son identifiant depuis le statut de la base de données du calendrier avec un change_id spécifié.

int  CalendarValueLastByEvent(
   ulong                event_id,      // identifiant de l'évènement 
   ulong&               change_id,     // identifiant de la valeur de l'évènement 
   MqlCalendarValue&    values[]       // tableau des descriptions des valeurs 
   );

Paramètres

event_id

[in]  Identifiant de l'évènement.

change_id

[in][out]  Identifiant du changement.

values[]

[out]  Tableau d'éléments de type MqlCalendarValue pour retourner les valeurs des évènements. Voir l'exemple de gestion des événements du calendrier.

Valeur de Retour

Nombre de valeurs d'évènements retournées. Pour obtenir des informations sur une erreur, appelez la fonction GetLastError(). Erreurs possibles :

  • 4001 — ERR_INTERNAL_ERROR  (erreur générale d'exécution),
  • 4004 — ERR_NOT_ENOUGH_MEMORY (pas assez de mémoire pour exécuter une requête),
  • 5401 — ERR_CALENDAR_TIMEOUT (limite de temps de traitement de la requête atteinte),
  • 5400 — ERR_CALENDAR_MORE_DATA (la taille du tableau est insuffisante pour recevoir les descriptions de toutes les valeurs, toutes les descriptions ne seront pas retournées).

Note

Toutes les fonctions permettant de travailler avec le calendrier économique utilisent l’heure du serveur de trading(TimeTradeServer). Cela signifie que l'heure dans la structure MqlCalendarValue et l'heure donnée dans les fonctions CalendarValueHistoryByEvent/CalendarValueHistory sont définies dans le fuseau horaire du serveur de trading, et non pas selon l'heure locale de l'utilisateur.

Si le tableau events[] de taille fixe passé à la fonction n'est pas assez grand, l'erreur ERR_CALENDAR_MORE_DATA (5400) est générée.

Si change_id = 0 est passé à la fonction, la fonction retourne toujours 0 et la valeur de la base de données du calendrier courant est retournée dans change_id.

La fonction retourne le tableau des nouvelles spécifiées et un nouveau change_id qui peut être utilisé pour les appels ultérieurs à la fonction pour recevoir les nouvelles valeurs des évènements. Il est donc possible de mettre à jour les valeurs pour une nouvelle spécifiée en appelant cette fonction avec le dernier change_id connu.

La structure MqlCalendarValue fournit des méthodes pour vérifier et définir les valeurs des champs actual_value, forecast_value, prev_value et revised_prev_value. Si aucune valeur n'est spécifiée, le champ stocke LONG_MIN (-9223372036854775808).

Veuillez noter que les valeurs stockées dans ces champs sont multipliées par un million. Cela signifie que lorsque vous recevez des valeurs dans MqlCalendarValue à l'aide des fonctions CalendarValueById, CalendarValueHistoryByEvent, CalendarValueHistory, CalendarValueLastByEvent et CalendarValueLast, vous devez vérifier si les valeurs des champs sont égales à LONG_MIN ; si une valeur est spécifiée dans un champ, vous devez diviser la valeur par 1 000 000 afin d'obtenir la valeur. Une autre méthode pour obtenir les valeurs consiste à vérifier et à obtenir des valeurs en utilisant les fonctions de la structure MqlCalendarValue.

L'échantillon EA écoutant la publication des rapports des Emplois Non Agricoles :

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

Voir aussi

CalendarValueLast, CalendarValueHistory, CalendarValueHistoryByEvent, CalendarValueById