Bogue/problème de TimeCurrent() et iTime()

 

Bonjour à tous,

Je viens de tomber sur un problème intéressant et je ne suis pas sûr qu'il ait déjà été identifié ou même qu'il soit spécifique à un courtier.

Essayez d'utiliser ce qui suit dans le code d'un indicateur, faites tourner l'indicateur au démarrage et notez les valeurs lorsque vous lancez MT4 pour la première fois (assurez-vous que MT4 n'a pas tourné pendant au moins 10 minutes avant le redémarrage).

Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES));
Print(TimeToStr(iTime(NULL,PERIOD_M1,0),TIME_DATE|TIME_MINUTES));

Vous remarquerez que les heures renvoyées sont en fait celles de la dernière exécution de MT4.

Afin de contourner ce problème, j'ai dû introduire un délai dans mon code, ce qui n'est pas idéal pour un indicateur.

Je me demandais si quelqu'un avait une solution plus éloquente. Idéalement, je voudrais que l'heure correcte du serveur MT4 soit retournée au démarrage à chaque fois.

Salutations

PaulB

 
Paul_B:

Bonjour à tous,

Je viens de tomber sur un problème intéressant et je ne suis pas sûr qu'il ait déjà été identifié ou même qu'il soit spécifique à un courtier.

Essayez d'utiliser ce qui suit dans le code d'un indicateur, faites tourner l'indicateur au démarrage et notez les valeurs lorsque vous lancez MT4 pour la première fois (assurez-vous que MT4 n'a pas tourné pendant au moins 10 minutes avant le redémarrage).

Vous remarquerez que les heures renvoyées sont en fait celles de la dernière exécution de MT4.

Afin de contourner ce problème, j'ai dû introduire un délai dans mon code, ce qui n'est pas idéal pour un indicateur.

Je me demandais si quelqu'un avait une solution plus éloquente. Idéalement, je voudrais que l'heure correcte du serveur MT4 soit retournée au démarrage à chaque fois.

Salutations

PaulB


C'est le cas ?
Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
 

Bonjour deVries,

vous pouvez aussi utiliser TIME_SECONDS, cela n'a pas vraiment d'importance, tant que le code se trouve dans init{} ou au début de start{}.

Le fait est que vous obtenez la dernière fois que MT4 a fonctionné, ce qui peut être des heures ou des jours auparavant.

 
Paul_B:

Bonjour à tous,

Je viens de tomber sur un problème intéressant et je ne suis pas sûr qu'il ait déjà été identifié ou même qu'il soit spécifique à un courtier.

Essayez d'utiliser ce qui suit dans le code d'un indicateur, faites tourner l'indicateur au démarrage et notez les valeurs lorsque vous lancez MT4 pour la première fois (assurez-vous que MT4 n'a pas tourné pendant au moins 10 minutes avant le redémarrage).

Vous remarquerez que les heures renvoyées sont en fait celles de la dernière exécution de MT4.

Afin de contourner ce problème, j'ai dû introduire un délai dans mon code, ce qui n'est pas idéal pour un indicateur.

Je me demandais si quelqu'un avait des solutions plus éloquentes. Idéalement, je voudrais que l'heure correcte du serveur MT4 soit retournée au démarrage à chaque fois.

Salutations

PaulB

La documentation n'est-elle pas claire à 100% sur ce point ? "Renvoie la dernière heure connue du serveur (heure d'arrivée de la dernière cotation) en nombre de secondes écoulées depuis 00:00 le 1er janvier 1970" Si le dernier tick date de 10 minutes, TimeCurrent() renverra une date basée sur cette heure...
 
RaptorUK:
La documentation n'est-elle pas claire à 100% sur ce point ?

Pas vraiment, non, ce n'est pas le cas.

Il y a une distinction importante entre les EAs et les indicateurs qui n'est pas couverte dans la documentation : Les EAs ne reçoivent un appel à start() que s'il y a une connexion au broker et un nouveau tick, alors que les indicateurs reçoivent toujours un appel initial à start() avant ou sans qu'une connexion au broker soit établie. Par conséquent, TimeCurrent() peut avoir des significations différentes dans les EAs et les indicateurs.

Si vous voulez une valeur définitivement actualisée pour TimeCurrent() dans un indicateur, vous pouvez probablement utiliser IsConnected() pour vérifier si TimeCurrent() peut se référer au dernier temps connu dans une session précédente.

 

En complément, j'ai même essayé

https://docs.mql4.com/windows/RefreshRates

avant d'appeler TimeCurrent() et cela n'a fait aucune différence. C'est certainement quelque chose à garder à l'esprit.

Je l'utilise dans le cadre d'un code visant à obtenir le décalage entre l'heure du serveur MT4 et l'heure GMT, et les calculs ultérieurs sont faussés.

 
cyclops993:

Pas vraiment, non, ce n'est pas le cas.

Il y a une distinction importante entre les EAs et les indicateurs qui n'est pas couverte dans la documentation : Les EAs ne reçoivent un appel à start() que s'il y a une connexion au broker et un nouveau tick, alors que les indicateurs reçoivent toujours un appel initial à start() avant ou sans qu'une connexion au broker soit établie. Par conséquent, TimeCurrent() peut avoir des significations différentes dans les EAs et les indicateurs.

Je ne pense pas que cela soit pertinent compte tenu de ce que dit la documentation... si vous vérifiez TimeCurrent() avant l'arrivée d'un nouveau tick, vous obtenez l'heure du dernier tick. N'est-ce pas ce que dit la documentation ?
 
RaptorUK:
Je ne pense pas que cela soit pertinent compte tenu de ce que dit la documentation... si vous vérifiez TimeCurrent() avant l'arrivée d'un nouveau tick, vous obtenez l'heure du dernier tick. N'est-ce pas ce que dit la documentation ?

C'est toujours trompeur, mais si vous vouliez être pédant, vous pourriez dire que le problème n'est pas dans la définition de TimeCurrent() mais plutôt dans la définition à https://docs.mql4.com/runtime/start. Celle-ci dit "A l'arrivée de nouvelles cotations, la fonction start() des experts et indicateurs personnalisés attachés sera exécutée". Cela implique clairement que start() n'est appelé qu'en relation avec les nouveaux ticks, comme c'est le cas avec les EA, et que, implicitement, TimeCurrent() ne peut donc pas renvoyer l'heure du dernier tick dans une session précédente d'utilisation du logiciel MT4.

(Encore une fois, une réponse à tout cela est d'ignorer les appels à start() dans un indicateur si IsConnected() renvoie false).

 
cyclops993:

C'est toujours trompeur, mais si vous voulez être pédant [...].

En étant encore plus pédant, si vous avez une toute nouvelle installation de MT4, et que vous copiez dans celle-ci un fichier graphique avec un indicateur attaché avant de démarrer MT4 pour la première fois, alors vraisemblablement l'indicateur recevra un appel à start() avec TimeCurrent() rapporté comme 1/1/1970. Par conséquent, la documentation de TimeCurrent() devrait dire "...la dernière heure connue du serveur, ou 1/1/1970 s'il n'y a pas eu de connexion au serveur".

 
cyclops993:

En étant encore plus pédant, si vous avez une toute nouvelle installation MT4, et que vous copiez dans celle-ci un fichier graphique avec un indicateur attaché avant de démarrer MT4 pour la première fois, alors il est probable que l'indicateur reçoive un appel à start() avec TimeCurrent() rapporté comme 1/1/1970. Par conséquent, la documentation de TimeCurrent() devrait dire "...la dernière heure connue du serveur, ou 1/1/1970 s'il n'y a pas eu de connexion au serveur".

Pas besoin d'en faire tout un plat. Il suffit d'attendre le premier/prochain tick, TimeCurrent() est mis à jour et tout est ok. Un indicateur sur les prix historiques seulement est inutile.
 
angevoyageur:
Pas besoin d'en faire tout un plat. Il suffit d'attendre le premier/prochain tick, TimeCurrent() est mis à jour et tout est ok. Un indicateur sur les prix historiques seulement est inutile.
Je pense que le problème est que la première fois que start() est appelé pour un indicateur peut ne pas être le résultat d'un nouveau tick ... dans ce cas TimeCurrent() rapportera une heure incorrecte. Je ne l'ai pas vérifié...

Dans ce cas, j'ignorerais simplement le premier tick... et je continuerais normalement à partir du tick 2.