Announcement

Collapse
No announcement yet.

Visual di BackTest lento

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Visual di BackTest lento

    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

    #2
    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_gi
    Skype: cadddami

    Comment


      #3
      Grazie mille, per quanto riguarda il fatto che l'indicatore ricalcola i valori ad ogni tick, cosa intendi? Con la funzione di OnCalculate() il calcolo avviene?

      Comment


        #4
        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


          #5
          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++)
                {
                }
          dove la funzione IndicatorCounted() mi restituisce il numero di barre che non sono cambiate ( quelle vecchie), giusto? Però se dovessi cmq ricalcolare anche le candele vecchie ogni nuova barra perchè la barra nuova influenza quelle vecchie, come mi consigli di farlo? Avevo pensato di fare il calcolo delle barre passate con la funzione OnTimer(),mentre l'ultima con la funzione normale. Grazie mille ancora per le info

          Comment


            #6
            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);
              }
            Se ci fai caso io parto dalla candela più vecchia alla più nuova (l'opposto di te).
            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

            Working...
            X