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

 
Комбинатор:

Quando si cambia ilf.

Se gli indicatori hanno spazzatura nei loro buffer dal vecchio timeframe, questo può influenzare anche i timer.

È più bello

Forum sul trading, sistemi di trading automatico e test di strategia

Nuova versione di MetaTrader 4 build 1065

Sergey Klimov, 2017.04.14 16:34

Quando si passa da un conto all'altro, la variabile _Digits nell'indicatore non cambia.

 
fxsaber:
È più bello.
Con tutte le cifre diverse, sembra andare dappertutto, ho smesso di incrociare questi conti nello stesso terminale circa 5 anni fa.
 
fxsaber:
È più bello.

Questo è per coloro che parlano di una corretta coerenza in MT4.

Guarda e comprendi che non tutto è così bello in MT4.

 
fxsaber:
La coda è inequivocabile.


Beh, 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) cancellato.

Quando cambiamo il TF, l'oggetto appare e poi scompare.
Perché succede questo?
Perché a volte OnDeinit del vecchio TF cancella qualcosa 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?

Dimostrazione dell'ambiguità della sequenza OnInit e 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);
  }
//+------------------------------------------------------------------+
File:
 
Nikolai Semko:

Beh, dov'è lei, in modo univoco.

Lì si è parlato del timer.
 
fxsaber:
Il timer è stato menzionato lì.

Qual è la differenza. Potete mettere EventSetTimer in Unite invece della creazione dell'oggetto, e mettere EventKillTimer in Deunite invece della cancellazione dell'oggetto. E questo non ridurrà l'incertezza, perché il timer impostato sarà ucciso da Deunite del vecchio TF, e a volte non lo farà. E sarà ancora peggio, perché almeno si può vedere l'oggetto, ma non si può vedere il timer - se funziona o no.
 

Forse l'hanno già inventato, non l'ho letto tutto. Se l'indicatore crea un pannello, potete usare la variabile globale del terminale, aumentare il suo valore di 1 in init e usarlo come additivo ai nomi degli oggetti grafici.

Il mio compito era diverso - salvare i parametri del pannello, per questo ho creato variabili globali del terminale in deinit. La soluzione è semplice - creare variabili globali del terminale nell'inite e aggiornare ciascuna di esse quando i parametri cambiano nel pannello grafico. Elimina le variabili in deinit solo se la deinizializzazione è causata dalla rimozione dell'indicatore.

 
Dmitry Fedoseev

Se l'indicatore crea un pannello, potete usare una variabile globale del terminale, aumentare il suo valore di 1 e usarlo come appendice ai nomi degli oggetti grafici.
Queste sono stampelle. Dovete solo fare l'ordine corretto nel terminale e questo è tutto. Prima deinite l'istanza precedente, e solo dopo iniziate quella nuova.
Nikolai Semko:


Cosa deve pensare un programmatore che ha creato questo esempio e non ha letto questo thread?

Sono completamente d'accordo. I non lettori non sapranno di questa caratteristica e uccideranno il loro tempo cercando di capirla. E sarebbero centinaia di persone... ...specialmente quelli che sono principianti.

Tutto ciò di cui avete bisogno è di correggere un bug una volta ed è tutto.

 
Nikolai Semko:

Qual è la differenza. Potete mettere EventSetTimer in Unite invece della creazione dell'oggetto, e mettere EventKillTimer in Deunite invece della cancellazione dell'oggetto. Questo non ridurrà l'incertezza, perché il timer impostato sarà ucciso da Deunite del vecchio TF, e a volte non lo farà. E sarebbe anche peggio, perché almeno si può vedere l'oggetto, ma non si può vedere se il timer funziona o no.
Questo sembra sciocco. I timer delle copie dell'indicatore non hanno nulla a che fare l'uno con l'altro.
 
elibrarius:
Sono tutte stampelle. Dovete solo fare l'ordine corretto nel terminale e questo è tutto. Prima deinite l'istanza precedente, e solo dopo inizializzate quella nuova.

Sono completamente d'accordo. I non lettori non sapranno di questa caratteristica e uccideranno il loro tempo cercando di capirla. E sarebbero centinaia di persone... specialmente per i principianti.

Tutto quello che dovete fare è correggere il bug una volta e questo è tutto.


Ecco di cosa sto parlando!
Personalmente sono su un rotolo, perché sento di avere un vantaggio sulla maggior parte delle persone perché so come affrontare tutto questo, non solo a parole, ma anche con i fatti. Ho già fatto delle toppe e aggiunto delle stampelle ai miei programmi.

Non capisco perché gli sviluppatori si rifiutano ostinatamente di considerare questa "caratteristica" un bug.
Per esempio:

Slawa:

Gli indicatori dovrebbero essere usati per lo scopo previsto.

In altre parole, la sequenza di adempimenti dell'indicatore OnInit e OnDeinit quando il simbolo-periodo delgrafico è cambiato non dovrebbe interessare nessuno

Ma nel mio esempio con la gif animata qui sopra, c'è un bug definitivo per un programmatore che non ha letto questo topic! Cosa non viene fatto secondo il suo scopo?

Motivazione: