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

 
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


Ho il terminale 5.00 b1571
 
Potete salvare i valori delle variabili da qualche parte, per esempio nei globali. dopo la ritraduzione, potete leggere e ripristinare le variabili.
 
Andrey Dik:
Potete salvare i valori delle variabili da qualche parte, per esempio in globals. Dopo averle tradotte, potete leggere e ripristinare le variabili.


E poi Deinit finirà il suo lavoro e rovinerà tutto. Non ha senso fare Init e Deinit regolari se si fanno i propri Init e Deinit personalizzati.

Anch'io ho incontrato questo problema. (

 
Sergey Chalyshev:


E poi Deinit finirà il suo lavoro e rovinerà tutto. Non ha senso fare Init e Deinit regolari se si fanno i propri Init e Deinit personalizzati.

Anch'io ho incontrato questo problema. (


Sono completamente d'accordo (non ha senso in Init e Deinit regolari)
 
Vasiliy Pushkaryov:


Forse provate ad assegnare agli oggetti grafici un periodo TF come parte del loro prefisso del nome,

e poi applicare qualcosa del genere:


Grazie per la risposta

Sì, ho dovuto fare qualcosa del genere, ma è una soluzione parziale.

Potete fare lo stesso con le variabili attraverso una risorsa o dei file, ma questa è una risorsa aggiuntiva separata, che avrebbe potuto essere evitata sistemando MT5

Ingombrare il codice con funzioni laterali extra, controlli, ecc. (SENZA....)

 

Ho sempre pensato (si scopre invano), che quando cambio TF, prima deinito sul vecchio TF e poi Init sul nuovo. Si tratta di un corso logico degli eventi. Mi sono basato su questa logica quando ho sviluppato Expert Advisors e indicatori. E ora si scopre che è una vera e propria assurdità con eventi che interrompono la sequenza degli eventi...
A volte ho notato, lavorando con i grafici e gli oggetti grafici, che qualcosa non andava e ho dovuto cambiare TF diverse volte per vedere che tutto fosse visualizzato correttamente.


Ora sono i codici dove qualcosa in deiniti cambia e poi anche initi cambia di nuovo... e si scopre che la sequenza è viceversa!!! Questa è una logica terribile. A chi è venuto in mente questo?

La prima cosa che mi viene in mente è che nel mio deinit lo stato precedente (pulsanti premuti/rilasciati) è memorizzato nelle variabili globali e poi i pulsanti sono impostati secondo i valori salvati negli inits. E sono i pulsanti che non sempre si resettano correttamente. Questa è la prima cosa che ho ricordato, forse troverò qualcos'altro... Domani si scaverà in giro.


Grazie agli sviluppatori, hanno messo un sacco di lavoro...

 

In Deinit, scrivete tutti i dati nei globali. Imposta uno dei globali come semaforo tramiteGlobalVariableSetOnCondition.

Init scrivere che se il semaforo è in stato "data dumped" leggeremo e lavoreremo impostando il semaforo in stato "read all".

Se il semaforo è "incomprensibile", allora ci limitiamo ad aspettare il semaforo (attraverso uno Sleep in loop o OnTimer).


Se non c'è nessun semaforo significa che si avvia per la prima volta e si conta tutto e allo stesso tempo si crea un semaforo per il cambiamento non futuro della TF.


Cosa c'è di così complicato in una tale implementazione? Da prescrivere una volta con una biblioteca e basta.

 
fxsaber:

In Deinit, scrivete tutti i dati nei globali. Imposta uno dei globali come semaforo tramiteGlobalVariableSetOnCondition.

Init scrivere che se il semaforo è in stato "data dumped" leggeremo e lavoreremo impostando il semaforo in stato "read all".

Se il semaforo è "illeggibile", allora aspettiamo solo che il semaforo ritorni (sia tramite i cicli Sleep o OnTimer).


Cosa c'è di così complicato in una tale implementazione? Scriverlo una volta in biblioteca e basta.

Non sapevo che esistesse un tale problema. Speravo nella sequenza deinit-init e non viceversa. Quando si conoscono i problemi, è possibile risolverli. Ma mi sembra che dovrebbe essere risolto a livello di logica terminale e non con stampelle, che ora si devono mettere in ogni programma...
 
elibrarius:
Non sapevo affatto che ci fosse questo problema. Speravo in una sequenza deiniti-init e non il contrario. Quando conosci i problemi, puoi risolverli. Ma mi sembra che dovrebbe essere risolto a livello di logica del terminale e non con stampelle, che dovrebbero essere inserite in ogni programma ora...
Non è una stampella, è una soluzione semplice. La questione è chi lo implementa: gli sviluppatori o gli utenti. In entrambi i casi si dovrebbe spendere del tempo e scriverlo una volta sola. Se gli utenti possono farlo, lo abbiamo scritto e non ci preoccupiamo più di discutere la questione. Ho appena letto il thread e mi è venuta subito in mente una soluzione. Cosa c'è da spulciare? Si può pretendere qualcosa per molto tempo, o si può scrivere velocemente da soli.
 
fxsaber:
Questa non è una stampella, ma una semplice soluzione. L'unica questione è chi lo implementa - gli sviluppatori o gli utenti. In entrambi i casi bisogna spendere tempo e scriverlo una volta sola. Se gli utenti possono farlo, lo abbiamo scritto e non ci preoccupiamo più di discutere la questione. Ho appena letto il thread e mi è venuta subito in mente una soluzione. Cosa c'è da spulciare? Si può pretendere qualcosa per molto tempo, o si può scrivere velocemente da soli.
Se si moltiplica il numero di piccole persone che - ognuna da sola, ancora e ancora - risolveranno un problema comune, allora le ore di lavoro sprecate molte volte (al limite, un numero infinito di volte ;-)) supereranno il tempo necessario per qualsiasi variante di editing nel terminale stesso. Anche la presenza di un'ipotetica biblioteca non garantisce che tutti siano a conoscenza della sua esistenza e abbiano bisogno di usarla. In generale, non è chiaro perché fare e lasciare tale "rastrello"?