Test del nuovo compilatore MQL5 per piattaforme x64 - calcoli da 2 a 10 volte più veloci! - pagina 14

 

Ho voluto testare l'accelerazione dei calcoli sul mio Expert Advisor oggi in previsione della super velocità (ho anche usato una CPU più veloce) e... Per qualche motivo l'Expert Advisor ottimizzato girava nel tester tre volte più lentamente. Non ti è mai successo? Non appena avrò localizzato e riprodotto il problema, posterò il codice. Non ci sono chiamate di sistema, solo operazioni con un mucchio di array e operazioni aritmetiche di base.

Inoltre, ecco un paio di richieste:

1. Possiamo aggiungere la possibilità di lanciare lo script dall'editor senza debugging, cioè come dal Navigatore. Questo tipo di lancio è presente in qualsiasi ambiente di sviluppo. Stavo pensando di suggerire Ctrl + F5, come in sys, ma la combinazione è già presa da voi :)

2. Aggiungere il richiamo dello stdout della console di Wind dallo script, per evitare di passare al terminale ogni volta per vedere il risultato dello script. Anche se, da quanto ho capito, si può provare a chiamarlo usando WinAPI.

3. Aggiungere almeno alcune impostazioni di ottimizzazione genetica. Per esempio, il numero di combinazioni può essere 1e35 e 10k passaggi non è sempre sufficiente (l'ottimizzatore non genera nemmeno nuovi passaggi dopo 10k), si capisce che 20-30k sarebbero sufficienti, ma non si può sintonizzare. D'altra parte, quando si fissano alcuni parametri e se ne lasciano alcuni per una regolazione più fine e si studia la distribuzione... Così, quando il numero di combinazioni è piccolo, per esempio, 50k, l'ottimizzatore per GA offre solo 2k corse - e questo non è sufficiente per questo particolare compito - per studiare meglio il comportamento della funzione su questi parametri. Cioè è stupido passare attraverso tutti i 50k, mentre GA genera solo 2k corse e non dà un quadro sufficiente. Spero che tu capisca di cosa sto parlando.

 
Renat Fatkhullin:

I miglioramenti arriveranno sicuramente.

Qualcuno ha già testato il debug sulla storia nello strategy tester?

Penso che a molti piacerebbe testarlo, ma la difficoltà e la realtà è che di solito si testa dove si scrive il codice e si intende fare trading. Ci sono pochissimi broker che offrono la MT5, il che rallenterà il test di tutte le nuove funzionalità da parte dei trader e rallenterà inevitabilmente lo sviluppo della MT5. Quindi forse ha senso cercare qualche soluzione non banale che risolva questo problema e aumenti la motivazione ad usare MT5.
 
Renat Fatkhullin:

I miglioramenti arriveranno sicuramente.

Qualcuno ha già testato il debug sulla storia nello strategy tester?

C'è qualcosa che sto sbagliando. Il mio visualizzatore si apre semplicemente e funziona come al solito. Il breakpoint è proprio sulla prima dichiarazione in OnInit() - ma non funziona.
 
Renat Fatkhullin:

I miglioramenti arriveranno sicuramente.

Qualcuno ha già testato il debug sulla storia nello strategy tester?

Sarebbe anche bello poter selezionare "trova usi" dal menu contestuale.

So che è un po' off-topic, ma non ho bisogno di scrivere modifiche, ma è bello per gli sviluppatori avere queste cose.

Ho controllato Moving Average, MACD Sample sul nuovo compilatore, ma non ho trovato alcuna differenza. Lo proverò sui miei EA.

 

Non ho debuggato completamente e trovato il bug (molto diversamente), ma finora ho trovato i seguenti problemi con Optimize=1. Lasciate che vi dica subito che il mio Expert Advisor ha circa 100 parametri di input, e lavora molto con gli array. Inoltre, non fa trading, esegue solo calcoli.

Descriverò l'ordine delle mie azioni:

1. Lancio il terminale, seleziono "Optimization = Disabled" nel tester e do un set principale di parametri di input. Il tester dà il risultato corretto.

2. Scelgo "Optimization = Fast (genetic algorithm)", lo lancio - il tester non genera nemmeno il primo passo. Gli agenti (processori) non rispondono. All'inizio ho pensato che ci potessero essere degli errori di calcolo con un cattivo set di parametri e che il tester morisse.

3. Di nuovo seleziono "Optimization = Disabled" e di nuovo do il set di riferimento. Ora il tester non mostra alcun risultato.

4. Apro il codice EA nell'editor, premo F5 per generare un codice non ottimizzato. Nel tester, lo eseguo di nuovo sul set di riferimento - voilà, c'è un risultato. Beh, c'è qualcosa che non va nell'Expert Advisor a causa dell'ottimizzazione.

Ho aggiunto una funzione che registra i parametri di input di Expert Advisor in un file. Così, al passo 2 (l'ottimizzazione è in esecuzione e i passi del tester non sono quasi generati), spuntavano dei valori casuali per alcuni parametri che non sono affatto previsti perché il parametro è immutabile o il valore è fuori dall'intervallo impostato. Per esempio, avevo un parametro impostato a 80 ed era invariante. Nel registro era impostato su 0,01355835795402527 (?). L'altro è stato impostato a 0 e registrato come 4.940656458412465e-324; entrambi i parametri erano doppi. Ma poi ho scoperto che c'erano anche valori totalmente inappropriati per int.

In secondo luogo, ho tagliato il codice EA "non necessario" per lasciare solo il codice che causa anche un errore. Eppure si è rivelato essere abbastanza. In più, la funzione di logging emetteva il valore di TUTTI i parametri. Tuttavia, quando ho rimosso la maggior parte dei parametri (e sono diventati meno di 64 o 80), il tester non è morto. Detto questo, ho anche trovato una strana connessione tra l'errore e la mia funzione di registrazione. Quando è commentato (cioè tutti i parametri NON sono usati nel codice), il tester muore. Quando si registra, il tester muore. Molto strano.

E terzo. Ho notato che la messa in parallelo dei calcoli non comporta un aumento lineare della velocità complessiva di esecuzione. Per esempio, allego i file: uno script e un Expert Advisor con lo stesso codice. Questo è un vero pezzo di codice, ritagliato dal mio Expert Advisor, ma gli array sono rinominati. Quando Optimize=1, il mio script viene eseguito in 156 ms, cioè forse 6 esecuzioni al secondo. (Senza Optimize ci vuole 3 volte di più). Ho 8 threads, cioè teoricamente sono possibili 48 esecuzioni al secondo. Quando si esegue l'Expert Advisor nel tester (fare Slow Optimize, abilitare il parametro dummy, per esempio, per 2000 esecuzioni) ho ottenuto solo poco più di 4 esecuzioni al secondo, cioè ancora più lento che su un singolo core! Anche se c'erano onestamente 8 processi appesi nel task manager. Perché è così? Processi multipli che bloccano l'accesso alla memoria? Inizializzazione lunga degli array? (Bisogna ammettere che gli array non sono grandi lì).

Quando eseguiamo un singolo test nel tester, Print: 156 ms. Cioè, tutto sembra essere normale con l'Expert Advisor.

A proposito, ci saranno mai i puntatori in MQL? :) Perché ho dovuto fare degli array-copie.

 
xfo:

Per qualche ragione, expert con l'ottimizzazione ha lavorato 3 volte più lentamente nel tester.

Ora capisco perché sta diventando più lento - solo un agente (casuale) funziona, gli altri falliscono e così costantemente un tentativo ogni pochi secondi. Niente è chiaro dal log del tester. Da quanto ho capito, se anche l'agente più recente fallisce, allora succede quello di cui ho scritto prima: i passi del tester non vengono generati affatto.

La build 1117 non ha risolto tutti i problemi descritti sopra (incluso struct array).

 

Aggiornato a 1117 oggi, ma il debug sui dati storici - ancora non va.

Prendo ExpertMACD.mt5, metto un breakpoint proprio all'entrata della funzione Init, inizio il debug sui dati storici (premo il pulsante), la finestra dell'editor si chiude, le impostazioni dello strategy tester si aprono. Ho impostato il periodo di tempo (per il 2015, i diari, tutte le zecche), la visualizzazione - la casella di controllo è attiva, premo il pulsante Start e la visualizzazione inizia. Il punto di interruzione non ha funzionato.

Cosa sto facendo di sbagliato?

 
George Merts:

Aggiornato alla 1117 oggi, ma il debug sui dati storici - ancora non va avanti.

Prendo ExpertMACD.mt5, metto un breakpoint proprio all'entrata della funzione Init, inizio il debugging sui dati storici (premendo il pulsante), la finestra dell'editor si chiude, le impostazioni dello strategy tester si aprono. Ho impostato il periodo di tempo (per il 2015, i diari, tutte le zecche), la visualizzazione - la casella di controllo è attiva, premo il pulsante Start e la visualizzazione inizia. Il punto di interruzione non ha funzionato.

Cosa sto facendo di sbagliato?

Ho bisogno di aprire un conto demo suMetaQuotes-Demo, quindi

Il mio MACD Sample.mq5 su un conto demo moex il simbolo USDRUB_TOM non funziona (inizia a funzionare prima, poi si ferma dopo pochi passi) e anche un semplice backtest non funziona.

Ma Moving Average.mq5 su un conto demo moex USDRUB_TOM funziona bene (e anche il semplice backtest).

Sul conto demoforex il simbolo EURUSD funziona bene (e anche il semplice backtest) MACD Sample.mq5 e Moving Average.mq5

Registrato un video di debug sul simbolo MACD Sample.mq5 EURUSD sul conto demoforex. (anche il quotidiano funziona bene)

File:
capture-mt5-1.zip  5457 kb
 
xfo:

Non ho debuggato completamente e trovato il bug (in modi molto diversi), ma finora ho trovato i seguenti problemi con Optimize=1. Lasciate che vi dica subito che il mio Expert Advisor ha circa 100 parametri di input, e lavora molto con gli array. Inoltre non fa trading ma esegue solo calcoli.

........................

.......................

A proposito, ci saranno mai i puntatori in MQL? :) Perché ho dovuto fare degli array-copie.

Salve, vorrei essere più specifico.

1. Il tuo Expert Advisor ha fatto dei calcoli, ma non ha negoziato. Cosa e come viene visualizzato l'Expert Advisor? Cosa vi aspettate dall'Expert Advisor quando lo eseguite nello strategy tester? Quali dati vi aspettate di ottenere durante i test con l'ottimizzazione? Non abbiamo trovato alcun errore durante il test dell'Expert Advisor allegato. Gli errori che descrivi si riferiscono ad esso?

2. passo dopo passo cosa fai e cosa ti aspetti, allega il codice che usi.

3. puoi allegare i log dei test con e senza ottimizzazione?

4. La versione del tuo terminale, OS?

 

Eduard Vavrin, il file allegato non è legato agli errori descritti. Lasciatemi provare a preparare il codice che porta all'errore e a mandarvelo. Ci vuole solo tempo e finora questo codice contiene troppo dal sorgente dell'Expert Advisor.

Per quanto riguarda il file che ho allegato: diceva che una singola esecuzione dell'EA allegato richiede 156 ms, cioè 1/6 di secondo. Possiamo supporre che su 8 threads otterremmo 48 corse al secondo. In realtà, il multi-runner (c'è il parametro fittizio, Slow Optimization mode) produce solo 4-5 esecuzioni al secondo su 8 thread. La domanda era: perché la velocità sta scendendo? Nella scheda Agents posso vedere che tutti i thread sono in esecuzione e ogni thread spende più di 1 secondo per una corsa. Quello che l'Expert Advisor restituisce rand() è solo un tick per vedere che ha funzionato.