Archivio delle versioni MT. - pagina 4

 
Roman:

In questo contesto, non possiamo fare il controllo?

Sfortunatamente, questo controllo non ha prodotto nulla...

 
Roman:

Dando un esempio con IsStopped(), stavo solo cercando di rispondere alla prima parte.
A volte è necessario completare l'elaborazione di un evento in anticipo, e a volte è urgente come nel tuo caso.
Leggete la descrizione di questa funzione IsStopped() nella documentazione, forse vi porterà a qualche idea.
Ma a voi sembra che venga da un'altra direzione. Se è così, scusate per una possibile ipotesi.
Ma come si dice nei suggerimenti possibili, e risolve il problema.
La soluzione definitiva non lo dirà a nessuno, perché nessuno conosce tutta la logica del suo codice, e probabilmente non lo approfondirà.

Roman, ancora una volta, non stai citando fino in fondo. E tu l'hai evidenziato tra tutti quelli evidenziati.

Bene, ok, diciamo che viene avviato uno spegnimento forzato. E ho bisogno che questo evento di terminazione venga eseguito fino alla fine e che la complessità dei calcoli superi i 3 secondi. E come posso impedire la terminazione del programma e lasciarlo andare fino alla fine? Questo è esattamente il problema. La conversazione non riguardava il modo di terminare, ma come prevenire una terminazione non correttamente invocata. O non per prevenire, ma per ritardare fino a un certo punto, in particolare fino a quando l'elaborazione dell'evento è completa.

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

Ecco un controllo della tua opzione. Si è conclusa con un messaggio come questo:

È un vicolo cieco...

Quindi l'opzione suggerita è

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

sarà elaborato esattamente allo stesso modo. E si otterrà di nuovo un "blocco". Ma l'impasse non è in mql, ma nella tua mente. Questo non è il modo di fare programmazione. Prima di aspettarvi qualcosa dal codice, immaginatevi al posto di un idiota e senza mezzi termini, come fa un computer, percorrete tutto il codice più volte. Assicurarsi dove l'esecuzione deve essere passata in un caso particolare. Quali parametri devono essere ricevuti in un caso particolare. Poi avviare l'esecuzione e controllare se otteniamo ciò che ci aspettiamo. Se no, allora dobbiamo scoprire dove otteniamo ciò che vediamo durante il processo di debug.

Non può essere altrimenti. Ed è assolutamente impossibile eseguire il debug dei frammenti di codice.

 
Alexey Viktorov:

Roman, ancora una volta, non stai citando fino in fondo. E tu hai evidenziato tra tutti gli evidenziati.

Bene, ok, diciamo che viene attivata una terminazione forzata. E ho bisogno di un evento in cui questa terminazione viene attivata per essere eseguita fino alla fine e la complessità dei calcoli supera i 3 secondi. E come posso impedire la terminazione del programma e lasciarlo andare fino alla fine? Questo è esattamente il problema. La conversazione non riguardava il modo di terminare, ma come prevenire una terminazione non correttamente invocata. O non per prevenire, ma per ritardare fino a un certo punto, in particolare fino a quando l'elaborazione dell'evento è completa.

Dobbiamo aspettare che il calcolo sia completato.

Purtroppo, mql non contiene funzioni come await.
Possiamo provare a sperimentare con Sleep(), ma lo slittamento non è un segno esplicito di terminazione, quindi non è molto adatto.
Provate a creare un'altra condizione, se (il calcolo viene eseguito), allora inizieremo già una terminazione forzata.

 
Alexey Viktorov:

Quindi l'opzione che propongo

sarà elaborato esattamente allo stesso modo. E ancora una volta si otterrà uno "stallo". Ma l'impasse non è in mql, ma nella tua mente. Non si può andare a programmare in questo modo. Prima di aspettarvi qualcosa dal codice, immaginatevi al posto di un idiota e camminate alla cieca, come fa un computer, attraverso tutto il codice diverse volte. Assicurarsi dove l'esecuzione deve essere passata in un caso particolare. Quali parametri devono essere ricevuti in un caso particolare. Poi avviare l'esecuzione e controllare se otteniamo ciò che ci aspettiamo. Se no, allora dobbiamo scoprire dove otteniamo ciò che vediamo durante il processo di debug.

Non può essere altrimenti. Ma non potete fare il debug del codice frammento per frammento.

Beh, il punto è che tutto funzionava prima dell'aggiornamento e ora non so cosa fare.

Inoltre, tutto il codice è aperto in linea di principio.

Inoltre, ho voluto aprire un thread per discutere il miglioramento della mia versione OnTester() ed eccolo qui...

Come si è scoperto, il problema non è in esso ma nell'esecuzione modificata di TesterStop(). In realtà non ha una connessione diretta con OnTester(), ma mi ha rovinato l'umore...

Ora proverò qualcos'altro...

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

Questo è il punto, prima dell'aggiornamento tutto funzionava, ma ora non so proprio cosa fare.

Inoltre, in linea di principio, tutto il codice è aperto.

Inoltre, ho già voluto aprire un thread per discutere il miglioramento della mia versione OnTester() ed eccolo qui...

Come si è scoperto, il problema non è in esso ma nell'esecuzione modificata di TesterStop(). In realtà non ha una connessione diretta con OnTester(), ma mi ha rovinato l'umore...

Ora proverò qualcos'altro...

