Backtest Momentum funktioniert nicht

 
Es dürfte nicht schwer sein im Backtest den vordefinierten Indikator Momentum zu testen,  leider wurde ich eines besseren belehrt nach ca 10 minuten Ladezeit habe ich den Vorgang abgebrochen.
Bevor die Frage aufkommt es wurden keine historischen Daten geladen und der Zeitraum ist im Stunden Chart auf einen Monat begrenzt gewesen.

Hat jemand eine Idee, warum es nicht funktioniert?
 
Thorsten Wagner:
Es dürfte nicht schwer sein im Backtest den vordefinierten Indikator Momentum zu testen,  leider wurde ich eines besseren belehrt nach ca 10 minuten Ladezeit habe ich den Vorgang abgebrochen.
Bevor die Frage aufkommt es wurden keine historischen Daten geladen und der Zeitraum ist im Stunden Chart auf einen Monat begrenzt gewesen.

Hat jemand eine Idee, warum es nicht funktioniert?

Hallo,

Die Frage. 

  1. Hat der Indikator früher funktioniert?
  2. Wurde Indikator selbst programmiert? (dann bitte den Kode teilen)
  3. Der Indikator kam vom bestimmten Anbieter. (Persönlich anschreiben)
Gruß Igor
 
Im Debugger sieht der Momentum aus dem Examples Ordner auch nicht so aus wie er soll. Oder meinst du den?
 
Igor Widiger #:

Hallo,

Die Frage. 

  1. Hat der Indikator früher funktioniert?
  2. Wurde Indikator selbst programmiert? (dann bitte den Kode teilen)
  3. Der Indikator kam vom bestimmten Anbieter. (Persönlich anschreiben)
Gruß Igor
Hi Igor,
hatte den noch nie im Backtest ausprobiert.
Es ist das vorinstallierte Momentum das jeder haben sollte, also nein ich ihn nicht selbst programmiert oder erworben.

Danke, Gruß 
Thorsten 
 
Tobias Johannes Zimmer #:
Im Debugger sieht der Momentum aus dem Examples Ordner auch nicht so aus wie er soll. Oder meinst du den?
Genau den meine ich, er funktioniert optimal im Realtime Chart auf allen Zeiten aber eben nicht im Backtest.

Gruß Thorsten 
 
Thorsten Wagner #:
Genau den meine ich, er funktioniert optimal im Realtime Chart auf allen Zeiten aber eben nicht im Backtest.

Gruß Thorsten 
Stimmt, ist mir auch aufgefallen. Ich hab aber keine Ahnung woran es genau liegt, es gibt ja zwei verschiedene OnCalculate Funktionen, nennen wir sie die große und die kleine. Und der Example Momentum ist mit der Kleinen. Ich habe ihn auch schonmal umgebaut und dann hatte ich eine Version mit der Großen die ging und eine Version mit der Großen, die nicht ging. Ich wollte es bei Gelegenheit mal genauer dokumentieren. Hatte dann aber etwas anderes zu tun... 
Bin gerade nicht am Computer, stelle es später hier rein.

Ich bin mir nicht sicher ob das ein Bug ist oder ob das passiert weil der Indikator keinen Ausgangswert bekommt (die kleine OnCalculate benötigt price[], aber nicht AppliedPrice, aber vielleicht ist auch genau das der Bug...?) jedenfalls wenn man den Debugger startet, hängt er sich auf und da kommen drei Unterfenster ohne Inhalt. Das passt aber gar nicht zu Momentum, der hat ja nur einen Buffer und das ist gleichzeitig der Plot... 

Aber das kann zusammenhängen, denn der Debugger öffnet ja auch einen visuellen Testerdurchlauf.
 
Thorsten Wagner #:
Hi Igor,
hatte den noch nie im Backtest ausprobiert.
Es ist das vorinstallierte Momentum das jeder haben sollte, also nein ich ihn nicht selbst programmiert oder erworben.

Danke, Gruß 
Thorsten 

Hallo,

habe mir Momentum.mq5 angeschaut und musste feststellen, dass da CopyBuffer() und Handle Funktionen fehlen.

Den muss man komplett umschreiben.

Gruß Igor

 
Igor Widiger #:

Hallo,

habe mir Momentum.mq5 angeschaut und musste feststellen, dass da CopyBuffer() und Handle Funktionen fehlen.

Den muss man komplett umschreiben.

Gruß Igor

Okay, danke für die Info, damit bin ich dann raus kann die Programmiersprache nicht

Gruß Thorsten 
 
Igor Widiger #:

Hallo,

habe mir Momentum.mq5 angeschaut und musste feststellen, dass da CopyBuffer() und Handle Funktionen fehlen.

Den muss man komplett umschreiben.

Gruß Igor

Du brauchst die nicht unbedingt, wenn du eine Formel dafür hast.

Aber es ist wirklich komisch...

Diese geht nicht:

//+------------------------------------------------------------------+
//|                                                     Momentum.mq5 |
//|                           Copyright 2021, Tobias Johannes Zimmer |
//|                                 https://www.mql5.com/pennyhunter |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Tobias Johannes Zimmer"
#property link      "https://www.mql5.com/pennyhunter"
#property version   "1.00"


#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
//--- input parameters
input int InpMomentumPeriod = 14; // Period
input ENUM_APPLIED_PRICE  InpAppliedPrice = PRICE_CLOSE;

//--- indicator buffer
double    ExtMomentumBuffer[];

int       ExtMomentumPeriod;
int    begin; // starting index
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- check for input value
   if(InpMomentumPeriod < 0)
     {
      ExtMomentumPeriod = 14;
      Print("Input parameter InpMomentumPeriod has wrong value. Indicator will use value ", ExtMomentumPeriod);
     }
   else
      ExtMomentumPeriod = InpMomentumPeriod;
//--- buffers
   SetIndexBuffer(0, ExtMomentumBuffer, INDICATOR_DATA);

//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, ExtMomentumPeriod - 1);


   begin = InpMomentumPeriod - 1;    //
  }
//+------------------------------------------------------------------+
//|  Momentum                                                        |
//+------------------------------------------------------------------+
int OnCalculate(
   const int rates_total,     // rates total
   const int prev_calculated, // bars, calculated at previous call
   const datetime &Time[],    // Time
   const double &o[],      // Open
   const double &h[],      // High
   const double &l[],       // Low
   const double &c[],     // Close
   const long &TickVolume[],  // Tick Volume
   const long &Volume[],      // Real Volume
   const int &Spread[]        // Spread
)
  {
   int start_position = (ExtMomentumPeriod - 1) + begin;
   if(rates_total < start_position)
      return(0);

//--- start working, detect position
   int pos = prev_calculated - 1;
   if(pos < start_position)
      pos = begin + ExtMomentumPeriod;
//--- main cycle
   for(int i = pos; i < rates_total && !IsStopped(); i++)
      ExtMomentumBuffer[i] = (Price(i,PRICE_CLOSE,o,h,l,c) / Price(i - ExtMomentumPeriod,PRICE_CLOSE,o,h,l,c)) * 100;
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
//+-------------------------------------------------------------------------------------+
//| Function that gets a certain index of a price buffer depending on the applied price |
//+-------------------------------------------------------------------------------------+
double Price(int idx, ENUM_APPLIED_PRICE applied, const double &o[], const double &h[], const double &l[], const double &c[])
//--- ohlc buffers had to be provided by reference again
  {
   double price = 0.0;
   switch(applied)
     {
      case PRICE_OPEN :
         price = o[idx];
         break;

      case PRICE_HIGH :
         price = h[idx];
         break;

      case PRICE_LOW :
         price = l[idx];
         break;

      case  PRICE_CLOSE:
         price = c[idx];
         break;

      case  PRICE_MEDIAN:
         price = (h[idx] + l[idx]) / 2;
         break;

      case  PRICE_TYPICAL:
         price = (h[idx] + l[idx] + c[idx]) / 3;
         break;

      case  PRICE_WEIGHTED:
         price = (h[idx] + l[idx] + (2 * c[idx])) / 4;
         break;
     }
   return(price);
  }



Diese geht:

//+------------------------------------------------------------------+
//|                                                     Momentum.mq5 |
//|                           Copyright 2021, Tobias Johannes Zimmer |
//|                                 https://www.mql5.com/pennyhunter |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Tobias Johannes Zimmer"
#property link      "https://www.mql5.com/pennyhunter"
#property version   "1.00"


#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
//--- input parameters
input int InpMomentumPeriod = 14; // Period
input ENUM_APPLIED_PRICE  InpAppliedPrice = PRICE_CLOSE;

//--- indicator buffer
double    ExtMomentumBuffer[];

int       ExtMomentumPeriod;
int    begin; // starting index
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- check for input value
   if(InpMomentumPeriod < 0)
     {
      ExtMomentumPeriod = 14;
      Print("Input parameter InpMomentumPeriod has wrong value. Indicator will use value ", ExtMomentumPeriod);
     }
   else
      ExtMomentumPeriod = InpMomentumPeriod;
//--- buffers
   SetIndexBuffer(0, ExtMomentumBuffer, INDICATOR_DATA);

//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, ExtMomentumPeriod - 1);


   begin = InpMomentumPeriod - 1;    //
  }
//+------------------------------------------------------------------+
//|  Momentum                                                        |
//+------------------------------------------------------------------+
int OnCalculate(
   const int rates_total,     // rates total
   const int prev_calculated, // bars, calculated at previous call
   const datetime &Time[],    // Time
   const double &o[],      // Open
   const double &h[],      // High
   const double &l[],       // Low
   const double &c[],     // Close
   const long &TickVolume[],  // Tick Volume
   const long &Volume[],      // Real Volume
   const int &Spread[]        // Spread
)
  {
   int start_position = (ExtMomentumPeriod - 1) + begin;
   if(rates_total < start_position)
      return(0);

//--- start working, detect position
   int pos = prev_calculated - 1;
   if(pos < start_position)
      pos = begin + ExtMomentumPeriod;
//--- main cycle
   for(int i = pos; i < rates_total && !IsStopped(); i++)
      ExtMomentumBuffer[i] = (Price(i,PRICE_CLOSE,o,h,l,c) / Price(i - ExtMomentumPeriod,PRICE_CLOSE,o,h,l,c)) * 100;
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
//+-------------------------------------------------------------------------------------+
//| Function that gets a certain index of a price buffer depending on the applied price |
//+-------------------------------------------------------------------------------------+
double Price(int idx, ENUM_APPLIED_PRICE applied, const double &o[], const double &h[], const double &l[], const double &c[])
//--- ohlc buffers had to be provided by reference again
  {
   double price = 0.0;
   switch(applied)
     {
      case PRICE_OPEN :
         price = o[idx];
         break;

      case PRICE_HIGH :
         price = h[idx];
         break;

      case PRICE_LOW :
         price = l[idx];
         break;

      case  PRICE_CLOSE:
         price = c[idx];
         break;

      case  PRICE_MEDIAN:
         price = (h[idx] + l[idx]) / 2;
         break;

      case  PRICE_TYPICAL:
         price = (h[idx] + l[idx] + c[idx]) / 3;
         break;

      case  PRICE_WEIGHTED:
         price = (h[idx] + l[idx] + (2 * c[idx])) / 4;
         break;
     }
   return(price);
  }


Ich verstehe nicht mal warum, wenn ich sie vergleiche sind sie exakt gleich. Doch die Erste mache das hier:

MomBug

 
Tobias Johannes Zimmer #:

Du brauchst die nicht unbedingt, wenn du eine Formel dafür hast.

Aber es ist wirklich komisch...

Diese geht nicht:



Diese geht:


Ich verstehe nicht mal warum, wenn ich sie vergleiche sind sie exakt gleich. Doch die Erste mache das hier:

Genau, das ist exakt das Problem, super vielen Dank für deine Hilfe.

Gruß Thorsten 

 
Thorsten Wagner #:

Genau, das ist exakt das Problem, super vielen Dank für deine Hilfe.

Gruß Thorsten 

Gerne.
Funktionieren die beide bei dir?
Wie gesagt, ich verstehe nicht, wo bei den beiden von mir überhaupt der  Unterschied sein soll...
Grund der Beschwerde: