Announcement

Collapse
No announcement yet.

Funzione r-Squared da inserire in un Expert Advisor

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

    Funzione r-Squared da inserire in un Expert Advisor

    Qualcuno ha disponibile una funzione da inserire in un EA e che restituisce il valore di r-Squared ( in modalità multi timeframe ).
    Attualmente richiamo un indicatore con la funzione i-custom ma rallenta i backtest in maniera esagerata.

    Grazie, Andrea

    #2
    Il coefficiente di determinazione R2 è il coefficiente di Correlazione al quadrato dei risultati profit/loss di un backtest : si può calcolare scrivendo la formula dentro la funzione OnTester() come spiegavo qui

    Ci vuole un po' a costruirla, va calcolata seguendo la formula riportata su Wikipedia e poi elevandola al quadrato

    il coefficiente di correlazione di Pearson-Bravais è calcolato come rapporto tra la covarianza delle due variabili ed il prodotto delle loro deviazioni standard






    E' fondamentale che si individuino correttamente le due variabili da correlare, quindi la sequenza di valori di X ed i corrispondenti valori di Y

    Il coefficiente di correlazione per i risultati di un backtest si calcola tra le due variabili

    X = [sequenza del numero dei trade] = 1, 2, 3, 4, 5, ..., numUltimoTrade

    e

    Y = [sequenza di valori della equity line] = i valori della equityline ogni volta che un trade del backtest viene chiuso


    Ad esempio se abbiamo un backtest formato dai 5 trade in tabella, il coefficiente di correlazione si calcola tra le due variabili
    X = numeroTrade (1,2,3,4,5)
    ed
    Y = equityLine (12,4,-11,24,29)
    .
    numeroTrade profit/loss equityLine
    1 12 12
    2 -8 4
    3 -15 -11
    4 35 24
    5 5 29
    .

    Per interpretare il risultato, è utile la tabellina in fondo a questa pagina di Wiki
    La vita non è un giro di prova, cogli l’attimo..
    Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

    Comment


      #3
      .... questa è la funzione che cerchi
      PHP Code:
      double RSquared(int perint shift)
      {
         
      int i;
         
      double xydiv;
         
      double Ex=0.0Ey=0.0Exy=0.0Ex2=0.0Ey2=0.0;
         
      double Ex22Ey22;
         
      double r;
         for (
      i=1i<=peri++) {
            
      i;               // x axis value
            
      Close[shift+i];  // y axis value
            
      Ex  += x;
            
      Ey  += y;
            
      Exy += x*y;
            
      Ex2 += MathPow(x,2);
            
      Ey2 += MathPow(y,2);
         }
         
      Ex22=MathPow(Ex,2);
         
      Ey22=MathPow(Ey,2);
         
      //slope = (per*Exy-Ex*Ey) / (per*Ex2-Ex22);  // slope of regression line
         //b = (Ey-slope*Ex)/per;
         
      div MathSqrt((per*Ex2-Ex22)*(per*Ey2-Ey22));
         if (
      div==0) return(0);
         
      = (per*Exy-Ex*Ey) / div;
         return(
      MathPow(r,2));

      "int per" è il periodo (es 10 barre)
      "int shift" è la posizione della candela dalla quale calcolarla (es 0 è l'ultima candela)
      .... dove c'è l'array del close (Close[shift+i]) puoi sostituirlo con "iClose" dove puoi inserire il TF desiderato...
      ciao

      Comment


        #4
        Grazie Umberto e grazie a ilgrigio ( ma il nome deriva dal famoso spettacolo/canzone di Giorgio Gaber ? )

        nonostate le mie limitate capacità matematiche e di programmazione in parte sono riuscito a implementare la funzione suggerita da ilgrigio :


        PHP Code:
        double RSquared1(int perint shift,int tf)
        {
           
        int i;
           
        double xydiv;
           
        double Ex=0.0Ey=0.0Exy=0.0Ex2=0.0Ey2=0.0;
           
        double Ex22Ey22;
           
        double r;
           for (
        i=0i<=peri++) {
              
        i;               // x axis value
              
        =iClose(NULL,tf,shift+i);
              
        Ex  += x;
              
        Ey  += y;
              
        Exy += x*y;
              
        Ex2 += MathPow(x,2);
              
        Ey2 += MathPow(y,2);
           }
           
        Ex22=MathPow(Ex,2);
           
        Ey22=MathPow(Ey,2);
           
        //slope = (per*Exy-Ex*Ey) / (per*Ex2-Ex22);  // slope of regression line
           //b = (Ey-slope*Ex)/per;
           
        div MathSqrt((per*Ex2-Ex22)*(per*Ey2-Ey22));
           if (
        div==0) return(0);
           
        = (per*Exy-Ex*Ey) / div;
           return(
        MathPow(r,2));

        la funzione va abbastanza bene solo che non riesco ad ottenere il valore relativo alla barra 0 del TF superiore :

        se estraggo questo valore relativo alla barra 0 del TF superiore

        double RSquared1_0=RSquared1(RsqPeriod, 0,240)*100;

        ottengo invece il valore relativo alla barra 1 del TF superiore dell'indicatore :

        double r_Squared_2_H4=iCustom(NULL,240,"r-squared mtf nmc","H4",RsqPeriod,RsqPrice,RsqAverage,RsqAverage Mode,0,1);

        quindi come devo fare x ottenere la funzione corretta ed ottenere anche il valore r-squared relativo alla barra 0 ( che chiaramente essendo ancora in formazione varierà tick dopo tick )?

        Grazie, Andrea


        Comment


          #5
          ... Andrea bravo.... la funzione che hai creato è perfetta...
          ricordati che se usi 2 TF diversi es 60 per l'orario e 240 per H4 avrai che sull'orario registrerai 4 valori diversi per chiusura su H4.... cioè ci vorranno 4 candele sull'orario per una in H4.... spero tu abbia capito....

          Comment


            #6
            ....non molto.... il problema si pone anche se lo uso su un solo TF ( grafico su H1 e formula settata su H1 ) ....mettendo shift 0 ottengo invece il valore relativo alla barra 1 chiusa e non quello alla 0 ancora in corso.

            Comment


              #7
              ciao Andrea....
              nel codice che hai postato hai messo giustamente nel ciclo for: "i=0" e NON "i=1" poi ... "i<per" e NON "i<=per"..... così ad ogni tick lo ricalcola partendo dalla 0.....
              .... poi se utilizzi 2 TF diversi devi sincronizzare il segnale sul TF che ti interessa.... ma il sincronismo lo trovi solo con l'apertura della barra del TF superiore.... quindi se utilizzi ad es TF H1 e H4 devi sincronizzare il segnale all'apertura della H4....
              spero ti sia stato d'aiuto....

              Comment

              Working...
              X