Hai dato un link alle build precedenti. Sostituisci i file e controllali. Poi puoi dire a tutti quale build funziona ora. Se non funziona, significa che i parametri che non portavano a questa parte del codice in cui sono apparsi i problemi ora erano semplicemente gli stessi.

 
Alexey Viktorov:

Quindi ti ha dato un link alle build precedenti. Sostituite i file e controllate. Poi puoi dire a tutti quale build funziona ora. Se non funziona, significa che i parametri che non portano a questa parte del codice, dove ora c'è un problema, hanno semplicemente coinciso.

È così che ho provato. Mettete la build del 2007 e lì tutti questi problemi sono spariti. Ho esaminato specificamente l'intero registro dopo l'ottimizzazione. Ho trovato 4 (solo 4!) errori di divisione per zero. Quelli erano quelli che si sono verificati quando non c'erano scambi. Naturalmente, questo doveva essere corretto, ma non aveva alcun effetto sul risultato complessivo dell'ottimizzazione! Ma la nuova costruzione ha causato una quantità allarmante di errori e ha reso impossibile l'ottimizzazione.

Ora, per quanto riguarda il consiglio di @Roman.

Grazie, è stato bello. Ma nel mio caso, sembrava essere inutile per TesterStop() perché TesterStop() richiede che il test abbia già superato una percentuale sconosciuta. E non c'è una parola al riguardo nella documentazione.

Ma ha funzionato bene con ExsprtRemove(). Non importa per questa funzione quanti test ci sono passati. Ma abbiamo dovuto avvolgere l'intero codice di lavoro nell'if

   if(!IsStopped())
   {
      тут рабочий код
   }

Beh, sono riuscito a fissare il codice con le stampelle. Grazie ancora.

P.S. In realtà ho dovuto fare una stampella per un'altra stampella. Divertente ))))

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

P.S. In realtà ho dovuto fare una stampella per l'altra stampella. È divertente ))))

Non credo che non ci siano opzioni. Se vi piace programmare stampelle a stampelle, non ho il diritto di impedire. Slava ha risposto su questo argomento.

Forum sul trading, sistemi di trading automatico e test di strategia

Bug, bug, domande

Slava, 2019.06.16 14:04

Fermare immediatamente l'Expert Advisor significa corruzione della memoria. Dopo un arresto immediato dell'Expert Advisor, potrebbero esserci dei blocchi di memoria non liberati. Pertanto, l'arresto immediato dell'Expert Advisor viene utilizzato solo quando il terminale client o l'agente tester viene terminato e solo se l'Expert Advisor non elabora il flag di arresto e continua l'esecuzione.

TesterStop dà il comando per terminare i test. Significa che dopo che il gestore corrente OnInit, OnTick, OnTimer, OnChartEvent è finito, nessun altro evento del tester sarà gestito, poiché il ciclo di elaborazione è finito. Invece OnTester e OnDeinit saranno chiamati.

Forse, avete usato un bug nella build precedente. Ora questo bug è stato risolto e dobbiamo cercare una soluzione adeguata.
 
Сергей Таболин:

È così che ho provato. Mettete la build del 2007 e lì tutti questi problemi sono spariti. Ho esaminato specificamente l'intero registro dopo l'ottimizzazione. Ho trovato 4 (solo 4!) errori di divisione per zero. Quelli erano quelli che si sono verificati quando non c'erano scambi. Naturalmente, questo doveva essere corretto, ma non aveva alcun effetto sul risultato complessivo dell'ottimizzazione! Ma la nuova costruzione ha causato una quantità allarmante di errori e ha reso impossibile l'ottimizzazione.

Ora, per quanto riguarda il consiglio di @Roman.

Grazie, è stato bello. Ma nel mio caso, sembrava essere inutile per TesterStop() perché TesterStop() richiede che il test abbia già superato una percentuale sconosciuta. E non c'è una parola al riguardo nella documentazione.

Ma ha funzionato bene con ExsprtRemove(). Non importa per questa funzione quanti test ci sono passati. Ma abbiamo dovuto avvolgere l'intero codice di lavoro nell'if

Beh, sono riuscito a fissare il codice con le stampelle. Grazie ancora.

P.S. In realtà ho dovuto fare una stampella per un'altra stampella. Divertente ))))

Questa non è una stampella, ma una pratica raccomandata dagli sviluppatori.
Ho trovato questa funzione nella descrizione del ciclo while

while(!IsStopped())
{

}

Ecco perché ho avuto un'idea: se questa funzione controllail fatto della terminazione forzata del programma, perché non usarla per TesterStop().
È un peccato che non funzioni per TesterStop(), lo sapremo ora.
Ma è giusto chiedere agli sviluppatori se la funzioneIsStopped() deve funzionare per la funzione TesterStop()?
Forse è un bug?

Ma la cosa principale è la soluzione del problema.

 
Alexey Viktorov:

Non credo che non ci siano opzioni. Se vi piace programmare stampelle a stampelle, non ho il diritto di interferire. Slava ha risposto su questo argomento

Forse, avete usato un errore che gli sviluppatori hanno fatto nella build precedente. Ora questo bug è stato risolto e dobbiamo cercare una soluzione adeguata.

Capisco tutto e non ho bisogno di stampelle. E ho dovuto cercare una stampella qui, leggere per cosa.

Forse. Ma non ricordo che qualcuno se ne sia lamentato.

Motivazione: