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

 
Hallo zusammen,

Habe hier nen Indikator, welcher im live-Chart eine korrekte berechnung ausführt, im Strategy Tester allerdings kompletter Unfug berechnet und anzeigt. Bin tatsächlich auch etwas überfordert, wo ich mit der Fehlersuche beginnen soll, da er augenscheinlich alles korrekt berechnet, laut Live-Chart.





Noch was:
Wenn ich den Indikator im Mode starte, dann berechnet er wieder tadellos alles richtig. Entweder ist mir da ein super banaler leichtsinnsfehler in dem aufrufen des Indikators passiert und es ist einfach noch zu früh am morgen oder es stimmt was anderes nicht..
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Indikatorkonstanten / Typen der Indikatoren
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Indikatorkonstanten / Typen der Indikatoren
  • www.mql5.com
Typen der Indikatoren - Indikatorkonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Claudius Marius Walter:
Hallo zusammen,

Habe hier nen Indikator, welcher im live-Chart eine korrekte berechnung ausführt, im Strategy Tester allerdings kompletter Unfug berechnet und anzeigt. Bin tatsächlich auch etwas überfordert, wo ich mit der Fehlersuche beginnen soll, da er augenscheinlich alles korrekt berechnet, laut Live-Chart.





Noch was:
Wenn ich den Indikator im Mode starte, dann berechnet er wieder tadellos alles richtig. Entweder ist mir da ein super banaler leichtsinnsfehler in dem aufrufen des Indikators passiert und es ist einfach noch zu früh am morgen oder es stimmt was anderes nicht..
Es kann sein, dass er im Strategietester keine oder zu wenig hist. Werte hat.
 
ist nicht der Fall, sowohl im strategy tester, als auch im indikator mode, wird mit der selben zeitspanne berechnet...
 
Claudius Marius Walter #:
ist nicht der Fall, sowohl im strategy tester, als auch im indikator mode, wird mit der selben zeitspanne berechnet...

Meine glaskugel ist leider gerade beim service

 
amando #:

Meine glaskugel ist leider gerade beim service

was genau soll ich posten?

Der code muss ja irgendwo seine richtigkeit haben, wenn er im live-chart und im indicator mode alles richtig anzeigt, nur im EA nicht. Habe gerade beispielhaft einen weiteren indikator im ea aufgerufen, um zu prüfen, ob ich auch kein schmutz programmiert habe. Funktioniert tadellos..
 
//--- 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                         |
//+------------------------------------------------------------------+
void 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");
   PlotIndexSetString(0,PLOT_LABEL,"Range Indicator");
   
   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 = iMA(_Symbol,PERIOD_CURRENT,MaPeriodFast,0,MODE_EMA,PRICE_CLOSE);
   maSlowHnd = iMA(_Symbol,PERIOD_CURRENT,MaPeriodSlow,0,MODE_EMA,PRICE_CLOSE); 
   atr1Hnd = iATR(_Symbol,PERIOD_CURRENT,AtrPeriod1);
   atr2Hnd = iATR(_Symbol,PERIOD_CURRENT,AtrPeriod2);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
  if(rates_total<MaPeriodFast+MaPeriodSlow+AtrPeriod1+AtrPeriod2)
      return(0);
      
