Anzeige von IndexBuffer eines Custom Indicators im Strategietester

 

Hallo zusammen,


ich habe einen einfachen Indikator mit 6 Indikator Buffern erstellt.

//--- indicator buffers mapping

   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ABuffer,INDICATOR_DATA);
   SetIndexBuffer(3,BBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,CBuffer,INDICATOR_DATA);
   SetIndexBuffer(5,ABCDTradeInfo_SL,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ABCDTradeInfo_TP,INDICATOR_CALCULATIONS);

Wenn ich diesen Indikator im Strategietester ausführe (mit historischen Daten) werden die Indikator Buffer angezeigt (Pic1. JPG --> gelbe Kreise mit 1,2,3 und graue Rauten).

Wenn ich nun den Indikator in einen EA einbaue:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   hCI=iCustom(NULL,0,"ind_ABCD_t");

werden die Index Buffer nicht mehr im Chart angezeigt (Pic2.JPG). Woran kann das liegen? Der Indikator arbeitet aber ansonsten korrekt.

Wird der EA einem Trading Chart hinzugefügt, werden auch dort die Index Buffer korrekt angezeigt. Nur Im Strategietester erscheinen sie nicht.

(Die Linen, die in den Charts zu sehen sind, werden nicht über die Index Buffer erzeugt, sondern über separate Objekte eingefügt.)


Viele Grüße,

Thomas


Wie teste ich einen Handelsroboter vor dem Kauf
Wie teste ich einen Handelsroboter vor dem Kauf
  • www.mql5.com
Der Kauf eines Handelsroboters am MQL5 Markt hat bestimmte Vorzüge gegenüber ähnlichen Möglichkeiten - ein automatisiertes System kann direkt im MetaTrader5-Terminal getestet werden. Vor dem Kauf kann und soll ein Expert Advisor sorgfältig in allen ungünstigen Modi im eingebauten Strategietester ausgeführt werden, um das System komplett zu...
Dateien:
Pic1.JPG  46 kb
Pic2.JPG  46 kb
 
MT5-softcase:

Hallo zusammen,

ich habe einen einfachen Indikator mit 6 Indikator Buffern erstellt.

Wenn ich diesen Indikator im Strategietester ausführe (mit historischen Daten) werden die Indikator Buffer angezeigt (Pic1. JPG --> gelbe Kreise mit 1,2,3 und graue Rauten).

Wenn ich nun den Indikator in einen EA einbaue:

werden die Index Buffer nicht mehr im Chart angezeigt (Pic2.JPG). Woran kann das liegen? Der Indikator arbeitet aber ansonsten korrekt.

Wird der EA einem Trading Chart hinzugefügt, werden auch dort die Index Buffer korrekt angezeigt. Nur Im Strategietester erscheinen sie nicht.

(Die Linen, die in den Charts zu sehen sind, werden nicht über die Index Buffer erzeugt, sondern über separate Objekte eingefügt.)

Viele Grüße,

Thomas

Separate Objekte sind für einen EA nicht sinnvoll.

Der EA sollte allerdings die buffer auslesen können!

Die dynamische initialisierung der buffer habe ich hier bereits mehrmals gepostet.

Und wenn du mehr code hier postest kann dir besser geholfen werden.

 

Schau Dir mal dieses Beispiel an: https://www.mql5.com/en/articles/91

Der EA verwendet einen Indikator mit mehreren Puffern. Übrigens Du verwendest 7 Puffer: 0..6 = 7
An Example of a Trading System Based on a Heiken-Ashi Indicator
An Example of a Trading System Based on a Heiken-Ashi Indicator
  • www.mql5.com
With the appearance of candlestick chart in the U.S., more than two decades ago, there was a revolution in the understanding of how the forces of bulls and bears work on the Western markets. Candlesticks became a popular trading instrument, and traders began working with them in order to ease the reading of the charts. But the interpretation of...
 
Otto Pauser:

Separate Objekte sind für einen EA nicht sinnvoll.

Der EA sollte allerdings die buffer auslesen können!

Die dynamische initialisierung der buffer habe ich hier bereits mehrmals gepostet.

Und wenn du mehr code hier postest kann dir besser geholfen werden.

Hallo Otto,

danke für die Hinweise:

  1. Separate Objekte sind für einen EA nicht sinnvoll. --> was ist der Nachteil von Separaten Objekten? (Diese werden bei mir im Indikator erzeugt)
  2. Den EA kann ich auslesen, dass ist nicht das Problem. Die Buffer Inhalte werden im Strategietester nur nicht als grafische Elemente im Chart angezeigt


Hier noch mehr Code aus dem Indikator:

//--- input parameters
input int      InpToleranz;

#property indicator_buffers 7


//---- indicator buffers
double ABuffer[];
double BBuffer[];
double CBuffer[];
double ExtUpperBuffer[];
double ExtLowerBuffer[];
double ABCDLineBuffer[];
double ABCDTradeInfo_SL[];
double ABCDTradeInfo_TP[];


//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
int    ABCDArrowShift=-20;

