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

 
Alexey Viktorov:

Questo problema è risolto come due dita... Sai cosa...

In OnDeinit è necessario condizionare il motivo della deinizializzazione prima di cancellare l'oggetto... Se NON è un cambio di periodo, allora l'oggetto viene cancellato. E QUESTO È TUTTO...


Sì, non posso cancellare alcuni oggetti o risorse al cambio di TF, posso anche salvare alcuni piccoli array attraverso oggetto-risorsa, e scrivere nelle informazioni delle risorse sul cambio di TF, ma il punto èDeunit può iniziare ad essere eseguita dopo che l'unità è stata eseguita in un nuovo lasso di tempo - come devo informare l'unità che il TF è cambiato e i vecchi dati devono essere letti? Non è sbagliato?
 
Slawa:

Che tipo di logica è viziata?

Quando si cambia timeframe, viene creata una nuova copia dell'indicatore che non sa nulla della copia precedente. Per un certo periodo di tempo (molto breve) entrambe le copie dell'indicatore esistono in parallelo. Poi la copia precedente viene scaricata.

Leggi la documentazione https://www.mql5.com/ru/docs/runtime/running


Ho letto la descrizione del link, ma non ho trovato questa informazione, come tu hai dato. E se è davvero così, è un grande problema per gli sviluppatori di indicatori. È molto strano e molto brutto che una tale logica sia adottata per ricaricare gli indicatori quando si cambia timeframe. Perché abbiamo bisogno dell'esistenza di due copie dello stesso indicatore in memoria? Chi ne beneficia? Che cosa dà? Sarebbe più logico completare l'esecuzione di una copia dell'indicatore, scaricarla e solo allora caricare la copia successiva.
 
Nikolai Semko:
E questo è tutto?
Ho sperimentato e usato questo codice di ragione (REASON_CHARTCHANGE) il più possibile. E a cosa serve se tutte le variabili sono impostate di nuovo al loro stato originale, e OnDeinit può essere eseguito dopo OnInit di una nuova TF
Ho solo letto della cancellazione di un oggetto alla deinizializzazione e stavo solo rispondendo a questo problema. È più complicato con il salvataggio dei calcoli passati. E apparentemente questo problema non sarà mai risolto. Slava rispondeva a questa domanda, nuovo indicatore, nuovi calcoli. E questo è giusto.
 
Alexey Viktorov:
Slava ha risposto a questa domanda, nuovo indicatore, nuovi calcoli. E questo è giusto.
Il punto è che l'indicatore è lo stesso, ma il timeframe è nuovo. E la domanda riguarda la desincronizzazione di unità e deunità, cioè si verifica la sequenza inversa (illogica) di esecuzione, e a volte è logica. Non c'è niente di peggio per un programmatore che un errore fluttuante e logico.
 
Alexey Viktorov:
E apparentemente questo problema non sarà mai risolto.

E ho fiducia nel team di sviluppo, sono grandi ragazzi e hanno fatto una quantità incredibile e faranno di più. Solo che non ho ancora trovato il tempo di farlo. È vero, bisogna sempre ottenere un feedback da loro con campane e fischietti. :))
Il mio compito è quello di convincerli che deve essere fatto. Anche se non escludo che mi convinceranno che è meglio non fare, forse non capisco qualcosa.
 
Nikolai Semko:

E ho fiducia nel team di sviluppo, sono grandi ragazzi e hanno fatto una quantità incredibile e faranno di più. Solo che non ho ancora trovato il tempo di farlo. Ma devo sempre ottenere un feedback da loro con i tamburelli. :))
Il mio compito è quello di convincerli che deve essere fatto. Anche se non escludo che mi convinceranno che è meglio non fare, forse non capisco qualcosa.


Slawa, cosa significa la frase nella documentazione"Le bibliotechenon gestiscono alcun evento"?

Molto vago

 
nmaratr:

- Quando Inite imposta il colore del grafico principale su trasparente.

Disegno il mio grafico (secondo i miei parametri)


Voglio che ripristini il colore del grafico principale dopo la rimozione del mio indicatore

- In DeInit ripristino il colore del grafico principale


Quando si cambia il TF intendo prima DeInit (ripristinare il colore), e poi Init (tornare ad essere trasparente)


L'esecuzione dei comandi non è sequenziale; periodicamente, quando si cambia il TF

periodicamente il grafico principale (con colore ripristinato) è sovrapposto al mio indicatore.

Ecco per esempio una "scomposizione logica".


Forse per cercare di assegnare agli oggetti grafici il periodo TF come componente del loro prefisso del nome,

e poi applicare qualcosa del genere:

 // --- Переменная для хранения текущего ТФ
ENUM_TIMEFRAMES currentTF;

//+---------------------------------------------------------------------------+
void OnInit()
{
  currentTF = (ENUM_TIMEFRAMES)Period();
}

//+---------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // --- на момент выгрузки индикатора уже сменился ТФ
  if(currentTF != Period()) 
  {
    // если нужно, удалим объекты имеющие префикс старого ТФ и выходим, не трогаем цвет основного графика
    return;
  }

  // раз дошли сюда, ТФ не сменился, восстанавливаем цвет основного графика
  // удалим объекты имеющие префикс старого ТФ
}
 
nmaratr:

- Quando Inite imposta il colore del grafico principale su trasparente.

Disegno il mio grafico (secondo i miei parametri)


Voglio che ripristini il colore del grafico principale dopo la rimozione del mio indicatore

- In DeInit ripristino il colore del grafico principale


Quando si cambia il TF intendo prima DeInit (ripristinare il colore), e poi Init (tornare ad essere trasparente)


L'esecuzione dei comandi non è sequenziale; periodicamente, quando si cambia la TF

periodicamente il grafico principale (con colore ripristinato) è sovrapposto al mio indicatore.

Ecco, per esempio, una "scomposizione logica".

Naturalmente è meglio quando tutto avviene in una sequenza logica, ma dato che dobbiamo lavorare con quello che abbiamo, possiamo spostare il colore del grafico principale a OnCalculate con controllo del valore corrente.
 
Nikolai Semko:
E questo è tutto?
Ho sperimentato e usato questo codice di ragione (REASON_CHARTCHANGE) il più possibile. E a cosa serve se tutte le variabili sono impostate di nuovo allo stato originale, e OnDeinit può essere eseguito dopo OnInit del nuovo TF


Prova ad aggiornare il terminale alla versione 1065. Nelle versioni precedenti c'era un errore di reinizializzazione proprio durante il cambio di timeframe. Può aiutare :)

https://www.mql5.com/ru/forum/187690

Новая версия платформы MetaTrader 4 build 1065
Новая версия платформы MetaTrader 4 build 1065
  • www.mql5.com
Новая версия платформы MetaTrader 4 build 106523 марта 2017 года будет опубликовано обновление платформы MetaTrader 4...
 
Aleksei Radchenko:


Prova ad aggiornare il terminale alla versione 1065. Le versioni precedenti avevano un errore di reinizializzazione semplicemente cambiando l'intervallo di tempo. Potrebbe aiutare :)

https://www.mql5.com/ru/forum/187690

Stiamo parlando di MT5