OnCalculate für zwei MAs

 

Kann mir jemand helfen, wieso der Aufruf von CalculateSimpleMA2() nicht geplottet wird?
Ist es nicht möglich, zwei MAs in OnCalculate zu packen?


//+------------------------------------------------------------------+
//|                                 Custom Moving Average Inputs.mq5 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
//--- input parameters

int            InpMAPeriod=50;         // Period
int            InpMAShift=0;           // Shift
color          InpColor=clrBlue;       // Color
int            InpWidth=1;             // Width

int            InpMA2Period=200;         // Period
int            InpMA2Shift=0;           // Shift
color          InpColor2=clrOrange;       // Color
int            InpWidth2=1;


//--- indicator buffers
double ExtLineBuffer[];
double ExtLineBuffer2[];
//+------------------------------------------------------------------+
//|   simple moving average                                          |
//+------------------------------------------------------------------+
void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)// first calculation
     {
      limit=InpMAPeriod+begin;
      //--- set empty value for first limit bars
      for(i=0; i<limit-1; i++)
         ExtLineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(i=begin; i<limit; i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
      ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateSimpleMA2(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)// first calculation
     {
      limit=InpMA2Period+begin;
      //--- set empty value for first limit bars
      for(i=0; i<limit-1; i++)
         ExtLineBuffer2[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(i=begin; i<limit; i++)
         firstValue+=price[i];
      firstValue/=InpMA2Period;
      ExtLineBuffer2[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
      ExtLineBuffer2[i]=ExtLineBuffer2[i-1]+(price[i]-price[i-InpMA2Period])/InpMA2Period;
//---
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLineBuffer2,INDICATOR_DATA);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpMA2Period);
//---- line shifts when drawing
   PlotIndexSetInteger(0,PLOT_SHIFT,InpMAShift);
   PlotIndexSetInteger(1,PLOT_SHIFT,InpMA2Shift);
//--- color line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,InpColor);
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,InpColor2);
//--- width line
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,InpWidth);
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,InpWidth2);
//--- name for DataWindow
   string short_name=" ma";
   string short_name2=" ma2";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod)+")");
   IndicatorSetString(INDICATOR_SHORTNAME,short_name2+"("+string(InpMA2Period)+")");
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Moving Average                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//--- check for bars count
   if(rates_total<InpMAPeriod-1+begin)
      return(0);// not enough bars for calculation
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
      ArrayInitialize(ExtLineBuffer,0);
      ArrayInitialize(ExtLineBuffer2,0);
//--- sets first bar from what index will be draw
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod-1+begin);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpMA2Period-1+begin);
//--- calculation
   CalculateSimpleMA(rates_total,prev_calculated,begin,price);
   CalculateSimpleMA2(rates_total,prev_calculated,begin,price);
//--- return value of prev_calculated for next call
   return(rates_total);
  }


//+------------------------------------------------------------------+
 
Christian Linden:

Kann mir jemand helfen, wieso der Aufruf von CalculateSimpleMA2() nicht geplottet wird?
Ist es nicht möglich, zwei MAs in OnCalculate zu packen?

Ähmm - was soll das sein? Ein EA (hat kein OnCalculate sondern OnTick) oder ein Indikator (Kein OnTick aber OnCalculate).

Ein EA 'plottet' nicht (er kann nur Objekte zeichnen - zeitaufwendig) und ein Indikator kann/darf nicht handeln.

 
Carl Schreiber #:

Ähmm - was soll das sein? Ein EA (hat kein OnCalculate sondern OnTick) oder ein Indikator (Kein OnTick aber OnCalculate).

Ein EA 'plottet' nicht (er kann nur Objekte zeichnen - zeitaufwendig) und ein Indikator kann/darf nicht handeln.

Ja, genau darum geht's; ich muss die beiden kombinieren, weil wie sonst kann ich im Tester handeln und gleichzeitig (im visuellen Modus) zwei MAs sehen?

 
Christian Linden #:

Ja, genau darum geht's; ich muss die beiden kombinieren, weil wie sonst kann ich im Tester handeln und gleichzeitig (im visuellen Modus) zwei MAs sehen?

Aber eigentlich kann man den Chart mit allen Indikatoren, wie man sie will, mit einem Rechtsklick als Template sichern. Entweder als tester.tpl unter ...\MQL5\Profiles\Templates\ oder den Namen des EAs (MeinEA.tpl) speichern. Probier mal.

 
Ein paar Tipps:

1. Du musst in den Präprozessoren für alle Plots Zeichenstile und Farben angeben (wo ist #indicator_type2?) 
Schau vielleicht mal in Examples/Envelopes wie man das macht.

2. Wenn du die MAPeriod und Extbuffer als Parameter in die CalculateSMA Funktion übergeben kannst, kannst du verschiedene MAs mit derselben Funktion berechnen - nacheinander.

Wenn du dazu Fragen hast, gerne fragen. Ich weiß nicht was du schon kannst, daher wäre das jetzt müßig, vom Hölzchen bis zum Stöckchen Alles zu erklären.
 
Carl Schreiber #:

Aber eigentlich kann man den Chart mit allen Indikatoren, wie man sie will, mit einem Rechtsklick als Template sichern. Entweder als tester.tpl unter ...\MQL5\Profiles\Templates\ oder den Namen des EAs (MeinEA.tpl) speichern. Probier mal.

=) Genial, so einfach, funktioniert, danke!

 
Tobias Johannes Zimmer #:
Ein paar Tipps:

1. Du musst in den Präprozessoren für alle Plots Zeichenstile und Farben angeben (wo ist #indicator_type2?) 
Schau vielleicht mal in Examples/Envelopes wie man das macht.

2. Wenn du die MAPeriod und Extbuffer als Parameter in die CalculateSMA Funktion übergeben kannst, kannst du verschiedene MAs mit derselben Funktion berechnen - nacheinander.

Wenn du dazu Fragen hast, gerne fragen. Ich weiß nicht was du schon kannst, daher wäre das jetzt müßig, vom Hölzchen bis zum Stöckchen Alles zu erklären.

Ich habe mit dem Template für den Tester alles, was ich gerade brauche. Aber gut zu wissen, dass das so funktioniert, danke.

 
Christian Linden #:

Ich habe mit dem Template für den Tester alles, was ich gerade brauche. Aber gut zu wissen, dass das so funktioniert, danke.

Ah okay, kein Problem.

Grund der Beschwerde: