Discussion de l'article "Le gestionnaire d'événements "New Bar"" - page 2

[Supprimé]  

Prival:

Rarement, mais il y a des situations où les cotations d'un instrument se figent pendant une longue période (j'ai vu une telle situation avec le yen). Et si le conseiller expert se bloque sur cette paire, vous avez des problèmes si vous n'avez pas traduit tout le code dans OnTime().

Si vous travaillez en OOP ou utilisez certains algorithmes, vous n'aurez pas besoin de traduire le code. Mais convenez qu'il est plus pratique d'obtenir des ticks en temps réel pour toutes les paires dans la vue d'ensemble (et de ne pas inventer quelque chose de votre cru)....

Lizar:

Un tel événement peut être reçu à l'aide de TimeCuurent(), mais la question est de savoir ce qu'il faut en faire et comment le synchroniser.

Qu'est-ce que TimeCuurent() a à voir avec cela ?
 
Interesting:
Quel est le rapport entre TimeCuurent() et cela ?

L'aide indique :

Dans le gestionnaire OnTick(), cette fonction renvoie l'heure du tic-tac traité entrant. Dans d'autres cas (par exemple, dans les gestionnaires OnInit(), OnDeinit(), OnTimer(), etc.), il s'agit de l'heure d'arrivée de la dernière cotation pour n'importe quel symbole disponible dans la fenêtre "Market Watch", la même heure que celle indiquée dans le titre de cette fenêtre.

[Supprimé]  
Lizar:

Le synopsis se lit comme suit :

Dans le gestionnaire OnTick(), cette fonction renvoie l'heure d'arrivée du tick en cours de traitement. Dans d'autres cas (par exemple, appel dans les gestionnaires OnInit(), OnDeinit(), OnTimer(), etc.), il s'agit de l'heure d'arrivée de la dernière cotation pour tout symbole disponible dans la fenêtre "Market Watch", la même heure qui est affichée dans l'en-tête de cette fenêtre.

Oui, c'est clair. Seulement si on le met dans OnTime on ne peut pas mettre à jour l'heure plus d'une fois par minute, et si on le met dans le courant OnTick() on risque de manquer des ticks sur certaines des paires (dans les mults).

Et ce qu'il faut faire dans le bloc de traitement est clair (pour les mults) - Nous obtenons une nouvelle valeur, la comparons avec celle existante et tirons des conclusions pour savoir s'il y a eu un nouveau tick ou non.

Mais dites-moi, pourquoi le faire dans l'Expert Advisor ?

 
Lizar:

Le synopsis se lit comme suit :

erreur. voici ce que dit l'aide https://www.mql5.com/fr/docs/basis/function/events

L'événement NewTick n'est généré que pour les conseillers experts lorsqu'un nouveau tick est reçu sur le symbole au graphique duquel le conseiller expert est attaché.

Encore une fois. Nous parlons d'un Expert Advisor qui est attaché à un symbole. Il est déclenché par l'événement

void OnTick() {}

Si vous êtes dans cette fonction et qu'il n'y a pas de ticks sur cette paire pendant plus d'une heure, vous ne pouvez rien faire dans l'heure qui suit. Jusqu'à présent, la seule solution est de le faire dans un timer, qui démarre indépendamment de l'arrivée de ticks sur l'instrument.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Interesting:

Mais si nous le plaçons dans OnTime, nous ne pouvons pas mettre à jour l'heure plus d'une fois par minute, et si nous le plaçons dans le OnTick() actuel, nous risquons de manquer des ticks sur certaines des paires (en mults).

C'est le problème, nous pouvons obtenir l'événement, mais nous ne pouvons pas l'utiliser.
 
Prival:

Voici ce que dit l'aide https://www.mql5.com/fr/docs/basis/function/events.

Encore une fois. Nous parlons d'un Expert Advisor qui se bloque sur un symbole. Il est lancé par l'événement

void OnTick() {}

Si vous êtes dans cette fonction, et qu'il n'y a pas de ticks sur cette paire pendant plus d'une heure, vous ne pouvez rien faire dans l'heure qui suit. Jusqu'à présent, la seule solution est de le faire dans le timer, il est lancé indépendamment de l'arrivée de ticks sur l'instrument.

Oui, si nous agissons dans le cadre de ce https://www.mql5.com/fr/docs/basis/function/events, je suis d'accord que la meilleure option, comme nous le voyons actuellement, est OnTime. Mais cela nous évitera seulement de dépendre de l'arrivée des ticks. Et elle ne nous sauvera pas de la monotonie : pendant que nous traitons un signal pour un instrument, nous risquons de manquer ou de retarder le traitement d'autres instruments. C'est particulièrement vrai lorsque le "temps de traitement des ordres est de 2 à 7 secondes" + les requêtes.

Je me suis souvenu de TimeCuurent() parce que l'intérêt a commencé à parler de ticks en temps réel pour toutes les paires dans la revue de marché.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
[Supprimé]  
Bon article, merci.
 
Merci
 

Article très intéressant. Merci d'avoir partagé tout cela.

Cependant, quelques remarques :

En parlant de cette fonction, vous dites :

If you call this prototype function from one place, then we have what we need. But if we want to use this function, for example, again in another place in the same calculation loop, it will always return false, which means that there is no bar. And this will not always be true. Static variable in this case imposes an artificial limit on the number of prototype function calls.

  • Vous avez raison. Mais appeler plusieurs fois une fonction comme isnewbar() pendant 1 tick est une mauvaise pratique. Il faut l'appeler une seule fois et garder le résultat dans une variable.
  • Le problème est que la solution que vous proposez, en utilisant une classe sans variable statique, ne résout pas ce que vous avez souligné. Et la situation est encore pire. Vous devez déclarer l'instance de votre classe comme une variable globale (objet), vous devez aussi l'initialiser sur la fonction OnInit(). Celui qui utilisera votre classe doit connaître l' opération:
  1. Toujours utiliser une variable globale
  2. Toujours initialiser même si le symbole et la période sont par défaut (pour les graphiques temporels).
  • Enfin, "si on veut réutiliser cette fonction, par exemple, à un autre endroit dans la même boucle de calcul". Elle renvoie TOUJOURS FAUX.

Vous avez remplacé une variable locale statique par une variable globale, ce qui revient au même et vous n'avez pas résolu votre problème.


Néanmoins, votre article a le mérite de pousser à la réflexion et d' offrir des idées intéressantes.

[Supprimé]  

Bon article, merci pour le partage ! Tout cela est très utile !

Quoi qu'il en soit, j'ai pris votre fonction isNewBar et elle affiche le message suivant lors de la compilation :"possible loss of data due to type conversion".

J'ai donc changé les types de var de datetime à long de cette façon :

//+------------------------------------------------------------------+
//| Retourne vrai si une nouvelle barre est apparue pour une paire symbole/période |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- mémorise l'heure d'ouverture de la dernière mesure dans la variable statique
   static long last_time=0;
//--- heure actuelle
   long lastbar_time=SeriesInfoInteger(CurrencyPair,Period01,SERIES_LASTBAR_DATE);

//--- s'il s'agit du premier appel de la fonction
   if(last_time==0)
     {
      //--- régler l'heure et quitter
      last_time=lastbar_time;
      return(false);
     }

//--- si l'heure diffère
   if(last_time!=lastbar_time)
     {
      //--- mémorise l'heure et renvoie true
      last_time=lastbar_time;
      return(true);
     }
//--- si nous sommes passés à cette ligne, alors la barre n'est pas nouvelle ; return false
   return(false);
  }

Maintenant, elle compile sans problème et semble fonctionner correctement. Je vous remercie de votre attention.


Documentation on MQL5: Language Basics / Data Types / Typecasting
  • www.mql5.com
Language Basics / Data Types / Typecasting - Documentation on MQL5