Sequenza di esecuzione di Init() e DeInit()

 

Ciao a tutti!

Sto affrontando il seguente problema

Ho un indicatore o Expert Advisor.

Ci sono due funzioni in esso - Init() e DeInit()

Qual è la sequenza di esecuzione di queste funzioni quando cambio TF (timeframe)?

Capisco che quando avvio o attacco l'indicatore, l'Init() dovrebbe funzionare.

Quando si cancella dal grafico dovrebbe eseguireDeInit()

Quando si cambia TF, prima dovrebbe funzionareDeInit() dal TF corrente e poiInit() del nuovo TF dovrebbe funzionare

Tuttavia, non viene sempre eseguito in questa sequenza, il che rovina la logica della scrittura del programma.

Ho allegato un esempio di indicatore e di log.

Per favore consigliate chi ha risolto questo problema o lasciate perdere!

File:
ERROR.mq5  2 kb
Log.txt  1 kb
 

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

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Quando si cambia il timeframe, OnInit viene chiamato ogni volta e crea qualche inconveniente.
 
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 tempo (un tempo molto breve) entrambe le copie dell'indicatore esistono in parallelo. Poi la copia precedente viene esclusa.

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


Grazie per il vostro feedback

Riguardo al "viziare la logica"

Ho scritto un indicatore che sostituisce il grafico principale (candele) con un proprio tipo di disegno DRAW_CANDLES

Il punto è rimuovere il grafico principale dei prezzi e visualizzare solo il mio grafico.

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

Disegno il mio grafico (secondo i miei parametri).


Poiché voglio ripristinare 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 un "errore di logica" per esempio.


PS: (((Leggi la documentazionehttps://www.mql5.com/ru/docs/runtime/running )))

Se cambi simbolo o timeframe del grafico a cui è collegato l'Expert Advisor, l'Expert Advisor non viene scaricato e caricato. In questo caso , i gestoriOnDeinit() sul vecchio simbolo/tempo eOnInit() sul nuovo simbolo/tempo (se disponibile) sono chiamaticoerentemente, i valori delle variabili globali estatiche non vengono resettati. Tutti gli eventi ricevuti per un EA prima del completamento dell'inizializzazione (OnInit()) sono saltati.


Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
nmaratr:


Per quanto riguarda.

"viene creata una nuova copia dell'indicatoreche non sa nulla della copia precedente".

Perché poi DeInit cancella gli oggetti che sono stati creati nella nuova copia Init. Se è solo una copia.



 
Petros Shatakhtsyan:
Quando il timeframe viene cambiato, OnInit viene chiamato ogni volta e causa qualche inconveniente.


Cosa significa chiamare OnInit ogni volta che

A cosa serve OnInit - per inizializzare tutte le variabili e i parametri una volta sola

Per esempio

Voglio scrivere un indicatore che crei un marcatore di testo su un grafico con timeframe corrente.

Quando si cancella l'indicatore si rimuove questo marchio di testo dal grafico.

E quando si cambiava il TF si aggiornava il suo contenuto in uno nuovo (rimuovendo il vecchio e creandone uno nuovo).

Cosa otteniamo

Un paio di volte abbiamo cambiato il TF e il marchio di testo è scomparso. (Così prima ha agito OnInit e poi DeInit, che ha rimosso questo marchio).

Poi poche altre volte ha cambiato TF ed è apparso.

Questo non è giusto.

 
nmaratr:

se sono oggetti grafici, appartengono alla stanza della chat e sono accessibili a qualsiasi software che gira su quella stanza
 
Alexander Bereznyak:

se sono oggetti grafici, appartengono alla chat e sono accessibili da qualsiasi programma in esecuzione su questa chat.


Quindi, come si può risolvere questo problema? (Qualcuno ce l'ha???)

O accettare così com'è. Che per accelerare i calcoli, è possibile eseguire i comandi in modo non sequenziale.

Cosa è contrario alla documentazione


Quando si cambia un simbolo o un timeframe di un grafico a cui è collegato l'Expert Advisor, l'Expert Advisor non viene scaricato e caricato. In questo caso

sequenzialmente

I gestoriOnDeinit() sul vecchio simbolo/tempo eOnInit() sul nuovo simbolo/tempo (se disponibile) sono chiamati

 
nmaratr:


Quindi, questo problema può essere risolto? (Ha funzionato per qualcuno???)



Mi unisco all'autore di questo thread. La domanda non è davvero oziosa. E molto concreto.
Ho scoperto questo problema molto tempo fa. Ho contattato servicedesk nel giugno 2016 con un esempio assolutamente simile all'autore di questo thread. Lo hanno ignorato - è ancora un argomento aperto:

Applicazione a servicedesk

Naturalmente ho fatto un trasferimento di parametri in indicatore quando si cambia TF, avendo speso molto tempo su di esso. Ma non voglio fare un compito semplice con i diamanti.
Ma sviluppatori, per favore implementate la possibilità di creare speciali variabili globali negli indicatori che non si reinizializzano durante i cambiamenti di timeframe. Negli Expert Advisors la reinizializzazione non avviene al momento del cambio di TF, nell'indicatore sì. Se ci fosse la possibilità di non reinizializzare alcune variabili e array negli indicatori, la sincronizzazione di OnInit e OnDeinit non avverrebbe, e si aprirebbero nuove interessanti opportunità per i programmatori. Non credo che questa possibilità di disinitizzazione delle variabili influisca sulla sicurezza dei programmi.

A cosa serve?
Ci sono molte situazioni.

Per esempio:
-Quando avvio l'indicatore, eseguo calcoli di variabili, array di indici, array di dati, indipendenti da TF, e possono essere piuttosto lunghi e voluminosi. La domanda è perché devo farlo ogni volta che cambio il TF.
- Non posso cambiare i parametri dell'indicatore attraverso la finestra dei parametri, ma per comodità e chiarezza direttamente dal grafico con il mouse (potete vedere e usare questo indicatore, che lo realizza in un modo più complicato). E le impostazioni non vengono perse ogni volta che si cambia il TF.

 

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...

 
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...

Quindi è tutto qui?
Ho sperimentato e usato questo codice di ragione (REASON_CHARTCHANGE) al massimo. Ma a cosa serve se tutte le variabili sono impostate di nuovo al loro stato originale e OnDeinit può essere eseguito dopo OnInit del nuovo TF
Motivazione: