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 lanalyse automatique des événements entrants en fonction de critères dimportance 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()
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(void) const; // renvoie true si actual_value est définie
bool HasPreviousValue(void) const; // renvoie true si prev_value est définie
bool HasRevisedValue(void) const; // renvoie true si revised_prev_value est définie
bool HasForecastValue(void) const; // renvoie true si forecast_value est définie
//--- fonctions pour récupérer les valeurs
double GetActualValue(void) const; // renvoie actual_value ou nan si la valeur n'est pas définie
double GetPreviousValue(void) const; // renvoie prev_value ou nan si la valeur n'est pas définie
double GetRevisedValue(void) const; // renvoie revised_prev_value ou nan si la valeur n'est pas définie
double GetForecastValue(void) const; // 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(values, date_from, date_to, EU_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_code, ArraySize(values));
//--- réduit la taille du tableau pour la sortie vers le Journal
if(ArraySize(values)>5)
ArrayResize(values, 5);
//--- 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_1, total);
//--- copie les valeurs avec vérifications et ajustements
for(int i=0; i<total; i++)
{
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_2, total);
//--- copie les valeurs avec vérifications et ajustements
for(int i=0; i<total; i++)
{
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_3, total);
//--- copie les valeurs avec vérifications et ajustements
for(int i=0; i<total; i++)
{
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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55200000 55500000 -9223372036854775808 55500000 2 ...
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143100000 143900000 -9223372036854775808 -9223372036854775808 0 ...
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0 ...
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11000000 10500000 -9223372036854775808 11000000 0 ...
[4] 111619 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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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