Archivio delle versioni MT. - pagina 2

 
Сергей Таболин:

L'assunzione intelligente è che il trasferimento dovrebbe essere fatto immediatamente, senza eseguire il resto del codice. Giusto?

Ma in realtà TesterStop() non ferma affatto il test!

Ci si aspetta che se l'ulteriore esecuzione del codice deve essere fermata, basta scrivere return e non ci sarà un'ulteriore esecuzione. TesterStop(), così come ExpertRemove()

L'Expert Advisor non si ferma immediatamente quando ExpertRemove() viene chiamato, solo un flag viene sollevato per fermare il lavoro dell'Expert Advisor. Cioè, l'Expert Advisor non gestirà nessun evento successivo, chiamerà OnDeinit() e lo scaricherà dal grafico.

E il secondo difetto osservato è che

tester_stop = false;

non è affatto a posto.

 
Alexey Viktorov:

Ci si aspetta che se si vuole fermare l'ulteriore esecuzione del codice, si dovrebbe semplicemente scrivere return e non ci saranno ulteriori esecuzioni. TesterStop() e ExpertRemove()

E il secondo errore che abbiamo notato è che

non è affatto a posto.

Il prossimo evento è OnTick() ?

Dove esce OnTick()?

Perché è fuori posto? Ci si aspettava che se TesterStop() fosse stato attivato, l'esecuzione non avrebbe raggiunto questa linea.

 
Сергей Таболин:

Il prossimo evento è OnTick() ?

Da dove prende l'output OnTick()?

Perché questo non c'è? Ci si aspettava che se TesterStop() fosse stato attivato, l'esecuzione non avrebbe raggiunto questa linea.

Dove uscire e cosa continuare dipende dallo sviluppatore.

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
      }
      check_init  = true;
      tester_stop = false;

Il flag tester_stop in questo codice imposterà false indipendentemente dal fatto che TesterStop() venga eseguito o meno

 
Alexey Viktorov:

Dove andare e cosa continuare dipende dallo sviluppatore.

In questo codice, il flag tester_stop sarà falso indipendentemente dal fatto che TesterStop() sia eseguito o meno

Ce l'ho già)))

La domanda è: cosa fare? Come fermare il test? Per essere precisi. Gli sviluppatori quasi imprecano quando usanoINIT_PARAMETERS_INCORRECT in OnInit() e fa saltare la genetica.

Ho trovato una via d'uscita e non ho avuto problemi fino a poco tempo fa. E ora... Oh, caro ))))

E ancora dove posso uscire da OnTick()?

 
Сергей Таболин:

L'ho già capito)))

La domanda è: cosa fare? Come posso fermare il test? Per essere precisi. Gli sviluppatori quasi imprecano quando usanoINIT_PARAMETERS_INCORRECT in OnInit() e fa saltare la genetica.

Ho trovato una via d'uscita ma non abbiamo avuto problemi di recente. E ora... Oh, caro ))))

Beh, se capite qual è il problema?

         TesterStop();
      tester_stop = false;
      return;

Tutto il codice, dopo l'esecuzione di TesterStop, non sarà eseguito. Cioè smetterà di funzionare immediatamente. Andando oltre, possiamo regolare il flag tester_stop...

Un'altra domanda: cos'è questo numero? Meno molti nove è un tentativo di ottenere un po' di dolore in più? È qui che diventa veramente brutto...

 
Alexey Viktorov:

Bene, se capite qual è il problema rimasto?

Tutto il codice, dopo l'esecuzione di TesterStop, non sarà eseguito. In altre parole, smetterà immediatamente di funzionare. Da lì, possiamo regolare usando il flag tester_stop...

Un'altra domanda: cos'è questo numero? Meno nove è un tentativo di ottenere un po' di dolore in più? È qui che diventa veramente brutto...

Meno un sacco di nove è per determinare che l'uscita era esattamente da TesterStop(). Lo uso solo come sostituto diINIT_PARAMETERS_INCORRECT. Ecco perché non ho bisogno di tutto il resto dopo di esso. Ma quello che succede ora è che l'intero codice viene eseguito e il programmatore ottiene l'errore di divisione per zero. Certo, se un array ha dimensione 1, il valore di quest'ultimo meno il valore del primo sarà sempre zero! E non mi ero assicurato contro questo bug, o, oh, scusatemi, malinteso.

Ho cercato di inserire il ritorno... Solo un po' sbagliato ))) :

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
         return;
      }

Ho finito con:

DM      0       15:32:01.518    Core 1  2016.10.01 00:00:00   153128312914612747
PE      0       15:32:01.518    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
IF      0       15:32:01.518    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
RS      3       15:32:01.518    Core 1  TesterStop() called on 0% of testing interval
GK      0       15:32:01.518    Core 1  final balance 10000.00 USD
JM      0       15:32:01.518    Core 1  OnTester result -99999999999.99001

Semplicemente fantastico ))))

Il più grande GRAZIE!!!

 
Сергей Таболин:

Meno un sacco di nove è per determinare che l'uscita era esattamente da TesterStop(). Lo uso solo come sostituto diINIT_PARAMETERS_INCORRECT. Ecco perché non ho bisogno di tutto il resto dopo di esso. Ma quello che succede ora è che l'intero codice viene eseguito e il programmatore ottiene l'errore di divisione per zero. Certo, se un array ha dimensione 1, il valore di quest'ultimo meno il valore del primo sarà sempre zero! E non mi ero assicurato contro questo bug, o, oh, scusatemi, malinteso.

Ho cercato di inserire il ritorno... Solo un po' sbagliato ))) :

Ho finito con:

Semplicemente fantastico ))))

UN ENORME GRAZIE!!!

Sergei Tabolin:

Grazie, l'ho già capito. Ma non risolve il problema. Può essere risolto sia dalla costanteMQL_TESTER_STOP, sia cambiando il valore di ritorno da void a bool.

Una soluzione inaspettata è stata suggerita daAlexey Viktorov: se si usa return dopo TesterStop(), tutto sembra andare bene. Come e perché succede, personalmente non riesco a capirlo. Tuttavia...

Da qui, aggiungete questo punto alla documentazione o cambiatevoid in bool.

P.S. Ho riscontrato questo problema nella build 2085. Non c'era nessun problema prima. Mi dice qualcosa? )))

Sergey, non c'è nulla di inaspettato in questo. Al contrario, è logico e coerente. Ci sono diversi casi. A volte devi finire di elaborare l'evento prima che l'Expert Advisor sia finito, e a volte, come nel tuo caso, devi finirlo subito. Gli sviluppatori si trovano di fronte alla domanda, qual è la cosa giusta da fare, fermarsi immediatamente, causando il malcontento di coloro che hanno bisogno di finire l'elaborazione dell'evento, o fermarsi dopo il completamento dell'elaborazione dell'evento. Qualsiasi programmatore ha l'operatore di ritorno nel suo arsenale, mentre non c'è nulla in caso di terminazione forzata.

E perché avete bisogno di cambiare il tipo void sul bool, perché di nuovo, nell'arsenale del programmatore ci sono variabili statiche che possono essere cambiate prima o dopo TesterStop (), e in linea di principio, tutto sarà come volete. E l'hai lasciato fuori dal mio esempio per qualche motivo.

 
Alexey Viktorov:

Sergey, non c'è nulla di inaspettato in questo. Al contrario, tutto è logico e coerente. Ci sono diversi casi. A volte devi finire di elaborare l'evento prima che l'Expert Advisor sia finito, e a volte, come nel tuo caso, devi finirlo subito. Gli sviluppatori si trovano di fronte alla domanda, qual è la cosa giusta da fare, fermarsi immediatamente, causando il malcontento di coloro che hanno bisogno di finire l'elaborazione dell'evento, o fermarsi dopo il completamento dell'elaborazione dell'evento. Qualsiasi programmatore ha nel suo arsenale l'operatore di ritorno, mentre non c'è nulla in caso di terminazione forzata.

E perché avete bisogno di cambiare il tipo void sul bool, perché di nuovo, nell'arsenale del programmatore ci sono variabili statiche che possono essere cambiate prima o dopo TesterStop (), e in linea di principio, tutto sarà come volete. E l'hai lasciato fuori dal mio esempio per qualche motivo.

Alexey, grazie mille per il tuo aiuto.

Capisco il problema degli sviluppatori ed è per questo che suggerisco una soluzione del genere. Per poter reagire correttamente alla situazione.

Per quanto riguarda le variabili statiche e il tuo esempio, che ho "buttato via"... Scusa, ma non capisco bene di cosa stiamo parlando. Spiegatemelo, se non vi dispiace.

E chiedere un po' di indulgenza e pazienza. Ho una situazione di vita molto brutta che può rendermi molto irritabile (ne sono consapevole ma non posso farci niente) e poco attento.

Non riesco proprio a capire. Mi gira la testa...

Ecco un esempio:

Il mio codice mostra che se l'ultimo valore dell'array meno il primo valore dell'array è presto zero, il risultato deve essere -999999999999999.88.

Ma durante l'ottimizzazione ottengo questo risultato:

2019.06.16 16:27:09.847 Core 1  final balance 9587.10 USD
2019.06.16 16:27:09.847 Core 1  OnTester result -99999999999.88

9587 - 10000 non è assolutamente uguale a zero e il risultato è -999999999999999.88. Come?!?!? Mi sta già venendo un blocco...

 
Сергей Таболин:

Alexey, grazie mille per il tuo aiuto.

Capisco il problema degli sviluppatori ed è per questo che suggerisco una soluzione del genere. Per poter reagire correttamente alla situazione.

Per quanto riguarda le variabili statiche e il tuo esempio, che ho "buttato via"... Scusa, ma non capisco bene di cosa stiamo parlando. Spiegatemelo, se non vi dispiace.

E chiedere un po' di indulgenza e pazienza. Ho una situazione di vita molto brutta che può rendermi molto irritabile (ne sono consapevole ma non posso farci niente) e poco attento.

Non riesco proprio a capire. Mi gira la testa...

Ecco un esempio:

Il mio codice mostra che se l'ultimo valore dell'array meno il primo valore dell'array è presto zero, il risultato deve essere -999999999999999.88.

Ma durante l'ottimizzazione ottengo questo risultato:

9587 - 10000 non è assolutamente uguale a zero e il risultato è -999999999999999.88. Come?!?!? Mi sta venendo un blocco...

Non so se sia un bene o un male, ma non entro mai in tutto il codice, ecco perché parlavo di una variabile statica. E a giudicare dal fatto che il flag tester_stop è usato in diverse parti del programma, questo flag deve essere dichiarato a livello di variabili globali.

Conferma che hai irragionevolmente "buttato via" il cambiamento del valore della bandiera dal mio esempio.

Questo è l'uso di

   if(tester_stop) return(-99999999999.99);

E apparentemente questa bandiera o non cambia affatto, o non cambia perché il cambiamento non è fornito dove dovrebbe essere.

 
Alexey Viktorov:
A volte è necessario terminare l'elaborazione degli eventi prima che il consulente termini.

Qualsiasi programmatore ha l'operatore di ritorno nel suo arsenale, ma non c'è nulla nella terminazione forzata.


In questo contesto, non possiamo fare un controllo?

if(IsStopped())
if(!IsStopped())
Motivazione: