Séquence d'exécution de Init() et DeInit()

 

Bonjour à tous !

Je suis confronté au problème suivant

J'ai un indicateur ou un conseiller expert.

Il contient deux fonctions : Init() et DeInit().

Quelle est la séquence d'exécution de ces fonctions lorsque je change de TF (timeframe) ?

Je comprends que lorsque je lance ou attache l'indicateur, la fonction Init() doit fonctionner.

En le supprimant du graphique, il doit exécuterDeInit().

Lors d'un changement de TF, lafonction DeInit() de la TF actuelle doit d'abord fonctionner, puis lafonction Init() de la nouvelle TF doit fonctionner.

Cependant, il n'est pas toujours exécuté dans cet ordre, ce qui gâche la logique de l'écriture du programme.

J'ai joint un échantillon de l'indicateur et des journaux.

Veuillez indiquer qui a résolu ce problème ou bien oubliez-le !

Dossiers :
ERROR.mq5  2 kb
Log.txt  1 kb
 

Quel genre de logique est gâchée ?

Lorsque vous changez d'horizon temporel, une nouvelle copie de l'indicateur est créée qui ne sait rien de la copie précédente. Pendant une certaine période de temps (très courte), les deux copies de l'indicateur existent en parallèle. Ensuite, la copie précédente est déchargée.

Lire la documentation https://www.mql5.com/ru/docs/runtime/running

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Lorsque le délai est modifié, OnInit est appelé à chaque fois, ce qui crée quelques désagréments.
 
Slawa:

Quel genre de logique est gâchée ?

Lorsque vous changez d'horizon temporel, une nouvelle copie de l'indicateur est créée qui ne sait rien de la copie précédente. Pendant un certain temps (un temps très court), les deux copies de l'indicateur existent en parallèle. Ensuite, la copie précédente est exclue.

Lire la documentation https://www.mql5.com/ru/docs/runtime/running


Merci pour vos commentaires

À propos de "l'altération de la logique"

J'ai écrit un indicateur qui remplace le graphique principal (chandeliers) par son propre type de dessin DRAW_CANDLES

Le but est de supprimer le graphique principal des prix et de n'afficher que mon graphique.

- Lorsque Inite définit la couleur du graphique principal sur transparent.

Je dessine mon propre graphique (selon mes paramètres).


Puisque je veux restaurer la couleur du graphique principal après la suppression de mon indicateur

- Dans DeInit je restaure la couleur du graphique principal


Quand je change le TF, je veux dire d'abord DeInit (restaurer la couleur), et ensuite Init (redevenir transparent).


L'exécution des commandes n'est pas séquentielle ; périodiquement, lors du changement de la TF

périodiquement le graphique principal (avec une couleur restaurée) est superposé à mon indicateur.

Voici par exemple une "erreur de logique".


PS : (((Lire la documentationhttps://www.mql5.com/ru/docs/runtime/running )))

Si vous changez de symbole ou d'horizon temporel pour le graphique auquel le conseiller expert est attaché, le conseiller expert n'est pas déchargé et chargé. Dans ce cas , les gestionnairesOnDeinit() sur l'ancien symbole/la ligne de temps etOnInit() sur le nouveau symbole/la nouvelle ligne de temps (si disponible) sont appelésde manière cohérente, les valeurs des variables globales et desvariables statiques ne sont pas réinitialisées. Tous les événements reçus pour un EA avant la fin de l'initialisation (OnInit()) sont ignorés.


Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
nmaratr:


Concernant.

"une nouvelle copie de l'indicateur est crééequi ne sait rien de la copie précédente"

Pourquoi alors DeInit supprime les objets qui ont été créés dans la nouvelle copie Init. Si c'est juste une copie.



 
Petros Shatakhtsyan:
Lorsque le délai est modifié, OnInit est appelé à chaque fois, ce qui cause quelques désagréments.


Qu'est-ce que cela signifie d'appeler OnInit à chaque fois

A quoi sert OnInit - à initialiser une fois toutes les variables et tous les paramètres

Par exemple

Je veux écrire un indicateur qui crée un marqueur de texte sur un graphique avec la trame temporelle actuelle.

Lorsque vous supprimez l'indicateur, cette marque de texte est supprimée du graphique.

Et lors du changement de TF, il mettrait à jour son contenu vers un nouveau (en supprimant l'ancien et en créant un nouveau).

Ce que nous obtenons

Nous avons changé plusieurs fois le TF et la marque de texte a disparu. (Donc, d'abord OnInit et ensuite DeInit a agi, ce qui a supprimé cette étiquette).

Ensuite, quelques fois de plus, j'ai changé de TF et il est apparu.

Ce n'est pas bien.

 
nmaratr:

s'il s'agit d'objets graphiques, ils appartiennent à la salle de discussion et sont accessibles à tout logiciel fonctionnant sur cette salle de discussion.
 
Alexander Bereznyak:

s'il s'agit d'objets graphiques, ils appartiennent au chat et sont accessibles par tout programme s'exécutant sur ce chat.


Alors, comment résoudre ce problème ? (Quelqu'un l'a-t-il ? ??)

Ou accepter tel quel. Que pour accélérer les calculs, il est possible d'exécuter les commandes de manière non séquentielle.

Ce qui est contraire à la documentation


Lorsque l'on change de symbole ou d'horizon temporel d'un graphique, auquel le conseiller expert est attaché, le conseiller expert ne sera pas déchargé et chargé. Dans ce cas

séquentiellement

Les gestionnairesOnDeinit() sur l'ancien symbole/la ligne de temps etOnInit() sur le nouveau symbole/la nouvelle ligne de temps (si disponible) sont appelés.

 
nmaratr:


Alors, ce problème peut-il être résolu ? (Cela a-t-il fonctionné pour quelqu'un ? ??)



Je me joins à l'auteur de ce fil. La question n'est pas vraiment oiseuse. Et très spécifique.
J'ai découvert ce problème il y a longtemps. J'ai contacté servicedesk dès juin 2016 avec un exemple absolument similaire à celui de l'auteur de ce fil. Ils l'ont ignoré - c'est toujours un sujet ouvert :

Demande d'adhésion à Servicedesk

Bien sûr, j'ai fait un transfert de paramètres dans l'indicateur lors du changement de TF, ayant passé beaucoup de temps dessus. Mais je ne veux pas faire une simple tâche avec des diamants.
Mais les développeurs, s'il vous plaît, implémentez la possibilité de créer des variables globales spéciales dans les indicateurs qui ne se réinitialiseront pas pendant les changements d'horizon temporel. Dans les conseillers experts, la réinitialisation ne se fait pas au moment du changement de TF, dans l'indicateur, si. S'il existait une possibilité de ne pas réinitialiser certaines variables et tableaux dans les indicateurs, la synchronisation de OnInit et OnDeinit ne se produirait pas, et elle ouvrirait de nouvelles possibilités intéressantes pour les programmeurs. Je ne pense pas que cette possibilité de désinitialisation des variables affectera la sécurité des programmes.

C'est pour quoi faire ?
Il y a beaucoup de situations.

Par exemple :
-Lorsque je lance l'indicateur, j'effectue des calculs de variables, de tableaux d'indices, de tableaux de données, indépendants de TF, et ils peuvent être assez longs et volumineux. La question est de savoir pourquoi je dois le faire à chaque fois que je change de TF.
- Je ne peux pas modifier les paramètres de l'indicateur à travers la fenêtre des paramètres, mais pour des raisons de commodité et de clarté, directement à partir du graphique avec une souris (vous pouvez voir et utiliser cet indicateur, qui le réalise d'une manière plus compliquée). Et les paramètres ne sont pas perdus chaque fois que vous changez de TF.

 

Ce problème est résolu comme deux doigts... Tu sais quoi...

Dans OnDeinit, il est nécessaire de conditionner la raison de la désinitialisation avant de supprimer l'objet... S'il ne s'agit PAS d'un changement de période, l'objet est supprimé. ET C'EST TOUT...

 
Alexey Viktorov:

Ce problème est résolu comme deux doigts... Tu sais quoi...

Dans OnDeinit, il est nécessaire de conditionner la raison de la désinitialisation avant de supprimer l'objet... S'il ne s'agit pas d'un changement de période, l'objet est supprimé. ET C'EST TOUT...

Alors c'est tout ?
J'ai expérimenté et utilisé au maximum ce code de raison (REASON_CHARTCHANGE). Quelle est l'utilité si toutes les variables sont remises dans leur état d'origine et que OnDeinit peut être exécuté après OnInit de la nouvelle TF ?