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

 
Slawa:

S'il y a un changement d'horizon temporel au sein d'un même symbole, l'ordre d'initialisation et de désinitialisation est en principe prévisible. Téléchargez la dernière version 1580 - nous avons corrigé certaines choses, maintenant les indicateurs sont supprimés en dernier, donc il ne devrait pas y avoir de désinitération prématurée.

Je ne comprends pas. Veuillez clarifier. Deinit sera garanti après init ?
 
Andrey Khatimlianskii:

Les indicateurs sont de toutes formes et de toutes tailles. Ceux qui sont freinés aussi. Et toutes ne sont pas propres et en code source.

Quelques secondes, c'est drôle. L'interface se ressent en quelques dizaines de millisecondes, le malaise apparaît immédiatement.


Ne vous méprenez pas. Ce n'est pas l'interface qui compte, mais les transitoires - la commutation TF. Sur un tableau vierge, la commutation TF prend-elle un temps infinitésimal ? Non. Alors les indicateurs n'ont rien à voir avec ça.



Et surtout, il n'y a pas de réponse à ma question :
Dans quelles situations, en dehors du travail simple avec des objets graphiques (sans nom TF dans le nom), la séquence DeInit - Init est-elle importante ?


Dans presque toutes les situations. À moins, bien sûr, que nous ne traitions avec des jouets de type MAshek et des primitives similaires :

  1. Écriture dans le fichier. Lors de la déconnexion de l'indicateur, il est nécessaire de sauvegarder les informations accumulées dans un fichier. Parce qu'il est impossible de garder le dossier ouvert en permanence. Il y a un risque de plantage et de perte de toutes les informations enregistrées dans le dossier.
  2. Lorsque vous travaillez avec des objets graphiques. C'est une vraie beauté : un indicateur existe toujours et n'a pas été nettoyé, tandis que le second dessine sur ces objets. C'est ainsi que l'on expliquera à l'utilisateur : "En commutant la TF, vous observerez des perturbations à court terme". )))
  3. Travailler avec DLL. Lorsque Deinit DLL doit interrompre tous les threads, qui ont été créés par elle. La copie d'indicateur suivante les recrée pour elle-même. Maintenant nous obtenons que la nouvelle copie de l'indicateur va essayer de créer tous ces fils et elle sera rejetée, parce qu'ils sont toujours en cours d'exécution. Le nouvel indicateur générera un message d'erreur et ne fonctionnera pas. Juste à cause du changement de TF. Oui, le problème est soluble.

D'accord. Les problèmes autres que le second sont solubles si vous les connaissez. C'est-à-dire que nous devons maintenant pousser toute la logique dans OnCalculate, alors que Init et DeInit ne doivent pas être utilisés. Mais pourquoi en avons-nous besoin alors ?

Quoi qu'il en soit, nous ne parlons pas de multiplateforme maintenant. Il s'avère que MT4 et MT5 ont des approches différentes pour Init et DeInit.

 
nmaratr:


S'il ne s'agissait pas de finances, il n'y aurait peut-être pas une telle discussion.

Et comme un conseiller en trading dépend d'un indicateur ou d'un autre, il cessera tout simplement de fonctionner correctement à cause d'un simple changement de TF. C'est ce qui est le plus stressant.

Alors comment pouvez-vous lui faire confiance pour vos finances ?

Nous sommes peut-être en désaccord avec les développeurs de MT sur cette question.

Il existe de nombreuses options pour résoudre ce problème. Et elles ont presque toutes été exprimées dans ce fil.

1. Si l'indicateur est écrit en utilisant le Conseiller Expert, celui-ci doit être écrit de telle manière qu'il ne soit pas affecté par les changements de période du graphique. Par conséquent, l'indicateur ne sera pas réinitialisé.

2. Si vous devez supprimer des objets graphiques ou modifier la conception du graphique lors de la désinitialisation, vérifiez le motif de la désinitialisation.

3. si l'indicateur doit sauvegarder certains paramètres, alors, comme cela a été dit ici, ne pas sauvegarder ces données à la désinit, mais lorsque ces données sont préparées ou modifiées.

4) Entre deux piles de déchets, choisissez toujours celle qui pue le moins. Par conséquent, lorsque je dois choisir entre la vitesse dont dépendent TOUS les indicateurs et la complexité de la sauvegarde de certaines données dans PLUSIEURS indicateurs, je choisis la vitesse.

 
Stanislav Korotky:
Je ne comprends pas. Veuillez clarifier. Le deinit sera-t-il garanti après le init ?

Si le commutateur de délai descend, d'abord OnInit sur le délai inférieur (nouveau) et ensuite OnDeinit sur le délai supérieur (ancien).

Si l'interrupteur va vers le haut, alors c'est l'inverse. D'abord OnDeinit sur l'ancien cadre temporel (inférieur), puis OnInit sur le nouveau cadre temporel (supérieur).

Ici, nous devons garder à l'esprit que les caches sont traités de la plus petite à la plus grande période de temps.

 
Slawa:

Téléchargez la dernière version 1580 - nous avons corrigé certaines choses, maintenant les indicateurs sont supprimés en dernier, donc il ne devrait pas y avoir de désinitération prématurée.


