I risultati dell'ottimizzazione differiscono dai singoli test su di essi - pagina 6

 

Vedo che la questione dei test di diffusione è stata sollevata più volte. Recentemente sono arrivato a un sistema che sembra più o meno serio (in termini di trading reale) e quindi richiede un test approfondito. E mi sono preoccupato anche di questo problema. Come risultato ho scritto un semplice script che imposta lo spread richiesto per i test offline.

Il principio è ben noto, nel file symbols.sel Ask viene sovrascritto. Quindi, nel terminale offline copiatelo dalla cartella history alla cartella experts/files, lanciate lo script, poi chiudete il terminale, copiate nuovamente symbols.sel e lanciate nuovamente il terminale.

P.S. Sostituito lo script, una piccola svista è stata, se qualcuno improvvisamente ha avuto il tempo di prendere SetSpread e non SetSpread_1, bisogno di scaricare di nuovo.

File:
 
Lo stesso problema. Ottengo gli stessi risultati durante l'ottimizzazione, ma risultati drasticamente diversi durante le corse singole. Grazie a Mathemat per avermi indicato la giusta direzione.

Matematica:
Fate attenzione agli oggetti durante i test. È meglio non usarli affatto.

Condividerò quello che è successo e come è stato risolto, forse qualcuno lo troverà utile. Ho scritto il mio indicatore personale, usando le linee di tendenza. L'indicatore ha passato il numero di linee di tendenza rotte alla variabile globale del terminale. È andata così:

GlobalVariableSet("GV_name", number);

e nell'Expert Advisor ha preso il valore di

int dc = GlobalVariableGet("GV_name");

Tutto andava bene nel visualizzatore e nei test singoli. Così, ho deciso di risparmiare sulla dichiarazione di una variabile "extra" per ridurre la dimensione del codice. Dopo aver corretto il codice nel modo seguente, tutto ha iniziato a funzionare con risultati identici sia nell'ottimizzatore che nei singoli test.

string GlobVar = "GV_name";  // объявил переменную в индикаторе на глобальном уровне программы

int start(){
  GlobalVariableSet(GlobVar, number);
}
string GlobVar;  // объявил переменную в советнике на глобальном уровне программы
int dc;

int start(){
  dc = GlobalVariableGet(GlobVar);
}

Così, impostando le variabili globali nell'indicatore e nell'EA, tutto ha funzionato correttamente.

 

Buona sera, colleghi.

Ho deciso di rianimare questo argomento, poiché ho incontrato un problema identico.

Il mio Expert Advisor non usa oggetti grafici. Ho impostato uno spread personalizzato che è lo stesso ovunque. Tuttavia, i test singoli sono molto diversi dai risultati dell'ottimizzazione. Inoltre, ho eseguito singoli test su diversi computer e si assomigliano tutti, ma non coincidono con i risultati di ottimizzazione.

Forse qualcuno ha trovato una soluzione?

 
Andrey Kaunov:

Buona sera, colleghi.

Ho deciso di rianimare questo argomento, poiché ho incontrato un problema identico.

Il mio Expert Advisor non usa oggetti grafici. Ho impostato uno spread personalizzato che è lo stesso ovunque. Tuttavia, i test singoli sono molto diversi dai risultati dell'ottimizzazione. Inoltre, ho eseguito singoli test su diversi computer e si assomigliano tutti, ma non coincidono con i risultati di ottimizzazione.

Forse qualcuno ha trovato una soluzione?

E perché dovrebbero coincidere? A meno che non si debba passare attraverso tutti i parametri e selezionare l'opzione migliore. Ma questo è costoso e richiede molte risorse. Ecco perché usiamo gli algoritmi genetici. E sono essenzialmente costruiti in questo modo: campionamento casuale di set di parametri tra quelli che vengono ottimizzati e poi la scelta del migliore e una ricerca più dettagliata lì. Per esempio 6 parametri. Presentare la soluzione migliore è come la massima densità nello spazio a 6 dimensioni. E ci possono essere molti punti di densificazione. Un buon algoritmo dà delle radure volumetriche 6-dimensionali lisce con poche densità e l'ottimizzazione le troverà, e se l'algoritmo dà densità nette, allora i risultati possono essere casuali. cioè l'ottimizzazione troverà densità ma non lo stesso set di parametri (stessi modelli) ogni volta.

 

Valery, invece di rispondere solo per citare, posso...

eugene-last:

Ehm... Credo che molte persone si rifiutino di capire il problema. O allontanarsi deliberatamente.

Cos'è l'ottimizzazione e cos'è un singolo test? Risposta: l'ottimizzazione è diversi test singoli.
Cosa significa? Risposta: significa che teoricamente il passaggio di ottimizzazione è lo stesso e finisce con lo stesso risultato del test singolo.

Bene, in pratica si scopre che non è così. E l'Expert Advisor (non una massima a proposito, vedo che dà fastidio ad alcune persone qui) non fallisce perché il singolo test mostra esattamente lo stesso risultato. Allora perché questo singolo test di ottimizzazione dà un risultato diverso?

 
Andrey Kaunov:

Buona sera, colleghi.

Ho deciso di rianimare questo argomento, poiché ho incontrato un problema identico.

Il mio Expert Advisor non usa oggetti grafici. Ho impostato uno spread personalizzato che è lo stesso ovunque. Tuttavia, i test singoli sono molto diversi dai risultati dell'ottimizzazione. Inoltre, ho eseguito singoli test su diversi computer e si assomigliano tutti, ma non coincidono con i risultati di ottimizzazione.

Forse qualcuno ha trovato una soluzione?

1. Controllare che tutte le variabili siano inizializzate, anche se in passato in MQL4 - le variabili non inizializzate erano uguali a 0, ora non so.

2, se usate array dinamici - dovete controllare il risultato di ArrayResize() - ho avuto un problema con questo, ho fatto EA per 4-5 indicatori, si è scoperto che un indicatore mangiava tutta la memoria, e nel mio EA, ArrayResize() non dava sempre la dimensione richiesta dell'array - funzionava una volta o no. Se non mi sbaglio, l'MQL4 ha circa 3Gb di memoria massima per i programmi MQL, il terminale è a 32 bit.

 
Andrey Kaunov:

Valery, invece di rispondere, mi limiterò a citare...

Non lo so esattamente, non lo so. L'ottimizzazione non è dopo tutto qualche singolo test, ma molti. quindi per il bene della velocità forse i dati di input possono essere diversi. Per arrivare al fondo di questo, abbiamo bisogno di semplici codici di problemi riproducibili. Allora forse gli sviluppatori risponderanno.

 
Igor Makanu:

1. controllare che tutte le variabili siano inizializzate, anche se prima in MQL4 - le variabili non inizializzate erano uguali a 0, ora non so, tra l'altro riguarda anche gli indicatori

2, se usate array dinamici - dovete controllare il risultato di ArrayResize() - ho avuto questo problema, ho fatto EA per 4-5 indicatori, si è scoperto che un indicatore mangiava tutta la memoria, e in EA, non ho sempre ArrayResize() segnato la dimensione richiesta dell'array - ha funzionato una volta o no. Se non mi sbaglio, l'MQL4 ha circa 3Gb di memoria massima per i programmi MQL, il terminale ha 32 bit.

Igor, grazie per il suggerimento. Proverò a cercare qualche soluzione.

Valeriy Yastremskiy:

Non sono sicuro, non lo so. Pertanto, i dati di input possono essere diversi per il bene della velocità. Per arrivare al fondo di questo, abbiamo bisogno di semplici codici di problemi riproducibili. Allora forse gli sviluppatori risponderanno.

Beh, niente dovrebbe essere diverso, altrimenti si perde tutto il senso dell'ottimizzazione. E gli sviluppatori non hanno risposto a nulla per 10 anni...

 
Andrey Kaunov:

Igor, grazie per il suggerimento. Cercherò di scavare in quella direzione.

Beh, niente dovrebbe essere diverso, altrimenti si perde tutto il senso dell'ottimizzazione. E gli sviluppatori non hanno risposto a nulla per 10 anni...

Gli sviluppatori non capiscono le parole e le lamentele. Solo il codice comprensibile che riproduce il problema).

 
Igor Makanu:

1. controllare che tutte le variabili siano inizializzate, anche se prima in MQL4 - le variabili non inizializzate erano uguali a 0, ora non so, tra l'altro riguarda anche gli indicatori

2, se usate array dinamici - dovete controllare il risultato ArrayResize() - ho avuto questo problema, ho fatto EA su 4-5 indicatori, si è scoperto che un indicatore mangiava tutta la memoria, e nel mio EA, ArrayResize() non dava sempre la dimensione richiesta dell'array - funzionava una volta o no. Se non mi sbaglio, in MQL4 la memoria è di circa 3Gb max. per i programmi MQL, il terminale è a 32 bit.

Ci sono zeri in 4 e spazzatura in 5. L'ultima volta tali problemi sembravano essere stati risolti proprio grazie alla ricerca di variabili inizializzate al di fuori di OnInit e cambiate durante l'esecuzione dell'ottimizzazione, cioè durante

al passaggio successivo non hanno finito con il loro valore originale.

Motivazione: