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

 
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...


Oui, je ne peux pas supprimer un objet ou une ressource lors d'un changement de TF, je peux sauvegarder même certains petits tableaux par le biais d'un objet-ressource, et écrire dans la ressource des informations sur le changement de TF, mais le point est le suivantSi mon unité commence à être exécutée après que l'unité ait été exécutée dans une nouvelle période, comment dois-je informer l'unité que la période a changé et que les anciennes données doivent être lues ? N'est-ce pas mal ?
 
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 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


J'ai lu la description du lien, mais je n'ai pas trouvé de telles informations, comme celles que vous avez données. Et si c'est vraiment le cas, c'est un grand problème pour les développeurs d'indicateurs. Il est très étrange et très mauvais qu'une telle logique soit adoptée pour recharger les indicateurs lorsque vous changez de période. Pourquoi avons-nous besoin de l'existence de deux copies du même indicateur en mémoire ? Qui en profite ? Que donne-t-il ? Il serait plus logique de terminer l'exécution d'une copie de l'indicateur, de la décharger et seulement ensuite de charger la copie suivante.
 
Nikolai Semko:
Et c'est tout ?
J'ai expérimenté et utilisé ce code de raison (REASON_CHARTCHANGE) autant que possible. Et quelle est l'utilité si toutes les variables sont remises à leur état d'origine et que OnDeinit peut être exécuté après OnInit d'une nouvelle TF ?
Je n'ai lu que la suppression d'un objet lors de la désinitialisation et je ne faisais que répondre à ce problème. C'est plus compliqué avec la sauvegarde des calculs passés. Et apparemment, ce problème ne sera jamais résolu. Slava répondait à cette question, nouvel indicateur, nouveaux calculs. Et c'est juste.
 
Alexey Viktorov:
Slava a répondu à cette question, nouvel indicateur, nouveaux calculs. Et c'est juste.
Le fait est que l'indicateur est le même, mais que l'horizon temporel est nouveau. Et la question porte sur la désynchronisation de l'unité et de la désunité, c'est-à-dire que la séquence d'exécution inverse (illogique) se produit, et parfois elle est logique. Il n'y a rien de pire pour un programmeur qu'une erreur flottante et logique.
 
Alexey Viktorov:
Et apparemment, ce problème ne sera jamais résolu.

Et j'ai confiance dans l'équipe de développement, ce sont des gars formidables qui ont fait un travail incroyable et qui en feront encore plus. Je n'ai pas encore eu le temps de le faire. Il est vrai que vous devez toujours obtenir un retour d'information de leur part avec des cloches et des sifflets. :))
Ma tâche est de les convaincre que cela doit être fait. Bien que je n'exclue pas qu'ils me convainquent qu'il vaut mieux ne pas le faire, peut-être que je ne comprends pas quelque chose.
 
Nikolai Semko:

Et j'ai confiance dans l'équipe de développement, ce sont des gars formidables qui ont fait un travail incroyable et qui en feront encore plus. Je n'ai pas encore eu le temps de le faire. Mais je dois toujours obtenir un retour de leur part avec les tambourins aussi. :))
Ma tâche est de les convaincre que cela doit être fait. Bien que je n'exclue pas qu'ils me convainquent qu'il vaut mieux ne pas le faire, peut-être que je ne comprends pas quelque chose.


Slawa, que signifie la phrase de la documentation"Lesbibliothèquesne gèrent aucun événement" ?

Très vague

 
nmaratr:

- Lorsque Inite définit la couleur du graphique principal comme transparente.

je dessine mon propre graphique (selon mes paramètres)


Je veux qu'il rétablisse 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 (rétablir 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 la couleur restaurée) est superposé à mon indicateur.

Voici par exemple un "découpage logique".


Peut-être pour essayer d'attribuer aux objets graphiques la période TF comme composant du préfixe de leur nom,

et ensuite appliquer quelque chose comme ça :

 // --- Переменная для хранения текущего ТФ
ENUM_TIMEFRAMES currentTF;

//+---------------------------------------------------------------------------+
void OnInit()
{
  currentTF = (ENUM_TIMEFRAMES)Period();
}

//+---------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // --- на момент выгрузки индикатора уже сменился ТФ
  if(currentTF != Period()) 
  {
    // если нужно, удалим объекты имеющие префикс старого ТФ и выходим, не трогаем цвет основного графика
    return;
  }

  // раз дошли сюда, ТФ не сменился, восстанавливаем цвет основного графика
  // удалим объекты имеющие префикс старого ТФ
}
 
nmaratr:

- Lorsque Inite définit la couleur du graphique principal comme transparente.

je dessine mon propre graphique (selon mes paramètres)


Je veux qu'il rétablisse 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 (rétablir 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 la couleur restaurée) est superposé à mon indicateur.

Voici, par exemple, un "découpage logique".

Bien sûr, c'est mieux quand tout se passe dans une séquence logique, mais comme nous devons travailler avec ce que nous avons, nous pouvons déplacer la couleur du graphique principal vers OnCalculate avec vérification de la valeur actuelle.
 
Nikolai Semko:
Et c'est tout ?
J'ai expérimenté et utilisé ce code de raison (REASON_CHARTCHANGE) autant que possible. Et quelle est l'utilité si toutes les variables sont remises à l'état original, et que OnDeinit peut être exécuté après OnInit de la nouvelle TF.


Essayez de mettre à jour le terminal à la version 1065. Dans les versions précédentes il y avait une erreur de réinitialisation juste pendant le changement d'horaire. Cela peut aider :)

https://www.mql5.com/ru/forum/187690

Новая версия платформы MetaTrader 4 build 1065
Новая версия платформы MetaTrader 4 build 1065
  • www.mql5.com
Новая версия платформы MetaTrader 4 build 106523 марта 2017 года будет опубликовано обновление платформы MetaTrader 4...
 
Aleksei Radchenko:


Essayez de mettre à jour le terminal à la version 1065. Les versions précédentes avaient une erreur de réinitialisation juste en changeant le délai. Cela pourrait aider :)

https://www.mql5.com/ru/forum/187690

Nous parlons de MT5