//--- Globale Variablen
int      SpreadFaktor   = 2;           // Faktor, um der der Abstand zwischen A und B größer sein muss als der Spread, damit sinvoll gehandelt werden kann.
double   MaxAC          = 0.5;         // maximales Verhältinis des Rückgangs in der Konsolidierungsphase - Verhältnis der Strecken (B-C) zu (B-A)
//bool     runOK          = false;
int      tempA          = 0;
int      tempB          = 0;
int      tempC          = 0;
int      tempD          = 0;
int      countC         = 0;           // Anzahl der gefundenen C-Punkte --> auszuführende Trades
double   SLDistanz      = 0.1;         // Abstand des zu setzenden StopLos (C - Prozentwert der Strecke BC --> C-((B-C)*SLDistanz) = StopLoss )
int      lastBar        = 0;

...

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {


//--- indicator buffers mapping

   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ABuffer,INDICATOR_DATA);
   SetIndexBuffer(3,BBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,CBuffer,INDICATOR_DATA);
   SetIndexBuffer(5,ABCDTradeInfo_SL,INDICATOR_CALCULATIONS); 
   SetIndexBuffer(6,ABCDTradeInfo_TP,INDICATOR_CALCULATIONS);


   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

//---- sets first bar from what index will be drawn
// Symbolen der Schrift Wingdings, die mit dem Objekt OBJ_ARROW verwendet werden: https://www.mql5.com/de/docs/constants/objectconstants/wingdings
   PlotIndexSetInteger(0,PLOT_ARROW,119);
   PlotIndexSetInteger(1,PLOT_ARROW,119);
   PlotIndexSetInteger(2,PLOT_ARROW,140);
   PlotIndexSetInteger(3,PLOT_ARROW,141);
   PlotIndexSetInteger(4,PLOT_ARROW,142);-


//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
   PlotIndexSetInteger(2,PLOT_ARROW_SHIFT,-ABCDArrowShift);
   PlotIndexSetInteger(3,PLOT_ARROW_SHIFT,ABCDArrowShift);
   PlotIndexSetInteger(4,PLOT_ARROW_SHIFT,-ABCDArrowShift);


//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,EMPTY_VALUE);


//---- sets drawing Color
   PlotIndexSetInteger(2,PLOT_LINE_COLOR,clrOrange);
   PlotIndexSetInteger(3,PLOT_LINE_COLOR,clrOrange);
   PlotIndexSetInteger(4,PLOT_LINE_COLOR,clrOrange);

Print ("--- Indikator ----------------------------------");
Print ("Symbol: " + _Symbol);
Print ("Period: " + _Period);

//EventSetTimer(10);

//---- sets first bar from what index will be drawn

//---- initialization done
   return(INIT_SUCCEEDED);
  }



//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {


   int i;
   int limit;
   int bars=Bars(_Symbol,_Period);



//--- sind genügend Bars vorhanden?
   if(rates_total<10)
      return(0);

   if (bars >lastBar)
     {
      lastBar = bars;
      if(prev_calculated<7)
        {
         limit=3;
         //--- clean up arrays
         ArrayInitialize(ABuffer,EMPTY_VALUE);
         ArrayInitialize(BBuffer,EMPTY_VALUE);
         ArrayInitialize(CBuffer,EMPTY_VALUE);
         ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
         ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
         ArrayInitialize(ABCDLineBuffer,EMPTY_VALUE);
        }
      else
         limit=rates_total-5;
...


Hier noch die OnInit aus dem EA:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   hCI=iCustom(NULL,0,"ThG_Test\\ThG-ind_ABCD_t\\ThG-ind_ABCD_t");
   int err = ChartIndicatorAdd(0,0,hCI);                                          //Show Custom Indicator
//EventSetTimer(20);
   SendMsg("Init EA: ", MQL5InfoString(MQL5_PROGRAM_NAME));             //Sende Message mit Name des EA, wenn EA gestartet wird.




//---
   return(INIT_SUCCEEDED);
  }


Kann es eftl. auch an den Settings des Strategietesters liegen?

Wie teste ich einen Handelsroboter vor dem Kauf
Wie teste ich einen Handelsroboter vor dem Kauf
  • www.mql5.com
Der Kauf eines Handelsroboters am MQL5 Markt hat bestimmte Vorzüge gegenüber ähnlichen Möglichkeiten - ein automatisiertes System kann direkt im MetaTrader5-Terminal getestet werden. Vor dem Kauf kann und soll ein Expert Advisor sorgfältig in allen ungünstigen Modi im eingebauten Strategietester ausgeführt werden, um das System komplett zu...
 
Carl Schreiber:

Schau Dir mal dieses Beispiel an: https://www.mql5.com/en/articles/91

Der EA verwendet einen Indikator mit mehreren Puffern. Übrigens Du verwendest 7 Puffer: 0..6 = 7

Klar 7 ;-)

Danke für den Tip. Ich schaue mir das Beispiel an...

 
Versuch mal diese Funktion: https://www.mql5.com/de/docs/common/testerhideindicators
Dokumentation zu MQL5: Allgemeine Funktionen / TesterHideIndicators
Dokumentation zu MQL5: Allgemeine Funktionen / TesterHideIndicators
  • www.mql5.com
Aktiviert den Modus zum Anzeigen/Ausblenden von Indikatoren, die in einem Expert Advisor verwendet werden. Die Funktion dient zur Verwaltung der Sichtbarkeit der verwendeten Indikatoren nur beim Testen. [in]  Das Flag zum Ausblenden der Indikatoren beim Testen. Geben Sie true an, wenn man die erstellten Indikatoren ausblenden muss, andernfalls...
 
Carl Schreiber:
Versuch mal diese Funktion: https://www.mql5.com/de/docs/common/testerhideindicators
TesterHideIndicators(false) hat leider auch nichts gebracht.
 
MT5-softcase :

Hallo zusammen,


ich habe einen einfachen Indikator mit 6 Indikator Buffern erstellt.

Wenn ich diesen Indikator im Strategietester ausführe (mit historischen Daten) werden die Indikator Buffer angezeigt (Pic1. JPG --> gelbe Kreise mit 1,2,3 und graue Rauten).

Wenn ich nun den Indikator in einen EA einbaue:

werden die Index Buffer nicht mehr im Chart angezeigt (Pic2.JPG). Woran kann das liegen? Der Indikator arbeitet aber ansonsten korrekt.

Wird der EA einem Trading Chart hinzugefügt, werden auch dort die Index Buffer korrekt angezeigt. Nur Im Strategietester erscheinen sie nicht.

(Die Linen, die in den Charts zu sehen sind, werden nicht über die Index Buffer erzeugt, sondern über separate Objekte eingefügt.)


Viele Grüße,

Thomas


Das ist das normale Verhalten. iCustom () ruft einen Indikator im Hintergrund auf und wird nicht visuell auf das Diagramm angewendet. Sie können entweder ChartIndicatorAdd () oder eine Vorlage verwenden (siehe Dokumentation).
 
Alain Verleyen:
Das ist das normale Verhalten. iCustom () ruft einen Indikator im Hintergrund auf und wird nicht visuell auf das Diagramm angewendet. Sie können entweder ChartIndicatorAdd () oder eine Vorlage verwenden (siehe Dokumentation).

Ganz so stimmt das nicht, es stimmt im Terminal, aber nicht im Backtest. Im Backtest wird der Indikator sehr wohl im Strategietester und im Chart angezeigt

 
Alain Verleyen:
Das ist das normale Verhalten. iCustom () ruft einen Indikator im Hintergrund auf und wird nicht visuell auf das Diagramm angewendet. Sie können entweder ChartIndicatorAdd () oder eine Vorlage verwenden (siehe Dokumentation).

ChartIndicatorAdd() habe ich explizit schon aufgerufen (siehe Post #3 zweiter Code Abgschnitt):

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   hCI=iCustom(NULL,0,"ThG_Test\\ThG-ind_ABCD_t\\ThG-ind_ABCD_t");
   int err = ChartIndicatorAdd(0,0,hCI);                                          //Show Custom Indicator
//EventSetTimer(20);
   SendMsg("Init EA: ", MQL5InfoString(MQL5_PROGRAM_NAME));             //Sende Message mit Name des EA, wenn EA gestartet wird.




//---
   return(INIT_SUCCEEDED);
  }

Fuktioniert aber trotzdem nicht.

Mittlerweile glaube ich, dass es an einer Kleinigkeit scheitert oder an einem Setting meines Metatraders oder MetaEditor/Strategietesters.

Ich habe mal die Dateien des Indikators und des EA hier angehängt.

 

So, jetzt habe ich meinen EA von iCustom auf IndicatorCreate umgestellt und siehe da, jetzt funktioniert es.Ich weiß zwar nicht warum, aber immerhin.

Mein Code sieht nun so aus:




#property tester_indicator  "ThG_Expert_ABCD.mq5"

...

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MqlParam params[];
    ArrayResize(params,1);
    params[0].type         = TYPE_STRING;
    params[0].string_value = "ThG_Test\\ThG-ind_ABCD_t\\ThG-ind_ABCD_t";
   
   //hCI=iCustom(NULL,0,"ThG_Test\\ThG-ind_ABCD_t\\ThG-ind_ABCD_t");
   //int err = ChartIndicatorAdd(NULL,0,hCI);                                          //Show Custom Indicator

   hCI=IndicatorCreate(NULL,0,IND_CUSTOM,1,params);

   //EventSetTimer(20);
   SendMsg("Init EA: ", MQL5InfoString(MQL5_PROGRAM_NAME));             //Sende Message mit Name des EA, wenn EA gestartet wird.


   Print("--- Expert ----------------------------------");
   Print("Symbol: " + (string)_Symbol);
   Print("Period: " + (string)_Period);
   Print("MQL_VISUAL_MODE: " + (string)MQLInfoInteger(MQL_VISUAL_MODE));
   Print("MQL_DEBUG: " + (string)MQLInfoInteger(MQL_DEBUG));

//---
   return(INIT_SUCCEEDED);
  }


Was ist eigentlich der Unterschied zwischen iCustom und IndicatorCreate?

Grund der Beschwerde: