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.
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 cotationpour 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.
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 cotationpour 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 ?
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.
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.
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é.
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 quiutilisera votre classedoit connaître l'opération:
Toujours utiliserunevariableglobale
Toujoursinitialiser même si lesymbole et la périodesont 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, votrearticle a le mérite depousser à laréflexion et d'offrir desidées intéressantes.
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 statiquestaticlong last_time=0;
//--- heure actuellelong lastbar_time=SeriesInfoInteger(CurrencyPair,Period01,SERIES_LASTBAR_DATE);
//--- s'il s'agit du premier appel de la fonctionif(last_time==0)
{
//--- régler l'heure et quitter
last_time=lastbar_time;
return(false);
}
//--- si l'heure diffèreif(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 falsereturn(false);
}
Maintenant, elle compile sans problème et semble fonctionner correctement. Je vous remercie de votre attention.
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
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().
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.
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.
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 ?
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.
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).
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é.
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 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.
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 :
Maintenant, elle compile sans problème et semble fonctionner correctement. Je vous remercie de votre attention.