//--- not all data may be calculated

   int calculated=BarsCalculated(maFastHnd);
   if(calculated<rates_total)
     {
      Print("Not all data of maFastHnd is calculated (",calculated," bars). Error ",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(maSlowHnd);
   if(calculated<rates_total)
     {
      Print("Not all data of maSlowHnd is calculated (",calculated," bars). Error ",GetLastError());
      return(0);
     }   
   calculated=BarsCalculated(atr1Hnd);
   if(calculated<rates_total)
     {
      Print("Not all data of atr1Hnd is calculated (",calculated," bars). Error ",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(atr2Hnd);
   if(calculated<rates_total)
     {
      Print("Not all data of atr2Hnd is calculated (",calculated," bars). Error ",GetLastError());
      return(0);
     }
     
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0)
      to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0)
         to_copy++;
     }
//--- get Fast EMA buffer
   if(IsStopped()) // checking for stop flag
      return(0);
   if(CopyBuffer(maFastHnd,0,0,to_copy,maFast)<=0)
     {
      Print("Getting ma1 is failed! Error ",GetLastError());
      return(0);
     }
//--- get SlowSMA buffer
   if(IsStopped()) // checking for stop flag
      return(0);
   if(CopyBuffer(maSlowHnd,0,0,to_copy,maSlow)<=0)
     {
      Print("Getting ma2 is failed! Error ",GetLastError());
      return(0);
     }   
   if(IsStopped()) // checking for stop flag
      return(0);
   if(CopyBuffer(atr1Hnd,0,0,to_copy,atr1)<=0)
     {
      Print("Getting ma2 is failed! Error ",GetLastError());
      return(0);
     }   
   if(IsStopped()) // checking for stop flag
      return(0);
   if(CopyBuffer(atr2Hnd,0,0,to_copy,atr2)<=0)
     {
      Print("Getting ma2 is failed! Error ",GetLastError());
      return(0);
     }   
   
   
    
//--- start working
   int i,start=prev_calculated-1;
   if(start<MaPeriodFast+MaPeriodSlow+AtrPeriod1+AtrPeriod2-1)
     {
      start=MaPeriodFast+MaPeriodSlow+AtrPeriod1+AtrPeriod2-1;
      for(i=0; i<start; i++)
         {
          ma1[i]=0.0;
          ma2[i]=0.0;
          range[i]=0.0;
         }    
     }
 
      
//--- the main loop of calculations
   for(i=start; i < rates_total && !IsStopped(); i++)
     {
      if(i == rates_total-3)DebugBreak();  //breakpoint
       
      if(i <= MaPeriodFast+MaPeriodSlow+AtrPeriod1+AtrPeriod2)continue; // wenn nicht genug kerzen zur Berechnung zur Verfügung stehen
      
      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;
     
     }
   return(rates_total);
}

  
  
  
  
  
  
  
  
         /*
       */
      
  
 
Claudius Marius Walter #:
ist nicht der Fall, sowohl im strategy tester, als auch im indikator mode, wird mit der selben zeitspanne berechnet...
Dann lass Dir wichtige Werte im Comment() anzeigen oder ausdrucken mit Print.
 

bin dem Fehler etwas näher gerückt

Vergleicht man die relevanten Werte (maFast, maSlow und atr1) aus dem korrekten live Chart im linken Comment() mit den Werten aus dem rechten (Tester Chart),



fällt auf, dass für maFast und maSlow im Tester jeweils der selbe Wert ermittelt wird (1.08366..). Dies kann unmöglich sein, da die beiden Ma´s mit verschiedenen Periodenlängen belegt sind. Demzufolge wird das maFast[] falsch befüllt, aber ich kann aus dem oberen programmcode nicht herauslesen, wieso das so ist...
Desweiteren stimmt atr1 auch nicht mit dem linken Comment überein. Absolut rätselhaft


Das Handle scheint korrekt:

 maFastHnd = iMA(_Symbol,PERIOD_CURRENT,MaPeriodFast,0,MODE_EMA,PRICE_CLOSE);
 maSlowHnd = iMA(_Symbol,PERIOD_CURRENT,MaPeriodSlow,0,MODE_EMA,PRICE_CLOSE); 

und die CopyBuffer() scheint auch korrekt:

   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0)
      to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0)
         to_copy++;
     }
//--- get Fast EMA buffer
   if(IsStopped()) // checking for stop flag
      return(0);
   if(CopyBuffer(maFastHnd,0,0,to_copy,maFast)<=0)
     {
      Print("Getting ma1 is failed! Error ",GetLastError());
      return(0);
     }
//--- get SlowSMA buffer
   if(IsStopped()) // checking for stop flag
      return(0);
   if(CopyBuffer(maSlowHnd,0,0,to_copy,maSlow)<=0)
     {
      Print("Getting ma2 is failed! Error ",GetLastError());
      return(0);
     }   
 
Du musst  die ArraySetAsSeries() setzten, sonst kriegst nur mist
 
amando #:
Du musst  die ArraySetAsSeries() setzten, sonst kriegst nur mist
Oder überprüfe mit CopyTime() um zu wissen welcher Preis im Array entspricht welcher Zeit.
 
amando #:
Du musst  die ArraySetAsSeries() setzten, sonst kriegst nur mist
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?