Structures du Calendrier Economique

Cette section décrit les structures à utiliser pour travailler avec le calendrier économique disponible directement dans la plateforme MetaTrader. Le calendrier économique est une encyclopédie toute faite présentant des indicateurs macroéconomiques, leurs dates de publication et leur importance. Les valeurs pertinentes des indicateurs macroéconomiques sont envoyées à la plateforme MetaTrader dès le moment de la publication et sont affichées sur un graphique sous forme de balises vous permettant de suivre de manière visuelle les indicateurs requis par pays, par devise et par importance.

Les fonctions du calendrier économique  permettent de réaliser l’analyse automatique des événements entrants en fonction de critères d’importance personnalisés en fonction des paires pays/devises nécessaires.

Les descriptions des pays sont effectuées avec la structure MqlCalendarCountry. Elle est utilisée dans les fonctions CalendarCountryById() et CalendarCountries()

struct MqlCalendarCountry
  {
   ulong                               id;                    // identifiant du pays (ISO 3166-1)
   string                              name;                  // nom textuel du pays (dans le codage actuel du terminal)
   string                              code;                  // nom du code du pays (ISO 3166-1 alpha-2)
   string                              currency;              // code de la devise du pays
   string                              currency_symbol;       // symbole de la devise du pays
   string                              url_name;              // nom du pays utilisé dans l'url du site mql5.com
  };

 

Les descriptions des évènements sont effectuées avec la structure MqlCalendarEvent. Elle est utilisée dans les fonctions CalendarEventById(), CalendarEventByCountry() et CalendarEventByCurrency()

struct MqlCalendarEvent
  {
   ulong                               id;                    // identifiant de l'évènement
   ENUM_CALENDAR_EVENT_TYPE            type;                  // type de l'évènement, de la liste ENUM_CALENDAR_EVENT_TYPE
   ENUM_CALENDAR_EVENT_SECTOR          sector;                // secteur lié à l'évènement
   ENUM_CALENDAR_EVENT_FREQUENCY       frequency;             // fréquence de l'évènement
   ENUM_CALENDAR_EVENT_TIMEMODE        time_mode;             // mode de l'heure de l'évènement
   ulong                               country_id;            // identifiant du pays
   ENUM_CALENDAR_EVENT_UNIT            unit;                  // unité de mesure de la valeur de l'indicateur économique
   ENUM_CALENDAR_EVENT_IMPORTANCE      importance;            // importance de l'évènement
   ENUM_CALENDAR_EVENT_MULTIPLIER      multiplier;            // multiplicateur de la valeur de l'indicateur économique
   uint                                digits;                // nombre de décimales
   string                              source_url;            // URL de la source publiant l'évènement
   string                              event_code;            // code de l'évènement
   string                              name;                  // nom du texte de l'événement dans la langue du terminal (dans le codage actuel du terminal)
  };

 

Les valeurs de l'évènement sont définies avec la structure MqlCalendarValue. Elle est utilisée dans les fonctions CalendarValueById(), CalendarValueHistoryByEvent(), CalendarValueHistory(), CalendarValueLastByEvent() et CalendarValueLast()

struct MqlCalendarValue
  {
   ulong                               id;                    // identifiant
   ulong                               event_id;              // identifiant de l'évènement
   datetime                            time;                  // date et heure de l'évènement
   datetime                            period;                // période de publication de l'évènementevent reporting period
   int                                 revision;              // révision de l'indicateur publié par rapport à la période de publication
   long                                actual_value;          // valeur actuelle en ppm ou LONG_MIN si la valeur n'est pas définie
   long                                prev_value;            // valeur précédente en ppm ou LONG_MIN si la valeur n'est pas définie
   long                                revised_prev_value;    // valeur précédente révisée en ppm ou LONG_MIN si la valeur n'est pas définie
   long                                forecast_value;        // valeur prévisionnelle en ppm ou LONG_MIN si la valeur n'est pas définie
   ENUM_CALENDAR_EVENT_IMPACT          impact_type;           // impact potentiel sur le taux de change
  //--- fonctions pour vérifier les valeurs
   bool                         HasActualValue(voidconst;   // renvoie true si actual_value est définie
   bool                         HasPreviousValue(voidconst; // renvoie true si prev_value est définie
   bool                         HasRevisedValue(voidconst;  // renvoie true si revised_prev_value est définie
   bool                         HasForecastValue(voidconst; // renvoie true si forecast_value est définie
  //--- fonctions pour récupérer les valeurs
   double                       GetActualValue(voidconst;   // renvoie actual_value ou nan si la valeur n'est pas définie
   double                       GetPreviousValue(voidconst; // renvoie prev_value ou nan si la valeur n'est pas définie
   double                       GetRevisedValue(voidconst;  // renvoie revised_prev_value ou nan si la valeur n'est pas définie
   double                       GetForecastValue(voidconst; // renvoie forecast_value ou nan si la valeur n'est pas définie
  };

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.

Un exemple de gestion des événements du calendrier :

//--- Crée une structure pour stocker des événements de calendrier avec des valeurs réelles au lieu d'entiers
struct AdjustedCalendarValue
  {
   ulong                               id;                    // identifiant
   ulong                               event_id;              // identifiant de l'évènement
   datetime                            time;                  // date et heure de l'évènement
   datetime                            period;                // période de publication de l'évènementevent reporting period
   int                                 revision;              // révision de l'indicateur publié par rapport à la période de publication
   double                              actual_value;          // valeur actuelle
   double                              prev_value;            // valeur précédente
   double                              revised_prev_value;    // valeur précédente révisée
   double                              forecast_value;        // valeur prévisionnelle
   ENUM_CALENDAR_EVENT_IMPACT          impact_type;           // impact potentiel sur le taux de change
  };
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script                     |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
//--- code pays pour l'UE (ISO 3166-1 Alpha-2)
   string EU_code="EU";
//--- récupère toutes les valeurs d'événement de l'UE
   MqlCalendarValue values[];
//--- définit les limites de l'intervalle à partir duquel les événements sont pris
   datetime date_from=D'01.01.2021';  // prends tous les évènements de 2021
   datetime date_to=0 ; // 0 signifie tous les événements connus, y compris ceux qui ne se sont pas encore produits
//--- demande l'historique des événements de l'UE depuis 2021
   if(!CalendarValueHistory(valuesdate_fromdate_toEU_code))
     {
      PrintFormat("Erreur ! Échec de l'obtention des événements pour country_code=%s"EU_code);
      PrintFormat("Code d'erreur : %d"GetLastError());
      return;
     }
   else
      PrintFormat("Valeurs d'événement reçues pour country_code=%s : %d",
                  EU_codeArraySize(values));
//--- réduit la taille du tableau pour la sortie vers le Journal
   if(ArraySize(values)>5)
      ArrayResize(values5);
//--- affiche les valeurs d'événement dans le Journal telles qu'elles sont, sans vérification ni conversion en valeurs réelles
   Imprimer("Sortie des valeurs du calendrier telles qu'elles sont");
   ArrayPrint(values);
 
//--- vérifie les valeurs des champs et les convertit en valeurs réelles
//--- option 1 pour vérifier et obtenir les valeurs
   AdjustedCalendarValue values_adjusted_1[];
   int total=ArraySize(values);
   ArrayResize(values_adjusted_1total);
//--- copie les valeurs avec vérifications et ajustements
   for(int i=0i<totali++)
     {
      values_adjusted_1[i].id=values[i].id;
      values_adjusted_1[i].event_id=values[i].event_id;
      values_adjusted_1[i].time=values[i].time;
      values_adjusted_1[i].period=values[i].period;
      values_adjusted_1[i].revision=values[i].revision;
      values_adjusted_1[i].impact_type=values[i].impact_type;
      //--- vérifie les valeurs et les divise par 1 000 000
      if(values[i].actual_value==LONG_MIN)
         values_adjusted_1[i].actual_value=double("nan");
      else
         values_adjusted_1[i].actual_value=values[i].actual_value/1000000.;
 
      if(values[i].prev_value==LONG_MIN)
         values_adjusted_1[i].prev_value=double("nan");
      else
         values_adjusted_1[i].prev_value=values[i].prev_value/1000000.;
 
      if(values[i].revised_prev_value==LONG_MIN)
         values_adjusted_1[i].revised_prev_value=double("nan");
      else
         values_adjusted_1[i].revised_prev_value=values[i].revised_prev_value/1000000.;
 
      if(values[i].forecast_value==LONG_MIN)
         values_adjusted_1[i].forecast_value=double("nan");
      else
         values_adjusted_1[i].forecast_value=values[i].forecast_value/1000000.;
     }
   Print("La première méthode pour vérifier et obtenir les valeurs du calendrier");
   ArrayPrint(values_adjusted_1);
 
//--- option 2 pour vérifier et obtenir les valeurs
   AdjustedCalendarValue values_adjusted_2[];
   ArrayResize(values_adjusted_2total);
//--- copie les valeurs avec vérifications et ajustements
   for(int i=0i<totali++)
     {
      values_adjusted_2[i].id=values[i].id;
      values_adjusted_2[i].event_id=values[i].event_id;
      values_adjusted_2[i].time=values[i].time;
      values_adjusted_2[i].period=values[i].period;
      values_adjusted_2[i].revision=values[i].revision;
      values_adjusted_2[i].impact_type=values[i].impact_type;
      //--- vérifie et obtient les valeurs
      if(values[i].HasActualValue())
         values_adjusted_2[i].actual_value=values[i].GetActualValue();
      else
         values_adjusted_2[i].actual_value=double("nan");
 
      if(values[i].HasPreviousValue())
         values_adjusted_2[i].prev_value=values[i].GetPreviousValue();
      else
         values_adjusted_2[i].prev_value=double("nan");
 
      if(values[i].HasRevisedValue())
         values_adjusted_2[i].revised_prev_value=values[i].GetRevisedValue();
      else
         values_adjusted_2[i].revised_prev_value=double("nan");
 
      if(values[i].HasForecastValue())
         values_adjusted_2[i].forecast_value=values[i].GetForecastValue();
      else
         values_adjusted_2[i].forecast_value=double("nan");
     }
   Print("La deuxième méthode pour vérifier et obtenir les valeurs du calendrier");
   ArrayPrint(values_adjusted_2);
 
//--- option 3 pour obtenir les valeurs - sans vérifications
   AdjustedCalendarValue values_adjusted_3[];
   ArrayResize(values_adjusted_3total);
//--- copie les valeurs avec vérifications et ajustements
   for(int i=0i<totali++)
     {
      values_adjusted_3[i].id=values[i].id;
      values_adjusted_3[i].event_id=values[i].event_id;
      values_adjusted_3[i].time=values[i].time;
      values_adjusted_3[i].period=values[i].period;
      values_adjusted_3[i].revision=values[i].revision;
      values_adjusted_3[i].impact_type=values[i].impact_type;
      //--- obtient les valeurs sans vérification
      values_adjusted_3[i].actual_value=values[i].GetActualValue();
      values_adjusted_3[i].prev_value=values[i].GetPreviousValue();
      values_adjusted_3[i].revised_prev_value=values[i].GetRevisedValue();
      values_adjusted_3[i].forecast_value=values[i].GetForecastValue();
     }
   Print("La troisième méthode pour obtenir les valeurs du calendrier - sans vérification");
   ArrayPrint(values_adjusted_3);
  }
/*
   Nous avons reçu des valeurs d'événement pour country_code=EU : 1051
  Sortie des valeurs du calendrier telles qu'elles sont
         [id] [event_id]              [time]            [period] [revision]       [actual_value]         [prev_value] [revised_prev_value]     [forecast_value] [impact_type] [reserved]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3             55200000             55500000 -9223372036854775808             55500000             2        ...
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0            143100000            143900000 -9223372036854775808 -9223372036854775808             0        ...
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808             0        ...
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0             11000000             10500000 -9223372036854775808             11000000             0        ...
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0              3100000              3100000              3200000              3100000             0        ...
  La première méthode pour vérifier et obtenir les valeurs du calendrier
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
  La deuxième méthode pour vérifier et obtenir les valeurs du calendrier
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
  La troisième méthode pour obtenir des valeurs de calendrier - sans contrôles
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
*/

 

La fréquence de l'évènement est spécifiée dans la structure MqlCalendarEvent. Les valeurs possibles sont listées ENUM_CALENDAR_EVENT_FREQUENCY

ID

Description

CALENDAR_FREQUENCY_NONE

La fréquence de publication n'est pas définie

CALENDAR_FREQUENCY_WEEK

Publié une fois par semaine

CALENDAR_FREQUENCY_MONTH

Publié une fois par mois

CALENDAR_FREQUENCY_QUARTER

Publié une fois par trimestre

CALENDAR_FREQUENCY_YEAR

Publié une fois par an

CALENDAR_FREQUENCY_DAY

Publié une fois par jour

 

Le type de l'évènement est spécifié dans la structure MqlCalendarEvent. Les valeurs possibles sont listées ENUM_CALENDAR_EVENT_TYPE

ID

Description

CALENDAR_TYPE_EVENT

Evènement (réunion, discours, etc.)

CALENDAR_TYPE_INDICATOR

Indicateur

CALENDAR_TYPE_HOLIDAY

Vacances

 

Le secteur économique lié à l'évènement est spécifié dans la structure MqlCalendarEvent. Les valeurs possibles sont listées ENUM_CALENDAR_EVENT_SECTOR

ID

Description

CALENDAR_SECTOR_NONE

Le secteur n'est pas défini

CALENDAR_SECTOR_MARKET

Marché, bourse

CALENDAR_SECTOR_GDP

Produit Intérieur Brut (PIB)

CALENDAR_SECTOR_JOBS

Marché du travail

CALENDAR_SECTOR_PRICES

Prix

CALENDAR_SECTOR_MONEY

Finances

CALENDAR_SECTOR_TRADE

Affaires

CALENDAR_SECTOR_GOVERNMENT

Gouvernement

CALENDAR_SECTOR_BUSINESS

Affaires

CALENDAR_SECTOR_CONSUMER

Consommation

CALENDAR_SECTOR_HOUSING

Logement

CALENDAR_SECTOR_TAXES

Taxes

CALENDAR_SECTOR_HOLIDAYS

Vacances

 

L'importance de l'évènement est spécifiée dans la structure MqlCalendarEvent. Les valeurs possibles sont listées ENUM_CALENDAR_EVENT_IMPORTANCE

ID

Description

CALENDAR_IMPORTANCE_NONE

L'importance n'est pas définie

CALENDAR_IMPORTANCE_LOW

Faible importance

CALENDAR_IMPORTANCE_MODERATE

Importance moyenne

CALENDAR_IMPORTANCE_HIGH

Importance forte

 

Le type de l'unité de mesure utilisée pour afficher les valeurs de l'événement est spécifiée dans la structure MqlCalendarEvent. Les valeurs possibles sont listées ENUM_CALENDAR_EVENT_UNIT

ID

Description

CALENDAR_UNIT_NONE

L'unité de mesure n'est pas définie

CALENDAR_UNIT_PERCENT

Pourcentage

CALENDAR_UNIT_CURRENCY

Monnaie nationale

CALENDAR_UNIT_HOUR

Heures

CALENDAR_UNIT_JOB

Emplois

CALENDAR_UNIT_RIG

Derricks

CALENDAR_UNIT_USD

USD

CALENDAR_UNIT_PEOPLE

Personnes

CALENDAR_UNIT_MORTGAGE

Prêts hypothécaires

CALENDAR_UNIT_VOTE

Votes

CALENDAR_UNIT_BARREL

Barils

CALENDAR_UNIT_CUBICFEET

Pieds cubes

CALENDAR_UNIT_POSITION

Positions nettes non commerciales

CALENDAR_UNIT_BUILDING

Immeubles

 

Dans certains cas, les valeurs des paramètres économiques nécessitent un multiplicateur défini dans la structure MqlCalendarEvent. Les valeurs possibles du multiplicateur sont définies dans la liste ENUM_CALENDAR_EVENT_MULTIPLIER

ID

Description

CALENDAR_MULTIPLIER_NONE

Le multiplicateur n'est pas défini

CALENDAR_MULTIPLIER_THOUSANDS

Milliers

CALENDAR_MULTIPLIER_MILLIONS

Millions

CALENDAR_MULTIPLIER_BILLIONS

Milliards

CALENDAR_MULTIPLIER_TRILLIONS

Milliards

 

L'impact potentiel de l'événement sur un taux de change national est indiqué dans la structure MqlCalendarValue. Les valeurs possibles sont listées ENUM_CALENDAR_EVENT_IMPACT

ID

Description

CALENDAR_IMPACT_NA

Impact non défini

CALENDAR_IMPACT_POSITIVE

Impact positif

CALENDAR_IMPACT_NEGATIVE

Impact négatif

 

L'heure de l'évènement est spécifiée dans la structure MqlCalendarEvent. Les valeurs possibles sont listées ENUM_CALENDAR_EVENT_TIMEMODE

ID

Description

CALENDAR_TIMEMODE_DATETIME

La source publie l'heure exacte de l'évènement

CALENDAR_TIMEMODE_DATE

L'évènement dure toute la journée

CALENDAR_TIMEMODE_NOTIME

La source ne publie aucune l'heure pour l'évènement

CALENDAR_TIMEMODE_TENTATIVE

La source publie le jour de l'évènement, mais pas son heure exacte. L'heure est spécifiée lorsque l'évènement se produit.

 

Voir aussi

Calendrier Economique