Oh mec, c'est une "bonne nouvelle". Maintenant, je vais peut-être devoir réécrire le code dans certains programmes, car il a été conçu pour "l'inverse" - d'abord Deunit et ensuite Unit.
Pour être honnête, c'est une logique étrange. Cela signifie que l'ancienne et la nouvelle copie de l'indicateur cohabiteront sans ambiguïté pendant un certain temps, jusqu'à ce que l'unité soit exécutée dans la nouvelle copie de l'indicateur d'abord et la Deunit dans l'ancienne ensuite. À ce moment-là, il n'y a pas de possibilité d'informer la nouvelle copie de certaines informations par le biais de Deunit. C'est évidemment un désordre. Car les unités sont généralement beaucoup plus encombrantes que les unités. Pourquoi une séquence d'exécution aussi étrange ! Ensuite, ce sujet sera relancé encore et encore. Mais si le programmeur de l'indicateur pouvait créer des variables qui ne sont pas réinitialisées lors du changement de TF, alors traitons cette séquence de OnInit et OnDeinit. J'ai déjà écrit à ce sujet à plusieurs reprises(1 et 2). Je suis d'accord avec la logique des développeurs, que pour des raisons de sécurité les pointeurs et références ne sont pas un luxe pour les programmeurs, mais si vous créez un mécanisme d'un type spécial de variables partagées pour toutes les copies de l'indicateur, nous devrons créer le même mécanisme pour toutes les copies de l'indicateur. L'indicateur est le même, les propriétés de l'indicateur sont stockées "quelque part".
 
Slawa:

Si le commutateur de délai est désactivé, il faut d'abord activer OnInit sur le délai le plus bas (nouveau), puis OnDeinit sur le délai le plus élevé (ancien).

Si l'interrupteur va vers le haut, alors c'est l'inverse. D'abord OnDeinit sur l'ancien cadre temporel (inférieur), puis OnInit sur le nouveau cadre temporel (supérieur).

Ici, nous devons garder à l'esprit que les caches sont traités de bas en haut.

C'est encore plus déroutant.

Après tout, si l'indicateur n'est pas utilisé par l'auteur lui-même, alors il peut basculer comme il veut sans attendre l'init et le deinit ? Et que va-t-il se passer ? Et si pour une variante de l'interrupteur dans deinit il est nécessaire de faire certaines actions, alors cela ne fait aucune différence si c'est écrit pour une direction de l'interrupteur ou pour les deux directions. Mais ils ont ajouté des freins pour les indicateurs "lourds".

 
Alexey Viktorov:

C'est encore plus déroutant.

Après tout, si l'indicateur n'est pas utilisé par l'auteur lui-même, alors il peut basculer comme il le souhaite et sans attendre l'init et le deinit ? Et que va-t-il se passer ? Et si pour une variante de l'interrupteur dans deinit il est nécessaire de faire certaines actions, alors cela ne fait aucune différence, si c'est écrit pour une direction de l'interrupteur ou pour les deux directions. Mais ils ont ajouté des freins pour les indicateurs "lourds".

Où les freins ont-ils été ajoutés ? Par rapport à ce qu'ils ont ajouté ?

S'il vous plaît, soutenez vos déclarations avec du code, afin que tout le monde puisse le reproduire.

Encore une fois. Puisqu'une autre copie de l'indicateur est créée lors du changement dela période symbole, l'ordre de OnInit à la nouvelle période symbole et OnDeinit à l'ancienne période symbole est indéfini.

 
Slawa:

Où les freins ont-ils été ajoutés ? Par rapport à ce que vous avez ajouté ?

Soyez assez aimable pour étayer vos affirmations avec du code afin que tout le monde puisse reproduire.

Encore une fois. Puisqu'une autre copiede l'indicateur est créée lors du changement de période-symbole, l'ordre d'exécution de OnInit sur la nouvelle période-symbole et de OnDeinit sur l'ancienne période-symbole est indéfini.

Dans ce message

Slawa:

Si le changement d'horizons temporels ne fonctionne pas, il faut d'abord appliquer OnInit à l'horizon temporel le plus récent (nouveau), puis OnDeinit à l'horizon temporel le plus ancien (ancien).

Si l'interrupteur va vers le haut, alors c'est l'inverse. D'abord OnDeinit sur l'ancien cadre temporel (inférieur), puis OnInit sur le nouveau cadre temporel (supérieur).

Vous devez garder à l'esprit que les caches sont traités d'un délai d'ordre inférieur à un délai d'ordre supérieur.

L'avez-vous dit tel qu'il est ou comme vous l'avez fait lors de la préparation de la nouvelle construction ?

Si c'est le cas, alors je me suis trompé et je retire ce que j'ai dit.

 
Alexey Viktorov:

Dans ce message.

Avez-vous dit tel quel ou tel que fait en préparant une nouvelle construction ?

Si c'est le cas, j'ai mal compris et je retire ce que j'ai dit.

Ceci est fait dans le build 1580.

Auparavant, la désinitialisation au changement d'heure était presque toujours antérieure. Mais seulement si l'interrupteur de temporisation tombe, la désinitialisation a été faite avec le code 1, et non 3, comme il se doit.

 
Slawa:

Ceci est fait dans le build 1580

Auparavant, la désinitialisation se faisait presque toujours plus tôt lors du changement d'horizon temporel. Mais seulement si l'interrupteur temporel tombe en panne, la désinitialisation a été faite avec le code 1 et non 3 comme il se doit.


Alors comment traiter ces codes de désinitialisation dans Inite de l'indicateur, à quoi servent ces codes ? Comme il n'y a pas de possibilité d'attendre dans l'indicateur, le sommeil ne fonctionne pas.
Raison: