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

 
Комбинатор:

Quand vous changez lef.

Si les indicateurs ont des déchets dans leurs tampons provenant de l'ancienne période, cela peut également affecter les temporisations.

C'est plus beau

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Nouvelle version de MetaTrader 4 build 1065

Sergey Klimov, 2017.04.14 16:34

Lors du passage d'un compte à l'autre, la variable _Digits de l'indicateur ne change pas.

 
fxsaber:
C'est plus joli.
Avec tous les différents chiffres, cela semble aller dans tous les sens, j'ai arrêté de croiser ces comptes dans le même terminal il y a environ 5 ans.
 
fxsaber:
C'est plus joli.

Ceci s'adresse à ceux qui parlent de la bonne cohérence dans MT4.

Regardez et comprenez que tout n'est pas si beau dans MT4.

 
fxsaber:
La file d'attente est sans ambiguïté.


Eh bien, où est-ce sans ambiguïté ?

Essayez cet exemple primitif. Vous comprendrez le caractère "unique" en changeant de TF.

Dans cet exemple, un objet avec les coordonnées de l'heure et du prix actuels est créé dans OnInit. Dans OnCalculate, cet objet se déplace en même temps que le prix.

Dans OnDeinit, il est simplement (logiquement) supprimé.

Lorsque l'on change de TF, l'objet apparaît puis disparaît.
Pourquoi cela se produit-il ?
Parce que parfois OnDeinit de l'ancienne TF supprime quelque chose qui a déjà été créé dans OnInit de la nouvelle TF. Ce n'est pas un bug ! Que doit penser le programmeur qui a créé cet exemple et qui n'a pas lu cette branche ?

Démonstration de l'ambiguïté de la séquence OnInit et OnDeinit


#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);

   ObjectCreate(0,"InitDeinit",OBJ_ARROW_THUMB_UP,0,t,pr);
   ObjectSetInteger(0,"InitDeinit",OBJPROP_WIDTH,15); 

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"InitDeinit");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   ObjectMove(0,"InitDeinit",0,t,pr);
   return(rates_total);
  }
//+------------------------------------------------------------------+
Dossiers :
 
Nikolai Semko:

Eh bien, où est elle seule.

On y a parlé de la minuterie.
 
fxsaber:
La minuterie y était mentionnée.

Quelle est la différence ? Vous pouvez mettre EventSetTimer dans Unite au lieu de la création d'objet, et mettre EventKillTimer dans Deunite au lieu de la suppression d'objet. Et cela ne réduira pas l'incertitude, parce que le minuteur sera tué par la Deunite de l'ancienne TF, et parfois il ne le sera pas. Et ce sera encore pire, car au moins vous pouvez voir l'objet, mais vous ne pouvez pas voir la minuterie - qu'elle fonctionne ou non.
 

Peut-être qu'ils l'ont déjà inventé, qu'ils n'ont pas tout lu. Si l'indicateur crée un panneau, vous pouvez utiliser la variable globale du terminal, augmenter sa valeur de 1 dans init et l'utiliser comme un additif aux noms des objets graphiques.

Ma tâche était différente - sauvegarder les paramètres du panneau, pour cela j'ai créé des variables globales du terminal dans deinit. La solution est simple - créer des variables globales du terminal dans l'inite et mettre à jour chacune d'entre elles lorsque les paramètres changent dans le panneau graphique. Ne supprimer les variables dans deinit que si la désinitialisation est causée par la suppression de l'indicateur.

 
Dmitry Fedoseev

Si l'indicateur crée un panneau, vous pouvez utiliser une variable globale du terminal, augmenter sa valeur de 1 et l'utiliser comme un ajout aux noms des objets graphiques.
Ce sont des béquilles. Il suffit de passer la bonne commande dans le terminal et c'est tout. Il faut d'abord désinitialiser l'instance précédente, et ensuite seulement lancer la nouvelle.
Nikolai Semko:


Que doit penser le programmeur qui a créé cet exemple et qui n'a pas lu ce fil de discussion ?

Je suis tout à fait d'accord. Les non-lecteurs ne connaîtront pas cette fonctionnalité et perdront leur temps à essayer de la comprendre. Et ce serait des centaines de personnes... ...surtout ceux qui sont débutants.

Il suffit de corriger un bug une fois et c'est tout.

 
Nikolai Semko:

Quelle est la différence ? Vous pouvez mettre EventSetTimer dans Unite au lieu de la création d'objet, et mettre EventKillTimer dans Deunite au lieu de la suppression d'objet. Cela ne réduira pas l'incertitude, parce que le chronomètre sera tué par la désunion de l'ancienne TF, et parfois non. Et ce serait encore pire, car au moins vous pouvez voir l'objet, mais vous ne pouvez pas voir si la minuterie fonctionne ou non.
Cela semble idiot. Les minuteurs des copies d'indicateurs n'ont rien à voir les uns avec les autres.
 
elibrarius:
Ce ne sont que des béquilles. Il suffit de passer la bonne commande dans le terminal et c'est tout. Il faut d'abord désinitialiser l'instance précédente, et seulement ensuite initialiser la nouvelle.

Je suis tout à fait d'accord. Les non-lecteurs ne connaîtront pas cette fonctionnalité et perdront leur temps à essayer de la comprendre. Et ce serait des centaines de personnes... particulièrement désolé pour les débutants.

Tout ce que vous avez à faire est de corriger le bug une fois et c'est tout.


C'est de ça que je parle !
Je suis personnellement sur une lancée, car j'ai l'impression d'avoir un avantage sur la plupart des gens, car je sais comment faire face à tout cela, pas seulement en paroles, mais aussi en actes. J'ai déjà apporté des correctifs et ajouté des béquilles à mes programmes.

Je ne comprends pas pourquoi les développeurs refusent obstinément de considérer cette "fonctionnalité" comme un bogue.
Par exemple :

Slawa:

Les indicateurs doivent être utilisés conformément à leur objectif.

En d'autres termes, la séquence d'exécution de l'indicateur OnInit et OnDeinit lorsque la période de symbole dugraphique a changé ne devrait préoccuper personne.

Mais dans mon exemple avec le gif animé ci-dessus, il y a un bug certain pour un programmeur qui n'a pas lu ce sujet ! Qu'est-ce qui n'est pas fait selon l'objectif prévu ?

Raison: