Voir comment télécharger gratuitement des robots de trading
Retrouvez-nous sur Facebook !
Rejoignez notre page de fans
Un script intéressant ?
Poster un lien vers celui-ci -
laisser les autres l'évaluer
Vous avez aimé le script ? Essayez-le dans le terminal MetaTrader 5
Vues:
13
Note:
(5)
Publié:
\MQL5\Include\MQL5Book\
PRTF.mqh (1.49 KB) afficher
MQL5 Freelance Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance

Ce script introduit la fonction TimeServerDaylightSavings() qui manque parmi les fonctions intégrées, qui ne fournissent que TimeDaylightSavings() pour l'ordinateur local. En outre, le fichier mqh d'en-tête ci-joint comprend d'autres fonctions utiles liées à l'heure du serveur, qui vous permettent notamment de savoir si votre courtier utilise les changements d'heure d'été en général.

Tout ceci est basé sur une analyse empirique de l'historique des cotations de votre courtier. L'idée est décrite dans le livre algotrading dans la section sur l'heure d'été (DST). En bref, la méthode analyse les statistiques des heures d'ouverture de la semaine et déduit les décalages GMT de votre courtier. Deux maximums distincts dans les statistiques des décalages, s'ils correspondent à des heures adjacentes, correspondent très probablement à l'heure normale ("hiver") et à l'heure d'été ("été").

En fait, ce script est une version affinée et étendue du script présenté dans le livre. Plus précisément, les versions postérieures à octobre 2024 incluent une correction de bug importante : les heures d'ouverture des transactions hebdomadaires sont détectées par le marché américain, qui est lui-même affecté par les changements d'heure d'été selon le fuseau horaire américain (EST, UTC-5, heure d'hiver standard <--> EDT, UTC-4, heure d'été), c'est pourquoi il est important d'éliminer l'effet de l'heure d'hiver américaine pour obtenir un flux horaire naturel continu tout au long de l'année - c'est ce qui a été fait dans le correctif. Tout le mérite en revient à amrali.

Exemple de changement de l'heure d'ouverture de la semaine dans les citations en raison du passage à l'heure d'été


Veuillez noter que dans les hémisphères nord et sud, les fuseaux horaires sont ajustés dans le sens inverse : dans l'hémisphère nord, une heure est ajoutée au "printemps" (mars ou avril) et soustraite à l'"automne" (octobre ou novembre), tandis que dans l'hémisphère sud, c'est l'inverse (parce qu'ils ont toutes les saisons permutées).

En raison de la spécificité de l'analyse, il est recommandé d'exécuter le code pour le ticker Forex le plus liquide, qui est généralement l'EURUSD.

Voici l'API :

// Informations sur le fuseau horaire du serveur et sur l'heure d'été
struct ServerTimeZone  // selon l'analyse historique des heures d'ouverture hebdomadaires
{
   int offsetGMT;      // décalage du fuseau horaire en secondes par rapport à UTC/GMT pour la semaine en cours
   int offsetDST;      // Correction de l'heure d'été en secondes (incluse dans offsetGMT, selon MQL5)
   bool supportDST;    // Les changements d'heure d'été sont détectés dans les devis
};

// Estimer le fuseau horaire du serveur et le mode DST à partir de l'historique des cotations H1
ServerTimeZone TimeServerZone(
  const datetime srvtime = 0,     // par défaut, l'heure actuelle, mais il est possible de spécifier un moment dans le passé
  const int threshold = THRESHOLD,
  const double lookupYears = 0.0, // par défaut, toutes les barres disponibles, sinon 3 ans semblent suffisants
  const string symbol = NULL)     // par défaut, le symbole du graphique actuel

