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

 
fxsaber:

En principe, vous pourriez vous contenter d'une seule ligne.

J'ai fait une ligne.
 
Nikolai Semko:


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, il s'avère que l'objet apparaît puis disparaît.
Pourquoi cela se produit-il ?
Parce que parfois OnDeinit de l'ancienne TF supprime ce 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 ?



Quel est l'intérêt d'utiliser un exemple primitif de collégien ?

Utilisez plutôt un exemple de code TRÈS correct.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots   0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   if(ObjectFind(0, "InitDeinit") < 0)                 // ПРОВЕРКА СУЩЕСТВОВАНИЯ ОБЪЕКТА ПЕРЕД ЕГО СОЗДАНИЕМ ОБЯЗАТЕЛЬНА!!!
    {
     ObjectCreate(0,"InitDeinit",OBJ_ARROW_THUMB_UP,0,t,pr);
     Print(__FUNCTION__, " создан InitDeinit");
    }
    
   ObjectSetInteger(0,"InitDeinit",OBJPROP_WIDTH,50); 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(UninitializeReason() != REASON_CHARTCHANGE)      // ПРОВЕРКА ПРИЧИНЫ ДЕИНИЦИАЛИЗАЦИИ РЕШАЕТ ТВОЮ ПРОБЛЕМУ НА РАЗ...
    {
     ObjectDelete(0,"InitDeinit");
     ChartRedraw(0); // ЭТО НУЖНО ТОЛЬКО НА ВЫХОДНЫЕ. В РАБОЧИЕ ДНИ НЕ БУДЕТ ЛИШНИМ, НО С ПРИХОДОМ НОВОГО ТИКА ОБЪЕКТ БУДЕТ НЕДОСТУПЕН.
     Print(__FUNCTION__, "  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 :
 
Alexey Viktorov:

Mieux vaut utiliser un exemple de code virtuellement correct.

C'est la même chose. L'objet peut être supprimé via Deinit de la copie de l'indicateur non pertinent. Et le OnInit de l'actuel est effectué AVANT cet événement.

Mais il est bien mieux de montrer le transfert de toute information de OnDeinit de l'ancienne copie à OnInit de la nouvelle. En fait, c'est le but.

 
fxsaber:
C'est la même chose. L'objet peut être supprimé via Deinit de la copie de l'indicateur non pertinent. Et le OnInit de l'actuel est effectué AVANT cet événement.
if(UninitializeReason() != REASON_CHARTCHANGE)
 {
  // Если причина деинициализации смена периода графика сюда не попадаем и объекты не удаляются.
 }

Dans tous les autres cas, à l'exception du débranchement de l'ordinateur, l'objet sera supprimé.

 
fxsaber:


Mais il est bien mieux d'éviter de passer toute information de OnDeinit de l'ancienne copie à OnInit de la nouvelle. C'est d'ailleurs le but.

J'ai remarqué il y a longtemps, que les solutions simples ne sont pas ton point fort. :-)))
 
Alexey Viktorov:

Dans tous les autres cas, à l'exception du débranchement de l'ordinateur, l'objet sera supprimé.

Vous avez démontré une solution à un problème de discussion privée. La version générale est formulée comme suit
fxsaber:

Passez de manière fiabletoute information de OnDeinit de l'ancienne copie à OnInit de la nouvelle copie.

Ce qui, par conséquent, nécessite une séquence d'exécution OnDeinit/OnInit claire. Je n'en ai jamais eu besoin, mais j'ai mis en œuvre l'idée de la solution sans aucun problème.

 
fxsaber:
Vous avez démontré la solution à un problème de discussion privée. Une formule générale peut être formulée comme suit

Ce qui, par conséquent, nécessite une séquence d'exécution OnDeinit/OnInit claire. Je n'en ai jamais eu besoin, mais j'ai mis en œuvre l'idée de la solution sans aucun problème.

Eh bien, je ne suis pas contre. Mais me gratter l'oreille droite avec mon petit doigt gauche n'est pas pour moi. Au lieu d'un test aussi simple pour écrire"il"... Je ne sais même pas comment l'appeler. Que ce soit pour l'amateur, car le masochisme a le droit d'exister. Avec tout le respect dû à votre professionnalisme en matière de programmation.

 
Alexey Viktorov:

Au lieu d'un chèque aussi simple, écrivez"ça" ...

Vous n'avez donc pas saisi l'essentiel du problème abordé dans ce fil de discussion.
 
fxsaber:
Vous n'avez donc pas compris l'essence du problème discuté dans ce fil.

Je comprends, mais vous avez transféré la discussion du problème à vos capacités (pas petites).

Et après tout ma réponse était à un exemple spécifique d'un code d'un colt, et non en réponse à vos capacités et un exemple de transfert de données avec régulation de la séquence d'exécution On_Init et On_Deinit.

Quel est l'objectif de la poursuite du dialogue ? Essayez-vous de me convaincre que se gratter l'oreille droite avec le petit doigt gauche est très agréable ? Ou un autre but ?

 
Alexey Viktorov:

Ou est-ce une autre cible ?

L'exemple que vous avez refait ne correspondait pas parfaitement au problème dont vous parliez. Vous pourriez montrer un autre exemple qui n'aurait pas de solution à traversUninitializeReason.