Bogue/problème de TimeCurrent() et iTime() - page 2

 
RaptorUK:
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'ignore simplement le premier tick... et je continue normalement à partir du tick 2.

Oui, c'est ce que je veux dire.
 
C'est un indicateur, pourquoi vous préoccuper de ce qu'est le TimeCurrent. Faites votre boucle comptée pour l'indicateur et dessinez sur les barres. Ne regardez pas le TimeCurrent, ne regardez pas le Bid.
 
Je trace certaines heures sur un graphique qui correspondent à l'heure GMT, donc cela a une grande importance lorsque j'essaie d'obtenir le décalage entre l'heure du serveur MT4 et l'heure GMT.
 

Paul_B:
I'm plotting certain times on a chart which match to GMT, so it matters a great deal when trying to get the offset between MT4 server time and GMT.

<g>Je ne pense pas que vous soyez encore au fait de la culture de ce forum. La séquence de réponses des modérateurs et des autres utilisateurs à long terme du forum est toujours "Vous faites quelque chose de mal" suivie de "Pourquoi voudriez-vous faire cela ?" lorsqu'il s'avère que vous ne faites pas quelque chose de mal.

Si j'étais vous, je sortirais simplement des appels à start() si IsConnected() est faux. Ou vous pourriez maintenir un compte de tic dans une variable statique et ignorer le tic #1, mais cela retarderait inutilement le démarrage dans des circonstances normales.

 
Merci pour votre contribution cyclops993, je l'ai fait fonctionner actuellement mais ce que j'ai ne semble pas être une solution idéale ou particulièrement robuste. Je vais explorer un peu plus IsConnected().
 
Paul_B: Je trace certaines heures sur un graphique qui correspondent à l'heure GMT, donc cela compte beaucoup lorsque j'essaie d'obtenir le décalage entre l'heure du serveur MT4 et l'heure GMT.
Maintenant nous comprenons le pourquoi. (Pourquoi ne vous êtes-vous pas expliqué dans l'OP ?) Exactement comme mon code
      nextAutoUpdate = timeSrv + HR2400;
      if(Srvr_To_UTC_Auto) if(
         IsDllsAllowed()){                            // Complained @ init
         int      srvrToUTC         = LocalTimeToUTC() - TimeCurrent();
         double   nearestHalfHour   = MathRound(srvrToUTC / 1800.);
         Srvr_To_UTC_Hours          = nearestHalfHour / 2.; // Update external
      }

Je soutiens la suggestion de RaptorUK, pour un indicateur Ignorer le premier tick et mettre à jour toutes les barres au second.

Ce n'est pas non plus complètement inattendu. Puisque les indicateurs ne peuvent pas dormir, si un EA charge un indicateur dans son init via iCustom, l'appel ne peut pas retourner une valeur tampon jusqu'à ce que l'indicateur exécute son init ET son start.

 
Paul_B:
Merci pour votre contribution cyclops993, je l'ai fait fonctionner actuellement mais ce que j'ai ne semble pas être une solution idéale ou particulièrement robuste. Je vais explorer un peu plus IsConnected().

Je ne pense pas que vous ayez beaucoup de choix. MT4 génère un appel factice à start() afin de faire apparaître les indicateurs sur les graphiques hors ligne, et parce qu'il veut plus généralement que les indicateurs (ré)apparaissent sur les graphiques dès que MT4 est chargé, sans attendre qu'une connexion soit établie.

Si vous voulez augmenter la certitude qu'il y a une connexion correctement établie et un TimeCurrent() valide, vous pouvez également rechercher AccountNumber() != 0 et AccountBalance() > 0. Ou vous pouvez simplement attendre le deuxième tick, au prix de retards de plusieurs secondes sur les symboles à faible liquidité.

 

Merci les gars, je vais programmer l'indicateur pour qu'il attende la réception du second tick.

Par ailleurs, j'ai exploré la possibilité d'utiliser IsConnected(), mais j'obtenais toujours le "mauvais" TimeCurrent() même si IsConnected() indiquait vrai.

 
cyclops993:

<g>Je ne pense pas que vous soyez encore au fait de la culture de ce forum. La séquence de réponses des modérateurs et des autres utilisateurs à long terme du forum est toujours "Vous faites quelque chose de mal" suivie de "Pourquoi voudriez-vous faire cela ?" lorsqu'il s'avère que vous ne faites pas quelque chose de mal.

Si j'étais vous, je sortirais simplement des appels à start() si IsConnected() est faux. Ou vous pourriez maintenir un compte de tic dans une variable statique et ignorer le tic #1, mais cela retarderait inutilement le démarrage dans des circonstances normales.

Si un utilisateur ne fournit pas de code de test pour démontrer le problème, il est un peu difficile de donner une aide spécifique et souvent la meilleure hypothèse qui peut être faite est celle d'une erreur dans le code . Vous devriez peut-être prendre le relais et répondre à toutes les questions et demandes d'aide. Cela résoudrait tous vos problèmes, et vous n'auriez pas à vous en prendre à ceux qui essaient simplement d'aider... . .
 
RaptorUK:
Si un utilisateur ne fournit pas de code de test pour démontrer le problème [...]

Il n'y avait rien de mal ou d'absent dans le PO. Il était clair que Paul_B supposait, de manière parfaitement raisonnable d'après la documentation MT4, que start() n'est appelé qu'en réponse à de nouveaux ticks.(La raison pour laquelle il voulait vérifier TimeCurrent() ne fait pas de différence, et ne nous concerne pas vraiment).

Votre réponse était essentiellement une belle version de RTFM, malgré le fait que le manuel est clairement absent dans ce domaine [ce qui, je le souligne, est inhabituel ; la qualité de la documentation MT4 est plutôt bonne]. La réponse d'Angevoyageur a été de décrire cela comme une agitation, ce qui semble faire partie d'un modèle de réponses pathologiquement sensibles à toute critique de MT4, quelle qu'elle soit, même légère. WHRoeder est ensuite intervenu en disant "vous ne voulez pas faire ça", puis en copiant et collant un code qui n'était clairement pas pertinent car Paul_B savait déjà comment calculer un décalage GMT.

Raison: