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
- www.mql5.com
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.
- www.mql5.com
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.
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.
se sono oggetti grafici, appartengono alla stanza della chat e sono accessibili a qualsiasi software che gira su quella stanza
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
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:
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...
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...
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
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
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!