Ciao a tutti, vorrei chiedere se qualcuno di voi, sa come mai capita che su qualche EA i backtest sono veloci,mentre su altri molto lenti. Da cosa può dipendere e in generale come si risolve a livello di codice dell'ea? Se ci sono nel codice delle funzioni particolari che rallentano il backtest se vengono usate ecc..Grazie per chi risponde
Announcement
Collapse
No announcement yet.
Visual di BackTest lento
Collapse
X
-
Da quel che ne so io, la lentezza dei backtest è dovuta principalmente a quante istruzioni l'EA deve eseguire ad ogni tick.
Quando le istruzioni/controlli eseguiti ad ogni tick diventano tanti o comunque le operazioni/calcoli da effettuare sono molti, allora il backtest sarà più lento.
Se comunque tutte le istruzioni sono essenziali, c'è ben poco che si può fare per velocizzare.
Di solito però si può ottimizzare il tempo di esecuzione di un backtest togliendo tutte le istruzioni che in backtest non servono.
Ad esempio gli oggetti sul grafico.
Altra questione sono gli indicatori.
Ad esempio se un EA prende i segnali da un indicatore che è stato scritto male (non sono così rari), la lentezza del backtest può diventare veramente insostenibile.
L'esempio più classico è quando un indicatore ricalcola i valori di ogni candela presente sul grafico ad ogni tick.
Per cronometrare il codice di un EA/indicatore puoi usare la funzionalità del Profiling presente nella MetaEditor.:01.smile_80_anim_giSkype: cadddami
-
Di solito un indicatore una volta che ha calcolato i suoi valori per tutte le barre, quei valori non cambiano.
L'unico valore che cambia è quello della candela corrente che è ancora in formazione.
Quindi è inutile ricalcolare i valori di tutte le barre ad ogni tick ma basta ricalcolare solo il valore dell'ultima barra (con un risparmio di tempo enorme).Skype: cadddami
Comment
-
Ok, dimmi se mi sbaglio...per evitare il calcolo ripetitivo delle candele passate, faccio con la funzione :
Code:int counter; int counted_bars = IndicatorCounted(); //---- if(counted_bars < 0) return(-1); //---- if(counted_bars > 0) counted_bars--; limit = Bars - counted_bars; //---- for(int i = 0; i <= limit; i++) { }
Comment
-
Sì, non dovrebbero esserci problemi con il tuo codice.
Anche se vedo utilizzi la funzione IndicatorCounted().
Se sei nella OnCalculate() puoi usare il parametro prev_calculated.
Di solito io faccio così:
Code:int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int limit=rates_total-prev_calculated; for(int i=limit;i>=0;i--) { //Codice indicatore... } return(rates_total); }
Ovviamente il mio è un modo come un altro, anche se solitamente è il modo più usato.
Se ad una determinata condizione vuoi ricalcolare anche qualche barra passata, allora devi aumentare il valore della variabile limit.Skype: cadddami
Comment
Comment