Sequenza di esecuzione di Init() e DeInit() - pagina 23

 
fxsaber:

In linea di principio, si potrebbe fare con una sola linea.

L'ho fatto su una sola linea.
 
Nikolai Semko:


Dove è inequivocabile?

Provate questo esempio primitivo. Capirete l'"unicità" quando cambierete il TF.

In questo esempio, un oggetto con le coordinate dell'ora e del prezzo correnti viene creato in OnInit. In OnCalculate questo oggetto si muove insieme al prezzo.

In OnDeinit viene semplicemente (logicamente) rimosso.

Quando si cambia il TF, si scopre che l'oggetto appare e poi scompare.
Perché succede questo?
Perché a volte OnDeinit del vecchio TF cancella ciò che è già stato creato in OnInit del nuovo TF. Non è un bug! Cosa dovrebbe pensare il programmatore che ha creato questo esempio e non ha letto questo ramo?



Che senso ha usare un esempio primitivo di un due tempi?

Usate invece un esempio di codice MOLTO corretto.

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

Meglio usare un esempio di codice virtualmente corretto.

È lo stesso. L'oggetto può essere cancellato tramite Deinit della copia dell'indicatore irrilevante. E OnInit dell'attuale viene eseguito PRIMA di questo evento.

Ma è molto meglio mostrare il trasferimento di qualsiasi informazione da OnDeinit della vecchia copia a OnInit della nuova. In realtà, questo è il punto.

 
fxsaber:
Questo è lo stesso. L'oggetto può essere cancellato tramite Deinit della copia dell'indicatore irrilevante. E OnInit dell'attuale viene eseguito PRIMA di questo evento.
if(UninitializeReason() != REASON_CHARTCHANGE)
 {
  // Если причина деинициализации смена периода графика сюда не попадаем и объекты не удаляются.
 }

In tutti gli altri casi, tranne che per aver staccato la spina del computer, l'oggetto sarà cancellato.

 
fxsaber:


Ma è molto meglio mostrare il passaggio di qualsiasi informazione da OnDeinit della vecchia copia a OnInit della nuova. Questo è in realtà il punto.

Ho notato da tempo che le soluzioni semplici non sono il tuo forte. :-)))
 
Alexey Viktorov:

In tutti gli altri casi, tranne che per aver staccato la spina del computer, l'oggetto sarà cancellato.

Avete dimostrato una soluzione a un problema di discussione privata. Quella generale è formulata come segue
fxsaber:

Passa in modo affidabilequalsiasi informazione da OnDeinit della vecchia copia a OnInit della nuova copia.

Il che, di conseguenza, richiede una chiara sequenza di esecuzione OnDeinit/OnInit. Non ne ho mai avuto bisogno, ma ho implementato l'idea della soluzione senza problemi.

 
fxsaber:
Avete dimostrato la soluzione di un problema di discussione privata. Una generale può essere formulata come segue

Il che, di conseguenza, richiede una chiara sequenza di esecuzione OnDeinit/OnInit. Non ne ho mai avuto bisogno, ma ho implementato l'idea della soluzione senza problemi.

Beh, non sono contrario. Ma grattarmi l'orecchio destro con il mignolo sinistro non fa per me. Invece di un test così semplice per scrivere"esso" ... Non so nemmeno come chiamarlo. Che sia per i dilettanti, perché il masochismo ha il diritto di esistere. Con tutto il rispetto per la vostra professionalità nella programmazione.

 
Alexey Viktorov:

Invece di un assegno così semplice, scrivete"esso" ...

Quindi non hai capito il punto del problema discusso in questo thread.
 
fxsaber:
Quindi non hai capito l'essenza del problema discusso in questo thread.

Capisco, ma avete trasferito la discussione del problema alle vostre capacità (non piccole).

E dopo tutto la mia risposta era a un esempio specifico di un codice di un puledro, e non in risposta alle vostre capacità e a un esempio di trasferimento di dati con regolazione della sequenza di esecuzione On_Init e On_Deinit.

Qual è lo scopo di continuare il dialogo? Stai cercando di convincermi che grattare l'orecchio destro con il mignolo sinistro è molto piacevole? O un altro scopo?

 
Alexey Viktorov:

O è un obiettivo diverso?

L'esempio che hai rifatto non corrispondeva perfettamente al problema che stavi discutendo. Potresti mostrare un altro esempio che non avrebbe una soluzione attraversoUninitializeReason.
Motivazione: