Indikatoren: Custom Moving Average Input Color

 

Custom Moving Average Input Color:

Eine Modifikation des Indikators "Custom Moving Average": Die Linienfarbe kann nun in Eingabeparametern bestimmt werden.


Autor: Vladimir Karputov

 
Es ist möglich, ein Dienstprogramm zu schreiben, das eine beliebige Linie/Histogramm (etc.) eines beliebigen Indikators nach dem im Video gezeigten Prinzip ändert.
 
Gut gemacht! Ich danke euch!
 

Ich habe den Code so angepasst, dass er die Einstellungen für Linienstärke und Stil enthält:


//+------------------------------------------------------------------+
//| Benutzerdefinierte gleitende Durchschnittswerteingabe Colour.mq5 |
//| Copyright 2009-2017, MetaQuotes Software Corp.
//|http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.001"
//--- Indikatoreinstellungen
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
//--- Eingabeparameter
input int               InpMAPeriod=13;            // Zeitraum
input int               InpMAShift=0;              // Verschiebung
input ENUM_MA_METHOD    InpMAMethod=MODE_SMMA;     // Methode
input color             InpColor=clrYellow;        // Farbe
input ENUM_LINE_STYLE   InpMAStyle=STYLE_SOLID;      // Stil
input int               InpMAWidth=1;              // Breite


//--- Indikatorpuffer
double               ExtLineBuffer[];
//+------------------------------------------------------------------+
//| einfacher gleitender Durchschnitt|
//+------------------------------------------------------------------+
void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int i,limit;
//--- erste Berechnung oder Anzahl der Balken wurde geändert
   if(prev_calculated==0)// erste Berechnung
     {
      limit=InpMAPeriod+begin;
      //--- Leeren Wert für erste Grenzbalken einstellen
      for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;
      //--- ersten sichtbaren Wert berechnen
      double firstValue=0;
      for(i=begin;i<limit;i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else limit=prev_calculated-1;
//--- Hauptschleife
   for(i=limit;i<rates_total && !IsStopped();i++)
      ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }
//+------------------------------------------------------------------+
//| Exponentiell gleitender Durchschnitt|
//+------------------------------------------------------------------+
void CalculateEMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int    i,limit;
   double SmoothFactor=2.0/(1.0+InpMAPeriod);
//--- erste Berechnung oder Anzahl der Balken wurde geändert
   if(prev_calculated==0)
     {
      limit=InpMAPeriod+begin;
      ExtLineBuffer[begin]=price[begin];
      for(i=begin+1;i<limit;i++)
         ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
     }
   else limit=prev_calculated-1;
//--- Hauptschleife
   for(i=limit;i<rates_total && !IsStopped();i++)
      ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
//---
  }
//+------------------------------------------------------------------+
//| Linearer gewichteter gleitender Durchschnitt|
//+------------------------------------------------------------------+
void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int        i,limit;
   static int weightsum;
   double     sum;
//--- erste Berechnung oder Anzahl der Balken wurde geändert
   if(prev_calculated==0)
     {
      weightsum=0;
      limit=InpMAPeriod+begin;
      //--- Leeren Wert für erste Grenzbalken einstellen
      for(i=0;i<limit;i++) ExtLineBuffer[i]=0.0;
      //--- ersten sichtbaren Wert berechnen
      double firstValue=0;
      for(i=begin;i<limit;i++)
        {
         int k=i-begin+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=(double)weightsum;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else limit=prev_calculated-1;
//--- Hauptschleife
   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      sum=0;
      for(int j=0;j<InpMAPeriod;j++) sum+=(InpMAPeriod-j)*price[i-j];
      ExtLineBuffer[i]=sum/weightsum;
     }
//---
  }
//+------------------------------------------------------------------+
//| geglätteter gleitender Durchschnitt|
//+------------------------------------------------------------------+
void CalculateSmoothedMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int i,limit;
//--- erste Berechnung oder Anzahl der Balken wurde geändert
   if(prev_calculated==0)
     {
      limit=InpMAPeriod+begin;
      //--- Leeren Wert für erste Grenzbalken einstellen
      for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;
      //--- ersten sichtbaren Wert berechnen
      double firstValue=0;
      for(i=begin;i<limit;i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else limit=prev_calculated-1;
//--- Hauptschleife
   for(i=limit;i<rates_total && !IsStopped();i++)
      ExtLineBuffer[i]=(ExtLineBuffer[i-1]*(InpMAPeriod-1)+price[i])/InpMAPeriod;
//---
  }
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- Zuordnung von Indikatorpuffern
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
//--- Genauigkeit einstellen
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- legt fest, ab welchem Index der erste Balken gezeichnet werden soll
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod);
//---- Linienverschiebungen beim Zeichnen
   PlotIndexSetInteger(0,PLOT_SHIFT,InpMAShift);
//--- Farblinie
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,InpColor);
//--- Stilzeile
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,InpMAStyle);
//--- Breite Linie
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,InpMAWidth);

//--- Name für DataWindow
   string short_name="unknown ma";
   switch(InpMAMethod)
     {
      case MODE_EMA :  short_name="EMA";  break;
      case MODE_LWMA : short_name="LWMA"; break;
      case MODE_SMA :  short_name="SMA";  break;
      case MODE_SMMA : short_name="SMMA"; break;
     }
   IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod)+")");
//---- setzt Zeichnungslinie leer Wert--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//---- Initialisierung abgeschlossen
  }
//+------------------------------------------------------------------+
//| Gleitender Durchschnitt|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//--- Prüfung der Anzahl der Balken
   if(rates_total<InpMAPeriod-1+begin)
      return(0);// nicht genügend Balken für die Berechnung
//--- erste Berechnung oder Anzahl der Balken wurde geändert
   if(prev_calculated==0)
      ArrayInitialize(ExtLineBuffer,0);
//--- legt fest, ab welchem Index der erste Balken gezeichnet werden soll
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod-1+begin);

//--- Berechnung
   switch(InpMAMethod)
     {
      case MODE_EMA:  CalculateEMA(rates_total,prev_calculated,begin,price);        break;
      case MODE_LWMA: CalculateLWMA(rates_total,prev_calculated,begin,price);       break;
      case MODE_SMMA: CalculateSmoothedMA(rates_total,prev_calculated,begin,price); break;
      case MODE_SMA:  CalculateSimpleMA(rates_total,prev_calculated,begin,price);   break;
     }
//--- Rückgabe des Wertes von prev_calculated für den nächsten Aufruf
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Und könnten wir die Möglichkeit hinzufügen, die Dicke der Linie vom EA aus zu ändern?
 
Pirata Independent #:
Und könnten wir die Möglichkeit hinzufügen, die Dicke der Linie vom EA aus zu ändern?

Ja, am Anfang des Indikators:


 
Und wie wird er gegenüber dem EA-Code verändert?