Indikator berechnet im Strategy Tester andere Werte, als im Live-Chart - Seite 2

 
Dokumentation zu MQL5: Operationen mit Arrays / ArraySetAsSeries
Dokumentation zu MQL5: Operationen mit Arrays / ArraySetAsSeries
  • www.mql5.com
ArraySetAsSeries - Operationen mit Arrays - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 

hab den jetzt mal laufen lassen, ohne die werte zu kontrollieren, weis ja auch nicht was er anzeigen soll, aber er läuft, nix besonderes festzustellen

auf Indizes funkt er halt nicht, auf US30 verweigert er bei mir komplett

 
Danke


amando #:

hab den jetzt mal laufen lassen, ohne die werte zu kontrollieren, weis ja auch nicht was er anzeigen soll, aber er läuft, nix besonderes festzustellen

auf Indizes funkt er halt nicht, auf US30 verweigert er bei mir komplett

hast mal die Werte im Tester mit denen im Live-Chart verglichen oder war es nur ein optischer test?
 
Claudius Marius Walter #:
du meinst aber nicht die Arrays aus der oncalc()? Aber auch wenn ich die arrays für atr1[]/2[] und maSlow[]/Fast[] asseries setze, ist ja mein indikator komplett umgedreht? Was würde mir das bringen?

ArraySetAsSeries() richtet die Ausrichtung eines Arrays so ein wie in MQL4: [0] = letzte und [size-1] = frühste. Ohne ist ein Array durch CopyBuffer() so, dass in [0] des Älteste und in [size-1] das Jüngst ist - ist alles in der Dok (F1) erklärt.

 
Claudius Marius Walter #:
Danke


hast mal die Werte im Tester mit denen im Live-Chart verglichen oder war es nur ein optischer test?

nein hab ich nicht, nachdem ich auch nicht weis was er tun soll und ich sowieso kein freund von oszilatoren bin hab ich nur optisch geschaut

 
Sowie der Indikator aufgebaut ist, benötigt er doch die ArraySetAsSeries() garnicht, denn der for-loop rechnet ja auch so, dass 0 der älteste Wert und size-1 der jüngste wert ist.
 
Claudius Marius Walter #:
Sowie der Indikator aufgebaut ist, benötigt er doch die ArraySetAsSeries() garnicht, denn der for-loop rechnet ja auch so, dass 0 der älteste Wert und size-1 der jüngste wert ist.

Es geht beides, so rum oder anders rum. Viele, die vom MQL4 kommen, bevorzugen halt diese Richtung. Wichtig ist es zu wissen!

Ich mach es so:

#define ßTOT 8
#define ß0   7
#define ß1   6
#define ß2   5
#define ß3   4
#define ß4   3
#define ß5   2
#define ß6   1
#define ß7   0
..
CopyBuffer(..,ßTOT,arr);  // arr[ß0] <= jüngster Wert
 

Hab den Indikator nun so umgeschrieben, dass die arrays as series sind.. Leider spuckt er auch hier dasselbe falsche ergebnis aus:

im korrekten LiveChart:

Im falschen Tester:



hier der code:

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   1

#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  clrDarkGray,clrDeepSkyBlue,clrOrangeRed
#property indicator_label1  "Range Identifier"
#property indicator_width1  2

#property indicator_level1 0.05
#property indicator_level2 -0.05


//--- input parameters
input int MaPeriodFast=3;  // Fast Ma
input int MaPeriodSlow = 24; // Slow Ma
input int AtrPeriod1= 3;   //Atr 1
input int AtrPeriod2 = 24; //Atr 2
input double InpLevels = 0.04;
//--- indicator buffers
double    ma1[];
double    ma2[];
double    maFast[];
double    maSlow[];
double    atr1[];
double    atr2[];
double    range[];
double    clr[];


int      maFastHnd,maSlowHnd,atr1Hnd,atr2Hnd;
//--- global variable
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,range,INDICATOR_DATA);
   SetIndexBuffer(1,clr,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,ma1,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,ma2,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,maFast,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,maSlow,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,atr1,INDICATOR_CALCULATIONS);
   SetIndexBuffer(7,atr2,INDICATOR_CALCULATIONS);
   //SetIndexBuffer(1,ExtTRBuffer,INDICATOR_CALCULATIONS);
//---
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MaPeriodFast+MaPeriodSlow+AtrPeriod1+AtrPeriod2);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Range Indicator 2");
   PlotIndexSetString(0,PLOT_LABEL,"Range Indicator 2");
   
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrWhite); 
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrWhite); 
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,InpLevels);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,-InpLevels);

   //IndicatorSetDouble(INDICATOR_MINIMUM,-5);
   //IndicatorSetDouble(INDICATOR_MAXIMUM,105);

//--- initialization done
   maFastHnd = iDEMA(_Symbol,PERIOD_CURRENT,MaPeriodFast,0,PRICE_CLOSE);
   maSlowHnd = iDEMA(_Symbol,PERIOD_CURRENT,MaPeriodSlow,0,PRICE_CLOSE); 
   atr1Hnd = iATR(_Symbol,PERIOD_CURRENT,AtrPeriod1);
   atr2Hnd = iATR(_Symbol,PERIOD_CURRENT,AtrPeriod2);
  
   if(maFastHnd==INVALID_HANDLE)Print(" Failed to get handle of the iMA indicator");
   if(maSlowHnd==INVALID_HANDLE)Print(" Failed to get handle of the iMA indicator");
   if(atr1Hnd==INVALID_HANDLE)Print(" Failed to get handle of the iMA indicator");
   if(atr2Hnd==INVALID_HANDLE)Print(" Failed to get handle of the iMA indicator");

   ArraySetAsSeries(range,true);
   ArraySetAsSeries(clr,true);
   ArraySetAsSeries(ma1,true);
   ArraySetAsSeries(ma2,true);
   ArraySetAsSeries(maFast,true);
   ArraySetAsSeries(maSlow,true);
   ArraySetAsSeries(atr1,true);
   ArraySetAsSeries(atr2,true);
   
   return(INIT_SUCCEEDED);

  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {

   int counted_bars = prev_calculated;
   int i,limit;
   
   
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   
   limit = MathMax(rates_total - counted_bars - MaPeriodSlow, 1);
   
   
   
   CopyBuffer(maFastHnd, 0, 0, limit+1, maFast);
   CopyBuffer(maSlowHnd, 0, 0, limit+1, maSlow);
   CopyBuffer(atr1Hnd, 0, 0, limit+1, atr1);
   CopyBuffer(atr2Hnd, 0, 0, limit+1, atr2);




//--- the main loop of calculations
   for(i=limit; i>=0; i--)
     {
      if(i == rates_total-3)DebugBreak();  //breakpoint
       
      
      ma1[i] = 100 * (maFast[i] - maSlow[i]) * atr1[i] + 0.00001;
      ma2[i] = ma1[i] * maSlow[i] / atr2[i];
      range[i] = (exp(2*ma2[i])-10) / (exp(2*ma2[i]) +1);
      
     // valc[i]= (val[i]>inpLevels) ? 1 :(val[i]<-inpLevels) ? 2 : 0;

      clr[i] = (range[i] > InpLevels) ?  1 : (range[i] > -InpLevels) ? 0 :2 ;
      //if(range[i] >= UpperLevel)clr[i] = 0;
      //if(range[i] < UpperLevel && range[i] > LowerLevel)clr[i] = 1;
      //if(range[i] <= UpperLevel)clr[i] = 2;
     
     /*Comment("____0_____",
             //"\nma1    ",ma1[i],
             "\nmaFast        ",maFast[i],
           //  "\ntime_maFast ",time_maFast[i],
             //"\nma2    ",ma2[i],
             "\nmaSlow        ",maSlow[i],
           //  "\ntime_maSlow ",time_maSlow[i],
             "\natr1               ",atr1[i],
           //  "\ntime_atr1     ",time_atr1[i],
             //"\nrange  ",range[i],
            
             "\n\n ___ -1 __",
             //"\nma1    ",ma1[i-1],
             "\nmaFast  ",maFast[i-1],
             //"\nma2    ",ma2[i-1],
             "\nmaSlow ",maSlow[i-1],
             "\natr1       ",atr1[i-1]
             //"\nrange  ",range[i-1]);
             );
             */
     }
     
   return(rates_total);
}

 
Claudius Marius Walter #:

Hab den Indikator nun so umgeschrieben, dass die arrays as series sind.. Leider spuckt er auch hier dasselbe falsche ergebnis aus:

im korrekten LiveChart:

Im falschen Tester:



hier der code:

Dann schmeiß den Debugger mit historischen Kursen an und schau genau, was passiert.

Unter Optionen Tab Fehlersuche/Profiling musst/kannst Du vorher alles einstellen, wie Du es brauchst.

 
Das führt mich zu dem verwirrenden Problem, dass er im Debugger einwandfrei läuft...

Ich fühl mich echt aufgeschmissen :D