English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Grafik Kontrol Seçenekleri ile Gösterge Oluşturma

Grafik Kontrol Seçenekleri ile Gösterge Oluşturma

MetaTrader 5Örnekler | 10 Aralık 2021, 17:16
100 0
Vasily
Vasily

Giriş

Piyasa duyarlılığına aşina olanlar, bilgisayar analiz yöntemlerinin ortaya çıktığı ilk anlardan itibaren yatırımcılar tarafından kullanılan fiyat hareketi analizi için güçlü bir araç olarak MACD göstergesi (tam adı Hareketli Ortalamalar Yakınsama Iraksama) hakkında bilgi sahibidir.

Grafikte birinci gelen MACD göstergesini uzun süre inceledim. Farklı seçenekler ve farklı hesaplama algoritmaları ile bu göstergenin birçok farklı türünü gördüm; bu nedenle bildiğim tüm türleri tek bir göstergede birleştirmeye karar verdim.

MACD göstergesi türleri

Gösterge, geleneksel MACD çizgilerini ve oSMA histogramını içerecektir.  MACD'nin ana değişikliklerini tanımlayalım:
  1. Impulse Sistemi olarak da bilinen Elder MACD'si,
  2. Hareketli çizgi yoluyla kontrol edilmeyen Elder MACD'si,
  3. Büyüyen ve düşen durumlar için farklı renklerle çizilen oSMA,
  4. Yalnızca oSMA-histogramı çizilir,
  5. Yalnızca MACD çizgileri çizilir,

Göstergenin İlk Ayarları

Hesaplama için aşağıdaki parametrelere ihtiyacımız olacak:

  1. Hızlı bir MACD çizgisinin değeri,
  2. Yavaş bir MACD çizgisinin değeri,
  3. Bir sinyal MACD çizgisinin değeri,
  4. Elder yöntemiyle Trend Doğrulama çizgisinin değeri,

Bu göstergeyi çizmek için şunlara ihtiyacımız olacak:

  1. MACD-çizgisi,
  2. Sinyal çizgisi,
  3. 3-renkli OSMA histogramı.

MQL5 Sihirbazının menüsüne gidin:

Şekil 1. MQL5 Sihirbazını kullanarak gösterge oluşturma


Şekil 2. MQL5 Sihirbazında ortak gösterge parametrelerini tanımlama


Şekil 3. MQL5 Sihirbazında göstergenin çizim özelliklerini tanımlama

Gösterge Oluşturma

Göstergenin başlangıç şablonuna sahibiz. Öncelikle göstergemizin MACD çizgisini hesaplamamız gerekiyor.

Bu çizgiyi hesaplamak için tam formülü derinlemesine incelemeyeceğiz - iMACD işlevini kullanacağız: 

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
   )

Bu işlev, göstergenin uygun kopyasının bir tanıtıcısını döndürür. Bu tanıtıcıyı kullanarak, bu gösterge tarafından hesaplanan verileri almak mümkündür. Gösterge arabelleğinden alınan veriler (teknik göstergeler, kendi dahili arabelleklerinde hesaplanan verileri içerir; bu, göstergeye bağlı olarak 5'e kadar olabilir), CopyBuffer() işlevi kullanılarak kopyalanabilir.

Ardından, iMACD işlevini kullanarak MACD verileri için bir istek oluştururuz:

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

Bize gösterge kopyasının bir tanıtıcısını döndürecektir.

Verileri CopyBuffer işlevi aracılığıyla gerekli arabelleğe kopyalayın :

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
   );

Şimdi göstergenin MACD çizgisini isteyelim:

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

Göstergenin sinyal çizgisini elde ederiz:

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

Hepsini bir araya getirelim ve elimizde ne olduğuna bakalım:

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

Şu anda elimizde hesaplanmış MACD ve sinyal çizgileri var.

Devam edelim.

Çünkü verilerden elde edilen

MACDlineBuffer

ve

SignallineBuffer

arabelleklerdeki veriler kopyalanarak elde edildikleri için, indekslemeleri grafiğin sonundan yapılır.

Tarihsel olarak, fiyat dizisinin verilerine erişim, verilerin sonundan gerçekleştirilir. Fiziksel olarak, yeni veriler her zaman dizinin sonuna yazılır, ancak mevcut (tamamlanmamış) çubuğun indeksi her zaman sıfıra eşittir. Zaman serisi dizisinde 0'a eşit olan indeks, bu zaman diliminin tamamlanmamış zaman aralığına karşılık gelen mevcut çubuğun verileri anlamına gelir.

Tüm arabelleklerde aynı indeksleme yönünü kullanmak için diğer arabellekleri zaman serisi olarak tanımlamamız gerekir.

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

Bir histogramın verilerini almamız gerekiyor; bu, MACD çizgisinden sinyal çizgisinin çıkarılması ile hesaplanır:

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

Tümünü birleştirelim:

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; 
  }


Gösterge Kontrolünün Grafik Sistemini Oluşturma

Bu göstergenin 5 türüne sahibiz.

İlk olarak, №3 ve №4 öğelerini uyguluyoruz.

    3. Yalnızca oSMA-histogramı çizilir,
    4. Yalnızca MACD çizgileri çizilir.

Uygun düğmeleri oluşturalım.

Öğe 4 için:

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

Düğmenin yanlışlıkla silinmesi veya bir sonraki tıklamada kayması durumunda, düğme geri dönecektir.

№3 öğesi için:

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);

Koşul 4 için basılmış ve basılmamış düğme durumu için uygulamayı oluşturalım.

Bu, arabellek indekslerinin görüntülenmesini gerektirir.

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
  }

Düğmeye basıldığında MACD çizgileri çizilir ve basılmadığında çizilmez.

Koşul 3 için basılmış ve basılmamış düğme durumu için uygulamayı oluşturalım.

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);
  }

İki düğme oluşturalım: "2color" ve "Impulse" ve bunları grafiğin sağ alt köşesine konumlandırın.

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);

Elder sistemine göre Impuse kontrolü için EldersMA değerlerinin konumlandırılacağı yeni bir dizi eklememiz gerekiyor.

Bunu yapmak için, toplam arabellek sayısını bir değer artırmalıyız.+

#property indicator_buffers 4

şu şekilde değiştirilmesi gerekir:

#property indicator_buffers 5

ve yeni bir arabellek bildiriyoruz.

double EldersiEMA[];

Bunu, dahili hesaplamalar için bir arabellek olarak tanımlarız:

SetIndexBuffer(4,EldersiEMA,INDICATOR_CALCULATIONS);

Şimdi üstel hareketli ortalama değerlerini arabelleğe kopyalayalım:

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

Arabellek, kopyalama işlevi yoluyla elde edildiği için, indekslenmesi grafiğimizin diğer arabellekleriyle aynıdır (grafiğin sonundan).

Şimdi 2 renkli OsMA için koşulları yazalım:

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
  }

Renk indeksleri çizgilerde belirtilir:

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

İlk rengin indeksi 0'a eşittir, ikincisinin indeksi 1'dir vb.

Şimdi Impulse Sistemi'nin varyasyonları için koşulları yazalım:

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
        }
     }
  }

Şimdi Impulse Sistemi koşullarını OsMA çizim koşullarına ekleyelim:

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;
           }
        }
     }
  }

Şimdi düğmelerin gereksiz olarak yanıp sönmesini önlemek için koşulları yazalım:

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")

Bir düğmenin metnini değiştiren kodu sileriz.

Tümünü birleştirme:

//+------------------------------------------------------------------+
//|                                            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);
  }
//+------------------------------------------------------------------+

Algoritmanın blok diyagramı Şekil 4'te gösterilmiştir:



Şekil 4. Gösterge algoritmasının blok diyagramı

Sonuç, Şekil 5-7'de gösterilmiştir.

Şek. 5

Şek. 6

Şek. 7

Sonuç

Bu makale, fiyatların bilgisayar analizini ve göstergelerin grafiksel kontrolüne ilişkin basit yöntemlerin uygulanmasını kullanarak piyasaları incelemeye başlayan yeni başlayanlar için bir rehber olarak kabul edilebilir.

Bu makalenin grafiksel kontrol sistemleri oluşturma konusundaki teknik becerilerinizi geliştireceğini ve engel teşkil eden hususları ortadan kaldırarak kendi "piyasa vizyonunuzu" bulmanıza yardımcı olacağını umuyorum.

MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/42

Ekli dosyalar |
MetaTrader 5 ve MATLAB Etkileşimi MetaTrader 5 ve MATLAB Etkileşimi
Bu makale MetaTrader 5 ve MatLab matematiksel paketi arasındaki etkileşime ilişkin ayrıntıları içermektedir. Ayrıca MatLab masaüstü ile etkileşimde bulunmak için evrensel bir kitaplık geliştirme süreci olan veri dönüştürme mekanizması gösterilmektedir. Bunun yanı sıra MatLab ortamı tarafından oluşturulan DLL kullanımını da kapsamaktadır. Bu makale, C++ ve MQL5 hakkında bilgi sahibi olan deneyimli okuyuculara yöneliktir.
MQL5'te olay işleme: MA dönemini anında değiştirme MQL5'te olay işleme: MA dönemini anında değiştirme
13. dönemli basit MA (Hareketli Ortalama) göstergesinin bir grafiğe uygulandığını varsayalım. Ve dönemi 20 olarak değiştirmek istiyoruz, ancak gösterge özellikleri iletişim kutusuna gidip 13 ila 20 sayısını düzenlemek istemiyoruz: Fare ve klavyeyi kullanarak bu sıkıcı işlemleri yapmaktan sıkıldık. Ve özellikle gösterge kodunu açıp değiştirmek istemiyoruz. Tüm bunları tek bir düğmeye basarak yapmak istiyoruz; sayısal tuş takımının yanındaki "yukarı oklara" basarak. Bu makalede bunun nasıl yapılacağını anlatacağım.
Yeni Başlayanlar için Çoklu Gösterge Arabelleği ile Bir Gösterge Oluşturma Yeni Başlayanlar için Çoklu Gösterge Arabelleği ile Bir Gösterge Oluşturma
Karmaşık kodlar bir dizi basit koddan meydana gelir. Bu kodlar hakkında bilgi sahibiyseniz, bu, o kadar karmaşık görünmez. Bu makalede, çoklu gösterge arabelleği ile bir göstergenin nasıl oluşturulacağını ele alacağız. Örnek olarak Aroon göstergesi ayrıntılı olarak analiz edilmiş ve kodun iki farklı sürümü sunulmuştur.
MQL5: MetaTrader 5'te Emtia Vadeli İşlemler Ticaret Komisyonu (CFTC) Raporlarının Analizi ve İşlenmesi MQL5: MetaTrader 5'te Emtia Vadeli İşlemler Ticaret Komisyonu (CFTC) Raporlarının Analizi ve İşlenmesi
Bu makalemizde, CFTC rapor analizi için bir araç geliştireceğiz. Şu sorunu çözeceğiz: CFTC rapor verilerinin, Komisyon tarafından sağlanan veri dosyalarından bir ara işleme ve dönüştürme olmadan doğrudan kullanılmasına olanak tanıyan bir gösterge geliştirmek. Ayrıca, bu, farklı amaçlar için kullanılabilir: Verileri bir gösterge olarak çizmek, diğer göstergelerdeki verilerle devam etmek, otomatik analiz için script dosyalarında, alım satım stratejilerinde kullanılmak üzere Expert Advisor'larda.