Rejoignez notre page de fans
- Vues:
- 56
- Note:
- Publié:
-
Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance
Fonction TimeGMT()
Renvoie l'heure GMT, qui est calculée en tenant compte du passage à l'heure d'été par l'heure locale de l'ordinateur sur lequel tourne le terminal client. Il existe 2 variantes de la fonction.
Appel sans paramètres
datetime TimeGMT();
Appel avec un paramètre de type MqlDateTime
datetime TimeGMT( MqlDateTime& dt_struct // Variable de type structurel );
Cependant, lors des tests dans le testeur de stratégie,TimeGMT() est toujours égal à l'heure simulée du serveur TimeTradeServer().
Bibliothèque TimeGMT
Cette bibliothèque corrigera la fonction TimeGMT() afin de fournir l'heure GMT réelle lors des tests dans le testeur de stratégie. La bibliothèque installera des crochets API globaux (via la substitution de macro) pour les deux versions de TimeGMT.
class CTimeGMT { public: static datetime TimeGMT(void); static datetime TimeGMT(MqlDateTime &dt_struct); }
Utilisation :
Avant de tester un conseiller expert qui utilise le filtre News ou toute autre restriction de temps dans le testeur de stratégie, il suffit d'inclure cette ligne au début du code, puis de recompiler le source dans MetaEditor.
#include "TimeGMT.mqh"
- optionnellement, pour voir les messages de débogage, ajoutez cette ligne avant la directive #include :
#define PRINT_GMT_DETAILS Aucune autre modification ou appel de fonction n'est nécessaire pour le conseiller expert ou l'indicateur.
- TimeGMT est corrigé uniquement si le testeur de stratégie est détecté.
- La correction fonctionne sur le symbole sélectionné dans le testeur de stratégie.
- Pas d'erreurs de calcul pendant les week-ends ou les vacances de Noël.
- Faible surcharge et temps de calcul rapide dans le testeur de stratégie
Le recalcul du décalage du courtier n'a lieu qu'au démarrage du conseiller expert et tous les dimanches et lundis à minuit. Le décalage de courtier calculé sera mis en cache dans la mémoire et sera utilisé pour les appels ultérieurs à TimeGMT.
Sélection du symbole pour l'estimation de la TZ/DST du serveur
Par défaut, la bibliothèque recherche et charge le symbole XAUUSD pour l'estimation du décalage horaire du serveur. XAUUSD peut fournir des résultats plus fiables (en particulier pour les courtiers qui suivent l'horaire de l'heure d'été de l'Union européenne ) les semaines où les horaires de l'heure d'été des États-Unis et de l'heure d'hiver de l'Union européenne ne sont pas synchronisés (mars et fin octobre). Si votre courtier suit l'horaire de l'heure d'été des États-Unis, ou n'a pas d'horaire du tout, l'utilisation du symbole du graphique est également possible. Appelez CTimeGMT::SetUsingGoldSymbol() avec 'false' pour utiliser le symbole du graphique en cours, au lieu de XAUUSD.
Pour déterminer l'horaire de jour (DST) de votre courtier, vous pouvez utiliser le script suivant : https://www.mql5.com/fr/code/48650
//+------------------------------------------------------------------+ //| Définit l'option d'utiliser le symbole XAUUSD (or) pour estimer la valeur de l'or. //| TZ/DST du serveur par analyse de l'historique des citations H1. | //| TRUE : recherche et chargement du symbole Gold (comportement par défaut). //| FALSE : utiliser le symbole du graphique en cours. //+------------------------------------------------------------------+ void CTimeGMT::SetUsingGoldSymbol(const bool enabled = true);
Remarque:
L'effet secondaire est que XAUUSD commence une heure après Forex, donc les changements dst se produiront une heure plus tard dans le testeur de stratégie.
TimeGMT_TestEA
Pour explorer la bibliothèque dans le testeur de stratégie, un conseiller expert de démonstration est testé dans le testeur de stratégie.
Voici les résultats de l'exécution du conseiller expert dans le testeur de stratégie :
AUDUSD,M1 (ICMarketsSC-Demo): 1 minutes OHLC ticks generating AUDUSD,M1: testing of Experts\TimeGMT_TestEA.ex5 from 2023.03.05 00:00 to 2023.05.01 00:00 started with inputs: timer_hours=24 2023.03.05 00:00:00 TimeCurrent() = Sun, 2023.03.05 00:00:00 | TimeTradeServer() = Sun, 2023.03.05 00:00:00 | TimeGMT() = Sat, 2023.03.04 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.06 00:00:00 TimeCurrent() = Mon, 2023.03.06 00:00:00 | TimeTradeServer() = Mon, 2023.03.06 00:00:00 | TimeGMT() = Sun, 2023.03.05 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.07 00:00:00 TimeCurrent() = Tue, 2023.03.07 00:00:00 | TimeTradeServer() = Tue, 2023.03.07 00:00:00 | TimeGMT() = Mon, 2023.03.06 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.08 00:00:00 TimeCurrent() = Wed, 2023.03.08 00:00:00 | TimeTradeServer() = Wed, 2023.03.08 00:00:00 | TimeGMT() = Tue, 2023.03.07 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.09 00:00:00 TimeCurrent() = Thu, 2023.03.09 00:00:00 | TimeTradeServer() = Thu, 2023.03.09 00:00:00 | TimeGMT() = Wed, 2023.03.08 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.10 00:00:00 TimeCurrent() = Fri, 2023.03.10 00:00:00 | TimeTradeServer() = Fri, 2023.03.10 00:00:00 | TimeGMT() = Thu, 2023.03.09 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.11 00:00:00 TimeCurrent() = Fri, 2023.03.10 23:56:59 | TimeTradeServer() = Sat, 2023.03.11 00:00:00 | TimeGMT() = Fri, 2023.03.10 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.12 00:00:00 TimeCurrent() = Fri, 2023.03.10 23:56:59 | TimeTradeServer() = Sun, 2023.03.12 00:00:00 | TimeGMT() = Sat, 2023.03.11 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.13 00:00:00 TimeCurrent() = Mon, 2023.03.13 00:00:00 | TimeTradeServer() = Mon, 2023.03.13 00:00:00 | TimeGMT() = Sun, 2023.03.12 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.14 00:00:00 TimeCurrent() = Tue, 2023.03.14 00:00:00 | TimeTradeServer() = Tue, 2023.03.14 00:00:00 | TimeGMT() = Mon, 2023.03.13 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.15 00:00:00 TimeCurrent() = Wed, 2023.03.15 00:00:00 | TimeTradeServer() = Wed, 2023.03.15 00:00:00 | TimeGMT() = Tue, 2023.03.14 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.16 00:00:00 TimeCurrent() = Thu, 2023.03.16 00:00:00 | TimeTradeServer() = Thu, 2023.03.16 00:00:00 | TimeGMT() = Wed, 2023.03.15 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.17 00:00:00 TimeCurrent() = Fri, 2023.03.17 00:00:00 | TimeTradeServer() = Fri, 2023.03.17 00:00:00 | TimeGMT() = Thu, 2023.03.16 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.18 00:00:00 TimeCurrent() = Fri, 2023.03.17 23:56:59 | TimeTradeServer() = Sat, 2023.03.18 00:00:00 | TimeGMT() = Fri, 2023.03.17 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.19 00:00:00 TimeCurrent() = Fri, 2023.03.17 23:56:59 | TimeTradeServer() = Sun, 2023.03.19 00:00:00 | TimeGMT() = Sat, 2023.03.18 21:00:00 | BrokerOffset = 10800 (GMT+3)
Mises à jour :
2024.03.30 - v.1.25 : Correction du décalage GMT du courtier. Actuellement, la bibliothèque analyse les barres H1 uniquement sur le graphique GOLD car il a les heures de début les plus précises.
2024.04.09 - v.1.33 : Correction d'un problème potentiel dans le calcul du décalage GMT des courtiers pendant les vacances de Noël sur les courtiers GMT+0.
2024.04.12 - v.1.35 : Correction d'un problème dans le calcul du décalage GMT du courtier sur quelques courtiers qui n'offrent pas le commerce de l'or.
2024.07.07 - v.1.36 : Correction d'un problème dans la détection correcte du symbole GOLD sur certains courtiers.
2024.10.21 - v.1.40 : Amélioration de la détection du symbole GOLD avec un repli sur le symbole EURUSD.
2024.10.26 - v.1.47 : Ajout d'un meilleur code de gestion des erreurs et de débogage. Renommé la méthode HistoryBrokerOffset() en TimeServerGMTOffset().
2024.10.28 - v.1.49 : Conversion de toutes les macros traitant du temps en fonctions pour éviter la double évaluation des paramètres dans le corps de la macro. Plus de nettoyage de code dans d'autres lignes.
2024.10.30 - v.1.50 : Correction d'un problème d'estimation erronée du décalage GMT à partir des cotations XAUEUR sur certains courtiers.
2024.11.23 - v.1.55 : Ajout d'une option pour désactiver le chargement par défaut du symbole Gold pour l'estimation du TZ/DST du serveur. Appelez CTimeGMT::SetUsingGoldSymbol() avec 'false' pour utiliser le symbole du graphique actuel à la place.
2024.12.12 - v.1.60 : Amélioration des performances de la fonction HistoryServerGMTOffset() et autres modifications mineures du code.
2024.12.14 - v.1.61 : Amélioration des performances de la fonction FindSymbol().
2024.12.17 - v.1.62 : Optimisation de la fonction HistoryServerGMTOffset().
2024.12.24 - v.1.63 : Correction d'un problème potentiel dans la fonction HistoryServerGMTOffset().
Fuseau horaire du courtier et horaire DST
Le temps moyen de Greenwich (GMT), également appelé temps universel coordonné (UTC), est utilisé comme référence mondiale officielle pour le temps. Vous verrez souvent des fuseaux horaires représentés comme UTC - 3h ou GMT - 3h. Dans cet exemple, le (-3h) indique que le fuseau horaire est en retard de trois heures par rapport à l'UTC ou au GMT. UTC+3h ou GMT +3h indique que le fuseau horaire est en avance de trois heures sur UTC ou GMT. La différence de temps entre notre heure locale et l'heure GMT (UTC) est appelée décalage GMT.
Le marché des changes ouvre le dimanche à 17 heures, heure de New York (GMT-5 heures en hiver et GMT-4 heures en été) et ferme le vendredi à la même heure. L'heure d'ouverture du marché des changes à NY Sun, 17:00 correspond à Sun, 10:00 PM UTC en hiver (et Sun, 09:00 PM UTC en été). Le marché des changes ferme le vendredi à 22h00 UTC en hiver (et à 21h00 UTC en été). Le marché au comptant de l'or et de l'argent démarre généralement une heure plus tard. lien
Chaque courtier en devises a son propre fuseau horaire et son propre serveur. Par conséquent, le début de la semaine de négociation (bougies H1) varie d'un courtier à l'autre, et peut aller dedimanche, 02:00 PM heure du serveurpour les courtiers de San Francisco (GMT-8), àlundi, 09:00 AM heure du serveurpour les courtiers de Sydney (GMT+11). La fin de la semaine de trading varie également duvendredi, 14h00, heure du serveur,ausamedi, 09h00, heure du serveur.
Chaque courtier est libre de choisir son heure d'été (DST). Et l'heure d'été n'est pas nécessairement la même pour chaque fuseau horaire. Parfois, ils mélangent les deux en utilisant un fuseau horaire européen et une heure d'été américaine au lieu de l'heure d'été européenne. Pour les courtiers qui ne suivent pas l'horaire américain, l'heure du serveur pour le début (et la fin) de la semaine varie de +/- une heure pour le même courtier tout au long de l'année. Pour gérer ces variations, le recalcul de l'offset du courtier doit être effectué sur une base hebdomadaire, afin que les changements d'heure d'été sur le courtier puissent être détectés à temps.
L'utilisation d'un fuseau horaire de +2 (et +3 en été sur le calendrier américain) signifie donc que les bougies commencent chaque semaine à minuit le lundi, qu'il y a cinq bougies D1 par semaine et que le début d'une bougie journalière (et H4) est le début d'un nouveau jour de change. Chaque semaine se termine juste avant minuit le samedi. Il n'y a pas de bougies le samedi et le dimanche.Simplement, l'heure sur ces serveurs est toujours en avance de 7 heures sur New York et représentée par NY+7.C'est de loin le paramètre le plus courant, mais il existe de nombreuses variantes moins courantes.
Détails du calcul de l'heure GMT réelle
Quand un appel à TimeGMT() est intercepté par la bibliothèque, elle vérifie d'abord si elle n'est pas en cours d'exécution dans le testeur de stratégie, puis elle renvoie la fonction originale. Si le testeur de stratégie est détecté, le code commence à calculer le décalage du courtier (voir plus loin), puis la valeur de retour est simplement le résultat de la soustraction de ce décalage de l'heure actuelle du serveur de négociation dans le terminal client.
true GMT = TimeTradeServer() - ServerGMTOffset (of the current trading week)
Le"ServerGMTOffset" lui-même peut être estimé, par l'analyse de l'historique des cotations H1, comme la différence entre deux moments connus :
1) l'heure à laquelle la première barre de la semaine de trading apparaît sur le graphique GOLD (FstBarWk),
2) l'heure UTC correspondant à l'heure de début des transactions sur l'or à New York le dimanche à 18:00 .
ServerGMTOffset = FstBarWk - UTC (NY Sun, 18:00)
Le calcul du BrokerOffset utilise une modification optimisée de l'algorithme publié par Carl Schreiber dans Dealing with time (2) functions
Selon https://www.timeanddate.com/time/change/usa/new-york
- À New York, l'heure d'été (DST) commence à 02h00 du matin, heure locale, le deuxième dimanche de mars. L'horloge avancera d'une heure jusqu'à GMT-4, de sorte que l'heure UTC correspondante pour NY Sun, 18:00 est (Sun, 22:00 UTC).
- Comme l'heure d'été se termine (heure d'hiver) à New York à 02h00 heure locale le premier dimanche de novembre, l'horloge avancera d'une heure à GMT-5, et l'heure UTC correspondante pour NY Sun, 18:00 est donc (Sun, 23:00 UTC).
Par exemple, si le FstBarWk sur le graphique GOLD commence à Lun, 01:00, et que c'est l'hiver à New York à cette barre, alors BrokerOffset peut être calculé comme suit :
ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 23:00 UTC) = 2 hours (GMT+2)
et, si c'est l'été à New York, alors BrokerOffset :
ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 22:00 UTC) = 3 hours (GMT+3)
Conversion des heures de session à l'heure du serveur du courtier
Les traders peuvent utiliser TimeGMT() pour convertir les heures de session en heure serveur correspondante afin de déterminer l'heure d'ouverture ou de fermeture de certains marchés. Par exemple, si un trader souhaite négocier pendant la session asiatique (Tokyo), il doit ajuster ses heures de trading en conséquence.
1] Déterminer le décalage du serveur de négociation du courtier
int ServerGMTOffset = TimeTradeServer() - TimeGMT();
2] Convertir les heures locales des marchés spécifiques à l'heure du serveur du courtier correspondant.
datetime Server_time = Tokyo_time – Tokyo_GMTOffset + ServerGMTOffset Le deuxième terme de l'équation (xxx_GMTOffset) doit être augmenté de +1 heure si le fuseau horaire de destination est actuellement à l'heure d'été.
Lors des tests dans le testeur de stratégie, TimeGMT() est toujours égal à l'heure simulée du serveur TimeTradeServer(), donc la conversion des temps de session devient erronée. Cette bibliothèque corrigera la fonction TimeGMT() afin de fournir le vrai GMT, donc les temps de session convertis deviennent exacts lors des tests dans le testeur de stratégie.
Traduit de l’anglais par MetaQuotes Ltd.
Code original : https://www.mql5.com/en/code/48291
Simple Bar Timer
Il s'agit d'un script qui affiche le temps restant avant l'arrivée de la prochaine barre.
Actualités VLine
Le script affiche des lignes verticales sur le graphique aux points de publication des nouvelles.
MA mass cloud
Nuages formés par les masses des moyennes mobiles de différentes périodes.
Indicateur directionnel Multi-Williams Percent Range
Indicateur de direction de tendance Multi-Williams Percent Range.
