Die Probleme wurden bei den Backtests festgestellt und die Ursache kann nicht gefunden werden! - Seite 5

 
jollydragon:

. Ich kann das Verschwinden der Spitzen immer noch nicht sehen. Wie kann man es "neu initialisieren"?

Sie können eine Neuinitialisierung vornehmen, indem Sie entweder den Zeitrahmen ändern

oder

das Eingabefenster des Indikators öffnen und auf OK klicken

 

GumRai2015.05.14 21:51#

You can re-initialise by either changing timeframes

or

öffnen Sie das Eingabefenster für den Indikator und klicken Sie auf OK


Nachdem ich es ausprobiert habe, verstehe ich, dass es dasselbe bedeutet, wie ich sagte, dass sich die Position der Spitzen ändert. Korrekt?

LieberGumRai,

 
WHRoeder:

Bei jeder Iteration (außer der ersten) ist Fish1 der Wert des vorherigen Pufferelements, aber Sie initialisieren ihn nicht auf ExtBuffer1[limit].

Für die erste Iteration (wenn limit == bars) setzt man ExtBuffer1[0] = 1.1*ExtBuffer1[1] .

Aber für die nachfolgenden Ticks (wenn limit == 1) setzen Sie ExtBuffer1[0] = 1.1*0.00001 .

Lieber WHRoeder,

Vielen Dank, und ich sehe das Problem ein wenig besser mit Ihrer Anleitung.

Allerdings brauche ich noch ein paar Fragen, um das Problem weiter zu klären:

1. Sie können sehen, dass "double Fish1=0.00001; " am Anfang und außerhalb aller Funktionen definiert ist.

Es sollte also eine globale Variable sein und ich verstehe, dass sie mit dem letzten ExBuffer1[0] zugewiesen wurde, auch wenn ein neuer folgender Tick kommt.

Oder wird sie jedes Mal automatisch auf "0.00001" zurückgesetzt, wenn ein neuer Tick kommt?

2. Da nun jeder Balken mit einem oder mehreren aufeinanderfolgenden Ticks anders gezeichnet wird, warum kann ich in einem Live-M1-Chart ohne Unterbrechung die Neuzeichnung von .., bar[8], ..., oder bar[1] sehen?

3. Warum werden die Positionen der Spitzenwerte nach der Auffrischung geändert?

4. Warum kann ich sehen, dass einige Peaks (ca. 959870576) viel, viel weniger gebildet werden als"EMPTY_VALUE" (2147483647) in Live-M1-Charts?

5. Wenn ein neuer Balken erscheint, wird der vorherige ExtBuffer1[0] automatisch in ExtBuffer1[1] geändert. Korrekt?

6. Wie kann man eine mögliche Neuinitialisierung oder ein erneutes Zeichnen verhindern?

Vielleicht bin ich in einigen kritischen Punkten immer noch verwirrt und brauche Ihre große Geduld, um zu helfen! Ich wäre Ihnen sehr dankbar, wenn Sie mir eine Frage nach der anderen beantworten könnten!

 

LieberWHRoeder,GumRai,

ich habe meinen Indikator mit dem untenstehenden Code aktualisiert, nachdem ich Ihre Beiträge noch einmal gelesen habe.

Nach der Verwendung für Backtesting, ist das Ergebnis viel mehr im Einklang mit dem Indikator. Allerdings gibt es immer noch 2 Probleme. Bitte sehen Sie sich die Screenshots unten an.

1. Der Handel findet nach 4 Indikatorsignalen zu Beginn der ersten Order statt.

2. Es gibt immer noch eine Orderänderung, die 4 Bars vor dem Indikatorsignal stattfindet.

Nachfolgend ist der Indikatorcode aktualisiert.

#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. Sie können sehen, dass "double Fish1=0.00001; " am Anfang und außerhalb aller Funktionen definiert ist.

Es sollte sich also um eine globale Variable handeln, und ich verstehe, dass sie mit dem letzten ExBuffer1[0] zugewiesen wurde, auch wenn ein neuer, nachfolgender Tick kommt.

Oder wird sie jedes Mal automatisch auf "0.00001" zurückgesetzt, wenn ein neuer Tick kommt?

Nein und nein. Welcher Teil von " but you don't initialize it to ExtBuffer1[limit]" war unklar?
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;
  }

Ich persönlich denke, dass die Argumente rates_total/prev_calculated/OnCalculate eine Abscheulichkeit sind, da Diagramme/Puffer Zeitreihen sind, und würde es auf die alte Weise tun:
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--)