Problemi riscontrati durante il back testing e non si riesce a trovare la causa principale! - pagina 5

 
jollydragon:

. Non riesco ancora a vedere la scomparsa dei picchi. Come "reinizializzare"?

Puoi reinizializzare cambiando i timeframe

o

aprire la finestra di input dell'indicatore e cliccare su OK

 

GumRai2015.05.14 21:51#

You can re-initialise by either changing timeframes

or

aprire la finestra di input dell'indicatore e cliccare su OK


Dopo aver provato, capisco che è lo stesso significato che ho detto che la posizione dei picchi cambia. Corretto?

CaroGumRai,

 
WHRoeder:

Per ogni iterazione (tranne la prima) Fish1 è il valore dell'elemento precedente del buffer, ma non lo inizializzate a ExtBuffer1[limit].

Quindi per l'iterazione iniziale (quando limite == barre) imposti ExtBuffer1[0] = 1.1*ExtBuffer1[1] .

Ma per i tick successivi (quando limite == 1) impostate ExtBuffer1[0] = 1.1*0.00001 .

Caro WHRoeder,

Ti ringrazio molto e vedo il problema un po' meglio con la tua direzione.

Tuttavia, potrebbe essere ancora necessario qualche altra domanda per chiarire ulteriormente:

1. Puoi vedere che "double Fish1=0.00001; " è definito all'inizio e fuori da tutte le funzioni.

Quindi dovrebbe essere una variabile globale e capisco che è stata assegnata con l'ultimo ExBuffer1[0] anche se arriva un nuovo tick successivo.

O recupera automaticamente a "0.00001" ogni volta se arriva un nuovo tick?

2. Ora che ogni barra è dipinta in modo diverso con un singolo tick o molti tick successivi, perché posso vedere la ri-verniciatura di .., bar[8], ..., o bar[1], in un grafico M1 live senza alcuna interruzione?

3. Perché le posizioni dei picchi vengono cambiate dopo essere state aggiornate?

4. Perché posso vedere alcuni picchi (circa 959870576) formati molto, molto meno di"EMPTY_VALUE" (2147483647) in grafici M1 live?

5. Se esce una nuova barra, il precedente ExtBuffer1[0] cambierà automaticamente in ExtBuffer1[1]. Corretto?

6. Come evitare qualsiasi potenziale reinizializzazione o riverniciatura?

Forse sono ancora confuso su alcuni punti critici e ho bisogno della vostra grande pazienza per aiutare! È molto apprezzato se puoi aiutare le domande una per una!

 

CaroWHRoeder,GumRai,

Ho aggiornato il mio indicatore come il codice qui sotto secondo la mia comprensione dopo aver letto di nuovo i vostri post.

Dopo averlo usato per il back testing, il risultato è molto più coerente con l'indicatore. Tuttavia, ci sono ancora 2 problemi. Si prega di fare riferimento agli screenshot qui sotto.

1. Il trading avviene dopo 4 segnali dell'indicatore all'inizio dal primo ordine.

2. C'è ancora un cambio di ordine che avviene 4 barre prima del segnale dell'indicatore.

Di seguito è riportato il codice dell'indicatore aggiornato.

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.50"
#property strict
#property  indicator_separate_window
#property  indicator_buffers 2

extern int    period=35;
extern double smooth=0.3;

datetime       lastAlertTime;
double         ExtBuffer0[];
double         ExtBuffer1[];
double         ExtValue[];
double         Value1=0,Buffer0_1=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(3);
   SetIndexBuffer(0,ExtBuffer0); SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,clrWhiteSmoke);
   SetIndexBuffer(1,ExtBuffer1); SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,clrGoldenrod);
   SetIndexBuffer(2,ExtValue);
   IndicatorShortName(" Solar Joy   ^v^  ");
   ArraySetAsSeries(ExtBuffer0,true);
   ArraySetAsSeries(ExtBuffer1,true);
   ArraySetAsSeries(ExtValue,true);

   SetIndexDrawBegin(1,period);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   if(rates_total<=period)    return(0);

   int    i,limit;
   double price,MinL,MaxH;

   if(prev_calculated<rates_total-1) limit=rates_total-period-1;
   else                              limit=1;

   for(i=limit-1; i>=0; i--)
     {
      MaxH = High[iHighest(NULL,0,MODE_HIGH,period,i)];
      MinL = Low[iLowest(NULL,0,MODE_LOW,period,i)];
      price=(High[i]+Low[i])/2;
      if(limit==1)
        {
         Value1=ExtValue[1];
         Buffer0_1=ExtBuffer0[1];
        }
      ExtValue[i]=(1-smooth)*(2*(price-MinL)/(MaxH-MinL)-1.0) + smooth*Value1;
      ExtValue[i]=MathMin(MathMax(ExtValue[i],-0.999),0.999); // Value=Value>0.999?0.999:Value<-0.999?-0.999:Value;
      ExtBuffer0[i]=(1-smooth)*MathLog((1+ExtValue[i])/(1-ExtValue[i]))+smooth*Buffer0_1;
      Value1=ExtValue[i];
      Buffer0_1=ExtBuffer0[i];
      if(ExtBuffer0[i]>0) ExtBuffer1[i]=3;
      else ExtBuffer1[i]=-3;
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

 
jollydragon:

1. Potete vedere che "double Fish1=0.00001; " è definito all'inizio e fuori da tutte le funzioni.

Quindi dovrebbe essere una variabile globale e capisco che è stata assegnata con l'ultimo ExBuffer1[0] anche se arriva un nuovo tick successivo.

Oppure recupera automaticamente a "0.00001" ogni volta se arriva un nuovo tick?

No e no. Quale parte di "ma non lo inizializzi a ExtBuffer1[limit]" non era chiara?
if(prev_calculated<rates_total-1){ limit=rates_total-period-1; Fish1=0.00001;       }
else                             { limit=1;                    Fish1=ExtBuffer0[1]; }
for(i=limit-1; i>=0; i--)
  {
   ExtBuffer1[i]=1.1*Fish1;
   Fish1=ExtBuffer1[i];
   if(Fish1>=EMPTY_VALUE)
      Fish1=1;
  }

Personalmente, penso che gli argomenti rates_total/prev_calculated/OnCalculate siano un abominio dato che i grafici/buffer sono serie temporali, e lo farei nel vecchio modo:
int counted = IndicatorCounted();
limit = Bars - MathMax(counted, period-1); // Lookback period-1
Fish1 = counted == 0 ? 0.00001 : ExtBuffer0[limit];
for(i=limit-1; i>=0; i--)