English Русский 中文 Español 日本語 Português 한국어 Français Italiano Türkçe
Erzeugung eines Indikators mit graphischen Kontrolloptionen

Erzeugung eines Indikators mit graphischen Kontrolloptionen

MetaTrader 5Beispiele | 12 Februar 2016, 12:17
721 0
Vasily
Vasily

Einleitung

All diejenigen, die sich mit Stimmungen auf dem Markt auskennen, kennen den MACD Indikator (seiner voller Name lautet Gleitender Durchschnitt Konvergenz/Divergenz) -das leistungsstarke Tool zur Analyse von Kursbewegungen, das von Händlers seit dem ersten Auftauchen von Computer-gestützten Analysemethoden verwendet wird..

Ich beschäftige mich schon lange mit dem MACD-Indikator, der seinen Platz im Chart erhalten hat. Und ich habe viele verschiedene Arten dieses Indikators gesehen, mit unterschiedlichen Optionen und unterschiedlichen Berechnungsalgorithmen - also habe ich mir gedacht, ich kombiniere alle Arten, die ich kenne, in einen einzigen Indikator.

Arten des MACD-Indikators

Der Indikator wird die herkömmlichen MACD-Linien und oSMA-Histogramm haben.  Doch definieren wir zunächst die hauptsächlichen Veränderungen des MACD:
  1. Elder's MACD, auch als Impulssystem bekannt;
  2. Elder's MACD ohne Prüfen via der beweglichen Linie;
  3. Der oSMA, in unterschiedlichen Farben für steigende und fallende Fälle gezeichnet;
  4. Nur das oSMA-Histogramm wird gezeichnet;
  5. Nur die MACD-Linien werden gezeichnet;

Anfangseinstellungen des Indikators

Zur Berechnung benötigen wir die folgenden Parameter:

  1. Wert der schnellen MACD-Linie;
  2. Wert der langsamen MACD-Linie;
  3. Wert der Signal-MACD-Linie;
  4. Wert der Trend-Überprüfungslinie via der Elder's Methode;

Um diesen Indikator zeichnen zu können, brauchen wir folgendes:

  1. Die MACD-Linie;
  2. Die Signal-Linie;
  3. Das 3-farbige OSMA-Histogramm.

Dazu gehen wir in das Menü des MQL5 Assistenten:

Abb. 1 Erzeugung des Indikators mit Hilfe des MQL5 Assistenten


Abb. 2 Festlegung gemeinsamer Indikator-Parameter im MQL5 Assistenten


Abb. 3 Festlegung der Eigenschaften des Indikators für die Zeichnung im MQL5 Assistenten

Erzeugung des Indikators

Wir haben ein erstes Template des Indikators. Zuerst müssen wir die MACD-Linie unseres Indikators berechnen.

Wir beschäftigen uns jetzt nicht detailliert mit der exakten Berechnungsformel dieser Linie - stattdessen nehmen wir die iMACD Funktion her: 

int iMACD (
   string symbol,           // symbol name
   ENUM_TIMEFRAMES period,   // time period
   int fast_ema_period,    // fast averaging period
   int slow_ema_period,    // slow averaging period
   int signal_period,      // averaging period of a signal line
   ENUM_APPLIED_PRICE applied_price // type of price or a handle
   )

Diese Funktion liefert einen Identifikator der passenden Kopie des Indikators. Und mit seiner Hilfe erhalten wir die, von diesem Indikator berechnete Daten. Die Daten aus einem Indikator-Buffer (technische Indikatoren haben die berechneten Daten in ihren eigenen internen Buffer - das können je nach Indikator bis zu 5 sein), können mit Hilfe der Funktion CopyBuffer() kopiert werden. 

als nächstes generieren wir eine Anfrage für MACD-Daten mit Hilfe der Funktion iMACD:

int MACDhadling =  iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE);

Sie liefert einen Identifikator der Indikatorkopie.

Diese Daten werden dann mit Hilfe der Funktion CopyBuffer in den erforderlichen Buffer kopiert:

int  CopyBuffer(
   int       indicator_handle,     // indicator's handle
   int       buffer_num,           // buffer number of the indicator
   int       start_pos,            // start position 
   int       count,                // number of data to copy
   double    buffer[]              // target array for the data to copy
   );

Schicken wir eine Anfrage nach der MACD-Linie des Indikators ab:

CopyBuffer(MACDhadling,0,0,NewData,MACDlineBuffer);

Wir erhalten jetzt die Signallinie des Indikators:

CopyBuffer(MACDhadling,1,0,NewData,SignallineBuffer);

Schauen wir mal, was wir jetzt alles haben:

int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE);
CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer);
CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer);

Wir haben die berechneten MACD- und Signallinien.

Also weiter.

Da wir die Daten aus dem

MACDlineBuffer

und den

SignallineBuffer

Buffers ja via Kopieren erhalten haben, beginnt ihre Indizierung am Ende des Charts.

Historisch beginnt der Zugriff auf die Daten des Kurs-Arrays immer vom Ende der Daten aus. Physisch werden die neuen Daten nämlich immer ans Ende des Arrays geschrieben, doch der Index des aktuellen (unvollständigen) Balkens ist immer = O. Der Index = O im Zeitreihen-Array zeigt die Daten des aktuellen Balkens an, der dem unvollständigen Zeitintervall dieses Zeitraums entspricht.

Um die gleiche Indizierungsrichtung bei allen Buffern anzuwenden, sollten wir die anderen Buffer auch als Zeitreihen definieren.

ArraySetAsSeries(HistogramBuffer,false);
ArraySetAsSeries(HistogramColors,false);

Wir brauchen auch die Daten eines Histogramms, das mit Hilfe der Subtraktion der Signallinie von der MACD-Linie errechnet wird:

for(int i=0;i<rates_total;i++)
  {
   HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i];
  }

Fügen wir das alles nun zusammen:

ArraySetAsSeries(HistogramBuffer,false);
ArraySetAsSeries(HistogramColors,false);

int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE);
CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer);
CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer);

for(int i=0;i<rates_total;i++)
  {
   HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i];
   HistogramColors[i]=1; 
  }


Erzeugung eines grafischen Systems der Indikatorkontrolle

Wir haben 5 Sorten dieses Indikators.

Zuerst implementieren wir Elemente №3 und №4.

    3. Nur das oSMA-Histogramm wird gezeichnet;
    4. Nur die MACD-Linien werden gezeichnet.

Legen wir dazu nun die passenden Tasten an.

Für Element 4:

ObjectCreate(0,"ShowMACD",OBJ_BUTTON,ChartWindowFind(),100,100);   //creating the button
ObjectSetInteger(0,"ShowMACD",OBJPROP_XDISTANCE,75);              //assign the coordinates
ObjectSetInteger(0,"ShowMACD",OBJPROP_YDISTANCE,5);
ObjectSetInteger(0,"ShowMACD",OBJPROP_CORNER,CORNER_RIGHT_UPPER);  // and an anchor point
ObjectSetString(0,"ShowMACD",OBJPROP_TEXT,"ShowMACD");            // button label 
ObjectSetInteger(0,"ShowMACD",OBJPROP_FONTSIZE,8);
ObjectSetInteger(0,"ShowMACD",OBJPROP_XSIZE,70);                 // size of buttons 
ObjectSetInteger(0,"ShowMACD",OBJPROP_YSIZE,20);
ObjectSetInteger(0,"ShowMACD",OBJPROP_SELECTABLE,false);         // to make it selectable

Bei einer versehentlichen Löschens der Taste oder ihrer Verschiebung auf die nächste Preisänderung, geht sie wieder an ihren Ursprungsort zurück.

Für Element №3:

ObjectCreate(0,"ShowOsMA",OBJ_BUTTON,ChartWindowFind(),100,100);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_XDISTANCE,75);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_YDISTANCE,30);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
ObjectSetString (0,"ShowOsMA",OBJPROP_TEXT,"Show OsMA");
ObjectSetInteger(0,"ShowOsMA",OBJPROP_FONTSIZE,8);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_XSIZE,70);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_YSIZE,20);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_SELECTABLE,false);

Erzeugen wir die Implementierung für eine gedrückte und nicht gedrückte Taste für Bedingung 4.

Dazu müssen wir die Buffer-Indices ansehen.

SetIndexBuffer(0,MACDlineBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SignallineBuffer,INDICATOR_DATA);
SetIndexBuffer(2,HistogramBuffer,INDICATOR_DATA);
SetIndexBuffer(3,HistogramColors,INDICATOR_COLOR_INDEX);
if(ObjectGetInteger(0,"ShowMACD",OBJPROP_STATE)!=1)
  {
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_NONE); // the buffer with index 0 isn't plotted
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE); // the buffer with index 1 isn't plotted
  }
else
  {
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); // the buffer with index 0 is plotted as line
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE); // the buffer with index 1 is plotted as line
  }

Bei gedrückter Taste werden die MACD-Linien gezeichnet. Ist sie nicht gedrückt, passiert gar nichts.

Erzeugen wir die Implementierung für eine gedrückte und nicht gedrückte Taste für Bedingung 3.

if(ObjectGetInteger(0,"ShowOsMA",OBJPROP_STATE)!=1)
  {
   //the buffer with index 2 isn't plotted
   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_NONE);
  }
else
  {
   //the buffer with index 2 is plotted as a color histogram
   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
  }

Legen wir zwei Tasten an: "2color" und "Impulse" und platzieren sie unten rechts auf dem Chart.

ObjectCreate(0,"2color",OBJ_BUTTON,ChartWindowFind(),100,100);
ObjectSetInteger(0,"2color",OBJPROP_XDISTANCE,75);
ObjectSetInteger(0,"2color",OBJPROP_YDISTANCE,50);
ObjectSetInteger(0,"2color",OBJPROP_CORNER,CORNER_RIGHT_LOWER);
ObjectSetInteger(0,"2color",OBJPROP_FONTSIZE,8);
ObjectSetInteger(0,"2color",OBJPROP_XSIZE,70);
ObjectSetInteger(0,"2color",OBJPROP_YSIZE,20);
ObjectSetInteger(0,"2color",OBJPROP_SELECTABLE,false);
ObjectSetString (0,"2color",OBJPROP_TEXT,"MultiColor");

ObjectCreate(0,"Impulse",OBJ_BUTTON,ChartWindowFind(),100,100);
ObjectSetInteger(0,"Impulse",OBJPROP_XDISTANCE,75);
ObjectSetInteger(0,"Impulse",OBJPROP_YDISTANCE,25);
ObjectSetInteger(0,"Impulse",OBJPROP_CORNER,CORNER_RIGHT_LOWER);
ObjectSetInteger(0,"Impulse",OBJPROP_FONTSIZE,8);
ObjectSetInteger(0,"Impulse",OBJPROP_XSIZE,70);
ObjectSetInteger(0,"Impulse",OBJPROP_YSIZE,20);
ObjectSetInteger(0,"Impulse",OBJPROP_SELECTABLE,false);

Zur Impulse-Überprüfung gemäß des Elder-Systems, müssen wir ein neues Array hinzufügen, in dem sich die EldersMA-Werte befinden.

Dazu müssen wir die Gesamtzahl der Buffer um 1 erhöhen.+

#property indicator_buffers 4

sollte verändert werden in:

#property indicator_buffers 5

und wir deklarieren einen neuen Buffer.

double EldersiEMA[];

Er wird als Buffer für interne Berechnungen definiert:

SetIndexBuffer(4,EldersiEMA,INDICATOR_CALCULATIONS);

Kopieren wir jetzt die Werte des exponentiell gleitenden Durchschnitts in den Buffer:

// you can do all in single line
CopyBuffer(iMA(NULL,0,EldersEMA,0,MODE_EMA,PRICE_CLOSE),0,0,rates_total,EldersiEMA); 

Da wir den Buffer ja mit Hilfe der Copy Funktion erhalten haben, gleicht seine Indizierung der aller anderen Buffers auf unserem Chart - nämlich am Ende angefangen.

Schreiben wir jetzt die Bedingungen für die 2-farbige OsMA:

if (ObjectGetInteger(0,"2color",OBJPROP_STATE))
  {
   for(int i=1;i<rates_total;i++)
     {
      // if the histogram rises, the color is set to 0
      if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0;
      // if the histogram falls, the color is set to 1
      if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1;
     }
  }
else
  {
   ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor");
   // Here are the conditions for multi-color OSMA
  }

Die Farbindices sind in den Linien angegeben:

#property indicator_label3  "Histogram"
#property indicator_type3   DRAW_COLOR_HISTOGRAM
#property indicator_color3  DeepSkyBlue,Red,Green

Der Index der ersten Farbe = O, der der zweiten = 1, usw.

Schreiben wir nun die Bedingungen für die Abweichungen des Impulssystems:

if (ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) // // "Impulse" button is checked
  {
   ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse");  // checking for a trend using the MACD-Line
   for(int i=1;i<rates_total;i++)
     {
      // the histogram rises and MACD-line rises
      if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0;
      else
        {
         // the histogram falls and MACD-line falls 
         if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1;
         else HistogramColors[i]=2; // if there isn't any conditions satisfied
        }
     }
  }
else 
  {
   ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's");  // checking for a trend using the EMA-line
   for(int i=1;i<rates_total;i++)
     {
      // the histogram rises and EMA-line rises
      if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0;
      else
        {
         // the histogram falls and EMA-line falls
         if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1;
         else HistogramColors[i]=2;// if there isn't any conditions satisfied
        }
     }
  }

Und fügen nun die Bedingungen des Impulssystems den Bedingungen zur Zeichnung von OsMA hinzu:

if (ObjectGetInteger(0,"2color",OBJPROP_STATE))
  {
   for(int i=1;i<rates_total;i++)
     {
      if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0;
      if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1;
     }
  }
else
  {
   ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor");
   if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE))
     {
      ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse");
      for(int i=1;i<rates_total;i++)
        {
         if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0;
         else
           {
            if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1;
            else HistogramColors[i]=2;
           }
        }
     }
   else 
     {
      ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's");
      for(int i=1;i<rates_total;i++)
        {
         if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0;
         else
           {
            if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1;
            else HistogramColors[i]=2;
           }
        }
     }
  }

Schreiben wir als nächstes die Bedingungen zur Vermeidung unnötiger Tastenblinkzeichen:

if (ObjectGetInteger(0,"2color",OBJPROP_STATE)) ObjectSetString (0,"2color",OBJPROP_TEXT,"2ColorMACD");
else ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor");
if (ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) ObjectSetString (0,"Impulse",OBJPROP_TEXT,"Impulse");
else ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's")

wir löschen den Code, der den Text einer Taste enthält.

Nun wird alles vereint:

//+------------------------------------------------------------------+
//|                                            MACD_By_CoreWinTT.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots   3
//---- plot MACDline
#property indicator_label1  "MACDline"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Green
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//---- plot Signalline
#property indicator_label2  "Signalline"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Red
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//---- plot Histogram
#property indicator_label3  "Histogram"
#property indicator_type3   DRAW_COLOR_HISTOGRAM
#property indicator_color3  DeepSkyBlue,Red,Green
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2

//--- input parameters
input int      Fast=12;
input int      Slow=26;
input int      Signal=9;
input int      EldersEMA=13;
//--- indicator buffers
double         MACDlineBuffer[];
double         SignallineBuffer[];
double         HistogramBuffer[];
double         HistogramColors[];
double         EldersiEMA[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MACDlineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,SignallineBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,HistogramBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,HistogramColors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,EldersiEMA,INDICATOR_CALCULATIONS);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   ArraySetAsSeries(HistogramBuffer,false);
   ArraySetAsSeries(HistogramColors,false);

   int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE);
   CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer);
   CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer);

   for(int i=0;i<rates_total;i++) { HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i];HistogramColors[i]=1; }

   ObjectCreate(0,"ShowMACD",OBJ_BUTTON,ChartWindowFind(),100,100);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_XDISTANCE,75);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_YDISTANCE,5);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
   ObjectSetString(0,"ShowMACD",OBJPROP_TEXT,"ShowMACD");
   ObjectSetInteger(0,"ShowMACD",OBJPROP_FONTSIZE,8);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_XSIZE,70);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_YSIZE,20);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_SELECTABLE,false);

   ObjectCreate(0,"ShowOsMA",OBJ_BUTTON,ChartWindowFind(),100,100);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_XDISTANCE,75);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_YDISTANCE,30);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
   ObjectSetString(0,"ShowOsMA",OBJPROP_TEXT,"Show OsMA");
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_FONTSIZE,8);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_XSIZE,70);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_YSIZE,20);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_SELECTABLE,false);

   if(ObjectGetInteger(0,"ShowMACD",OBJPROP_STATE)!=1) 
     {
      PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_NONE);
      PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE);
     }
   else 
     {
      PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
      PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);
     }

   if(ObjectGetInteger(0,"ShowOsMA",OBJPROP_STATE)!=1) 
     {
      PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_NONE);
     }
   else 
     {
      PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
     }

   ObjectCreate(0,"2color",OBJ_BUTTON,ChartWindowFind(),100,100);
   ObjectSetInteger(0,"2color",OBJPROP_XDISTANCE,75);
   ObjectSetInteger(0,"2color",OBJPROP_YDISTANCE,50);
   ObjectSetInteger(0,"2color",OBJPROP_CORNER,CORNER_RIGHT_LOWER);
   ObjectSetInteger(0,"2color",OBJPROP_FONTSIZE,8);
   ObjectSetInteger(0,"2color",OBJPROP_XSIZE,70);
   ObjectSetInteger(0,"2color",OBJPROP_YSIZE,20);
   ObjectSetInteger(0,"2color",OBJPROP_SELECTABLE,false);
   ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor");

   ObjectCreate(0,"Impulse",OBJ_BUTTON,ChartWindowFind(),100,100);
   ObjectSetInteger(0,"Impulse",OBJPROP_XDISTANCE,75);
   ObjectSetInteger(0,"Impulse",OBJPROP_YDISTANCE,25);
   ObjectSetInteger(0,"Impulse",OBJPROP_CORNER,CORNER_RIGHT_LOWER);
   ObjectSetInteger(0,"Impulse",OBJPROP_FONTSIZE,8);
   ObjectSetInteger(0,"Impulse",OBJPROP_XSIZE,70);
   ObjectSetInteger(0,"Impulse",OBJPROP_YSIZE,20);
   ObjectSetInteger(0,"Impulse",OBJPROP_SELECTABLE,false);
   ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse");

   if(ObjectGetInteger(0,"2color",OBJPROP_STATE)) ObjectSetString(0,"2color",OBJPROP_TEXT,"2ColorMACD");
   else ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor");
   if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse");
   else ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's");

   CopyBuffer(iMA(NULL,0,EldersEMA,0,MODE_EMA,PRICE_CLOSE),0,0,rates_total,EldersiEMA);

   if(ObjectGetInteger(0,"2color",OBJPROP_STATE))
     {
      for(int i=1;i<rates_total;i++)
        {
         if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0;
         if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1;
        }
     }
   else
     {
      if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE))
        {
         for(int i=1;i<rates_total;i++)
           {
            if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0;
            else
              {
               if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1;
               else HistogramColors[i]=2;
              }
           }
        }
      else 
        {
         for(int i=1;i<rates_total;i++)
           {
            if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0;
            else
              {
               if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1;
               else HistogramColors[i]=2;
              }
           }

        }
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Abb. 4 zeigt das Block-Diagramm des Algorithmus:



Abb. 4 Das Blockdiagramm des Indikator-Algorithmus

Abb. 5 - 7 zeigen das komplette Endergebnis.

Fig. 5

Fig. 6

Fig. 7

Fazit

Dieser Beitrag ist durchaus als Anleitung für Anfänger gedacht, die mit der Beobachtung von Märkten mit Hilfe von Computeranalyse von Kursen und der Implementierung einfacher Methoden grafischer Indikator-Kontrolle beginnen.

Ich hoffe, dieser Beitrag hilft Ihnen Ihre technischen Fähigkeiten bei der Erzeugung grafischer Kontrollsysteme zu verbessern und hilft Ihnen auch, Ihren eigen "Blick auf den Markt" zu finden, indem Sie alles was stört, verbergen.

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/42

Beigefügte Dateien |
Verarbeitung von Ereignissen in MQL5: Unmittelbare Änderung des Zeitraums für den gleitenden Durchschnitt Verarbeitung von Ereignissen in MQL5: Unmittelbare Änderung des Zeitraums für den gleitenden Durchschnitt
Angenommen, dass ein MA (Gleitender Durchschnitt) Indikator mit Zeitraum 13 auf ein Chart angewandt wird. Und wir den Zeitraum auf 20 ändern wollen, wir dazu aber nicht in das Dialogfenster Indikator-Eigenschaften gehen und die Zahl von 13 zu 20 ändern wollen, da wir einfach auf diese Aktionen mit der Maus und der Tastatur keine Lust mehr haben. Und wir wollen vor allem nicht den Indikator-Code öffnen und dort was ändern. Wir wollen einfach nur eine Taste drücken - und zwar "Bild nach oben" neben dem Zahlenfeld auf der Tastatur. In diesem Beitrag sage ich Ihnen wie das geht.
Die Interaktion von MetaTrader 5 und MATLAB Die Interaktion von MetaTrader 5 und MATLAB
Dieser Beitrag beschäftigt sich mit den dEtailös der Interaktion zwischen MetaTrader 5 und dem MatLab Mathematik-Paket. Er erklärt die Mechanismen der Datenkonvertierung, den Entwicklungsprozess einer universellen Library, die mit dem MATLAB-Desktop interagieren kann. Zudem wird auch die Verwendung von DLL erklärt, die durch die MatLab Umgebung erzeugt werden. Dieser Beitrag richtet sich an bereits erfahrene Leser, die C++ und MQL5 kennen.
MQL5: Analyse und Umgang mit Berichten der US-Warenterminhandelsaufsichtsbehörde (US-Warenterminhandelsaufsichtsbehörde , CFTC) in MetaTrader 5 MQL5: Analyse und Umgang mit Berichten der US-Warenterminhandelsaufsichtsbehörde (US-Warenterminhandelsaufsichtsbehörde , CFTC) in MetaTrader 5
In diesem Beitrag entwickeln wir ein Analysetool für CFTC-Berichte. Wir lösen das folgende Problem: Entwicklung eines Indikators mit dem wir die CFTC-Berichtsdaten aus den von der Behörde zur Verfügung gestellten Datendateien ohne Zwischenschritte und Konvertierung direkt verwenden können. Dieser kann darüber hinaus noch für weitere Zwecke genutzt werden: die Daten als einen Indikator zeichnen, mit den Daten in anderen Indikatoren, in den Scripts für die automatische Analyse und im Expert Advisors zur Verwendung in den Handelsstrategien fortfahren.
Erzeugung eines Indikators mit mehreren Indikator-Buffern für Anfänger Erzeugung eines Indikators mit mehreren Indikator-Buffern für Anfänger
Die komplexen Codes bestehen aus einer Reihe einfacher Codes. Kennt man diese, dann sieht alles gleich nicht mehr so kompliziert aus. In diesem Beitrag beschäftigen wir uns mit der Erzeugung eines Indikators mit mehreren Indikator-Buffern. Als Beispiel wird hierzu der Aroon-Indikator detailliert analysiert und zwei unterschiedliche Versionen dieses Codes präsentiert.