// Estimation de l'heure du serveur Correction du mode DST (en secondes)
int TimeServerDaylightSavings(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Estimation du décalage du fuseau horaire du serveur (en secondes)
int TimeServerGMTOffsetHistory(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Estime si le serveur est compatible avec l'heure d'été (true/false)
bool TimeServerDaylightSavingsSupported(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Analogue de la fonction TimeGMTOffset() pour le serveur d'échange, différence en secondes
int TimeServerGMTOffset(); // TimeGMT() - TimeTradeServer()

Les fonctions TimeServerDaylightSavings(), TimeServerGMTOffsetHistory(), TimeServerDaylightSavingsSupported() sont juste des enveloppes pour TimeServerZone(), donc si vous avez besoin de plus d'une caractéristique, il est préférable d'utiliser cette dernière et de lire les valeurs de la structure ServerTimeZone.

Toutes ces fonctions prennent comme premier argument l'heure du serveur à laquelle vous souhaitez obtenir la caractéristique correspondante (dans le présent ou dans le passé). Si l'heure du serveur est laissée à 0 (par défaut), le résultat est renvoyé pour le moment présent.

Le seuil du 2ème argument permet d'ajuster la sensibilité des algorithmes. Par défaut, il est fixé à 52/4, soit un quart d'année de statistiques nécessaires à la prise de décision (détection du fuseau horaire sans interférence possible des petites semaines avant/après les vacances). D'un autre côté, ce réglage empêche la détection rapide des changements de fuseau horaire ad hoc (si votre courtier décide de le faire à un moment donné). Il peut être utile de fixer le seuil à 0 pour permettre aux algorithmes de détecter les changements le plus rapidement possible.

La fonction TimeServerGMTOffset() n'utilise pas l'analyse de l'historique mais calcule le décalage directement via les fonctions MQL5 (comme TimeGMT() - TimeTradeServer()).

Veuillez noter que cette fonction utilise la même notation de décalage que la fonction intégrée TimeGMTOffset() de MQL5, c'est-à-dire que les fuseaux horaires positifs, tels que GMT+3, sont indiqués par des décalages négatifs, tels que -10800, et vice versa. Cette notation est utilisée par d'autres langages de programmation, comme JaveScript, mais il existe également d'autres langages qui désignent les fuseaux horaires positifs par des décalages positifs, et les fuseaux horaires négatifs par des décalages négatifs. Vérifiez soigneusement vos algorithmes.

Le script de test affiche toutes les données acquises dans le journal, par exemple :

1 ~ Built-in functions ~
TimeLocal()=2024.10.05 00:39:01 / ok
TimeCurrent()=2024.10.05 00:38:59 / ok
TimeTradeServer()=2024.10.05 00:39:01 / ok
TimeGMT()=2024.10.04 21:39:01 / ok
TimeGMTOffset()=-10800 / ok
TimeDaylightSavings()=0 / ok
2 ~ Add-on over built-in functions ~
TimeServerGMTOffset()=-10800 / ok
3 ~ Estimation of server TZ with DST based on week opening hours in history ~
TimeServerDaylightSavings()=-3600 / ok
    [offsetGMT] [offsetDST] [supportDST]
[0]      -10800       -3600         true

Dans ce cas, il est détecté que le serveur est actuellement en mode DST, alors que l'ordinateur local ne l'est pas.

N'oubliez pas que les horloges système de l'ordinateur local et du serveur peuvent normalement afficher des heures légèrement différentes (secondes et même minutes), même si elles se trouvent dans le même fuseau horaire. Notez également que la fonction intégrée TimeTradeServer() renvoie une date synthétique : il s'agit de l'heure du serveur avec une précision horaire, mais elle hérite des fractions intra-horaires de l'horloge locale. Ceci est fait dans MQL5 pour simplifier les conversions entre les fuseaux horaires - TimeLocal(), TimeGMT() renvoyés dans le "format local" également, et l'heure du serveur de négociation.

Vous pouvez activer l'impression détaillée des données analysées à l'aide de la directive de préprocesseur :

#define  PRINT_DST_DETAILS

qui doit être placée dans votre code avant l'inclusion :

#include "TimeServerDST.mqh"

Voici un exemple de détails dans le journal :

Got 20023 H1 bars, ~834 days
Week opening hours stats:
30  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 83 54  0
Time Zone changes (UTC±X before/after weekstart):
            [weekstart]    [before] [DSTb] [after] [DSTa]
[0] 2021.07.25 00:00:00 -2147483648  false      -1  false
[1] 2021.11.08 00:00:00           0   true       0  false
[2] 2022.03.14 00:00:00           0  false       0   true
[3] 2022.11.07 00:00:00           0   true       0  false
[4] 2023.03.13 00:00:00           0  false       0   true
[5] 2023.11.06 00:00:00           0   true       0  false
[6] 2024.03.11 00:00:00           0  false       2  false
3 different timezones detected in quotes, 1 DST candidates
Server time offset: UTC+2 STD
TimeServerDaylightSavings()=-3600 / ok

S'il vous plaît, n'hésitez pas à exécuter le script dans vos environnements et à poster les logs résultants dans la discussion.


Mises à jour

2024.10.10 - correction de bug : Les changements d'heure d'été des Etats-Unis (qui interféraient avec les statistiques sur les heures d'ouverture) sont éliminés de la ligne de temps avant l'analyse principale.

2024.10.27 - l'heure d'intérêt du serveur et le seuil minimal de statistiques hebdomadaires sont ajoutés comme arguments pour toutes les fonctions ; TimeServerGMTOffsetEmpiric() est renommé en TimeServerGMTOffsetHistory().

2024.10.29 - petite correction de bug pour inclure le temps demandé dans la période de recherche.

2024.10.30 - correction de DST dans le tableau TimeZoneChange ; la recherche est maintenant effectuée à partir du paramètre srvtime, s'il est spécifié.

2024.11.01 - ajout d'un auto-ajustement des calculs lorsqu'ils sont appliqués aux métaux précieux, ce qui peut fournir des résultats plus fiables les semaines où les horaires de l'US DST et de l'EU DST sont désynchronisés.

2024.11.04 - amélioration de la détection en ligne de l'activation/désactivation de l'heure d'été.

2024.11.07 - ajout de la mise en cache des changements de fuseau horaire et d'heure d'été pour les demandes en masse sur l'historique pour les indicateurs ou le backtesting des événements économiques.

2024.11.08 - optimisation des performances de la mise en cache par une petite refonte du code.

2024.11.16 - ajustement de 1 heure pour les timestamps déduits des métaux par amrali.

2024.11.17 - refactoring et corrections par amrali : élimination des reconstructions de cache pour les requêtes en ligne pendant les week-ends, ajout d'un délai de 48h pour la détection des changements de Zones Horaires pendant les week-ends (avec une possible transition DST), le dimanche 00:00 est utilisé comme limite pour les fuseaux horaires (au lieu de la première barre de la semaine).

2024.11.20 - le seuil par défaut est passé à 1 (un équilibre entre la détection rapide des changements de fuseau horaire et l'élimination des faux positifs sur les semaines non standard comme après les vacances) ; un nouvel ensemble de fonctions a été ajouté pour le formatage de l'heure, y compris les décalages de fuseau horaire et l'heure d'été (voir TimeZoneFmt.mqh) ; d'autres petits raffinements.




Traduit de l’anglais par MetaQuotes Ltd.
Code original : https://www.mql5.com/en/code/52557

Simplest Logger class for MetaTrader 5 Simplest Logger class for MetaTrader 5

La classe la plus simple pour la journalisation dans MetaTrader 5 avec un support pour les niveaux, le format de message, les filtres d'inclusion et d'exclusion sur les sous-chaînes.

Explosion de Waddah Attar Explosion de Waddah Attar

L'indicateur montre quand le marché commence à évoluer plus rapidement. En outre, il indique au trader quand acheter, vendre et sortir d'une transaction.

Martingale Pulse EA Martingale Pulse EA

Introducing MP by SPLpulse, a sophisticated and highly versatile Expert Advisor designed for the modern trader. Whether you are a scalper, a trend follower, or a reversal trader, MP by SPLpulse combines multiple trading strategies with an institutional-grade risk management suite to adapt to your unique trading style. Take control of your trading with unparalleled customization and powerful automation.

SuperTrend SuperTrend

SuperTrend indicator.