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?
Und wie wird er gegenüber dem EA-Code verändert?
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich

Custom Moving Average Input Color:
Eine Modifikation des Indikators "Custom Moving Average": Die Linienfarbe kann nun in Eingabeparametern bestimmt werden.
Autor: Vladimir Karputov