Init() und DeInit() Ausführungsreihenfolge - Seite 23

 
fxsaber:

Im Prinzip könnte man mit einer einzigen Zeile auskommen.

Es wurde eine Zeile daraus gemacht.
 
Nikolai Semko:


Wo ist sie eindeutig?

Probieren Sie dieses primitive Beispiel aus. Sie werden die "Einzigartigkeit" verstehen, wenn Sie die TF wechseln.

In diesem Beispiel wird in OnInit ein Objekt mit den Koordinaten der aktuellen Zeit und des Preises erstellt. Bei OnCalculate bewegt sich dieses Objekt zusammen mit dem Preis.

Bei OnDeinit wird sie einfach (logischerweise) entfernt.

Wenn Sie die TF umschalten, erscheint das Objekt und verschwindet dann wieder.
Warum ist das so?
Denn manchmal löscht OnDeinit der alten TF das, was bereits in OnInit der neuen TF erstellt wurde. Es ist kein Fehler! Was sollte der Programmierer denken, der dieses Beispiel erstellt hat und diesen Zweig nicht gelesen hat?



Welchen Sinn hat es, ein primitives Beispiel für einen Zweizeitler zu verwenden?

Verwenden Sie stattdessen ein Beispiel für einen SEHR korrekten Code.

//+------------------------------------------------------------------+
//|                                                      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);
  }
//+------------------------------------------------------------------+
Dateien:
 
Alexey Viktorov:

Verwenden Sie lieber ein Beispiel für praktisch korrekten Code.

Es ist das Gleiche. Das Objekt kann über Deinit der irrelevanten Indikatorkopie gelöscht werden. Und OnInit des eigentlichen wird VOR diesem Ereignis ausgeführt.

Aber es ist viel besser, die Übertragung von Informationen von OnDeinit der alten Kopie zu OnInit der neuen Kopie zu zeigen. Genau das ist der Punkt.

 
fxsaber:
Das ist dasselbe. Das Objekt kann über Deinit der irrelevanten Indikatorkopie gelöscht werden. Und OnInit des eigentlichen wird VOR diesem Ereignis ausgeführt.
if(UninitializeReason() != REASON_CHARTCHANGE)
 {
  // Если причина деинициализации смена периода графика сюда не попадаем и объекты не удаляются.
 }

In allen anderen Fällen, mit Ausnahme des Ziehens des Netzsteckers des Computers, wird das Objekt gelöscht.

 
fxsaber:


Aber es ist viel besser, die Weitergabe von Informationen von OnDeinit der alten Kopie an OnInit der neuen Kopie zu zeigen. Genau das ist der Punkt.

Ich habe schon vor langer Zeit festgestellt, dass einfache Lösungen nicht Ihre Stärke sind. :-)))
 
Alexey Viktorov:

In allen anderen Fällen, mit Ausnahme des Ziehens des Netzsteckers des Computers, wird das Objekt gelöscht.

Sie haben eine Lösung für ein Problem der privaten Diskussion aufgezeigt. Die allgemeine Formel lautet wie folgt
fxsaber:

VerlässlicheWeitergabe von Informationen von OnDeinit der alten Kopie an OnInit der neuen Kopie.

Folglich ist eine eindeutige OnDeinit/OnInit-Ausführungsfolge erforderlich. Ich habe das nie gebraucht, aber ich habe die Lösungsidee ohne Probleme umgesetzt.

 
fxsaber:
Sie haben die Lösung für ein privates Diskussionsproblem aufgezeigt. Ein allgemeines Beispiel kann wie folgt formuliert werden

Folglich ist eine eindeutige OnDeinit/OnInit-Ausführungsfolge erforderlich. Ich habe das nie gebraucht, aber ich habe die Lösungsidee ohne Probleme umgesetzt.

Nun, ich bin nicht dagegen. Aber mein rechtes Ohr mit dem linken kleinen Finger zu kratzen, ist nichts für mich. Anstatt so einen einfachen Test zu schreiben, "es" ... Ich weiß nicht einmal, wie ich es nennen soll. Es soll für den Amateur sein, denn der Masochismus hat seine Daseinsberechtigung. Bei allem Respekt vor Ihrer Professionalität bei der Programmierung.

 
Alexey Viktorov:

Anstelle eines solchen einfachen Schecks, schreiben Sie"es" ...

Sie haben also das Problem, um das es in diesem Thread geht, nicht verstanden.
 
fxsaber:
Sie haben also nicht verstanden, worum es bei dem in diesem Thread erörterten Problem geht.

Ich verstehe, aber Sie haben die Diskussion des Problems auf Ihre (nicht geringen) Fähigkeiten übertragen.

Und schließlich war meine Antwort auf ein konkretes Beispiel eines Codes eines Colts, und nicht als Antwort auf Ihre Fähigkeiten und ein Beispiel der Datenübertragung mit Regelung der Reihenfolge der Ausführung On_Init und On_Deinit.

Welchen Zweck hat die Fortsetzung des Dialogs? Wollen Sie mich davon überzeugen, dass das Kratzen am rechten Ohr mit dem linken kleinen Finger sehr angenehm ist? Oder einen anderen Zweck?

 
Alexey Viktorov:

Oder ist es ein anderes Ziel?

Das Beispiel, das Sie nachgebessert haben, entsprach nicht genau dem Problem, das Sie erörtert haben. Sie könnten ein anderes Beispiel zeigen, für das es keine Lösung durchUninitializeReason gibt.