DRAW_ZIGZAG

DRAW_ZIGZAG stili iki ayrı gösterge tamponunun değerleri temelinde parçalar çizer. Bu stil, DRAW_SECTION stiline benzer ama onun aksine, her iki tampon değerinin de tanımlı olduğu çubukların üzerinde dikey parçalar çizilmesine olanak sağlar. Parçalar ilk gösterge tamponunun değerinden ikinci tamponun değerine çizilir. Tamponların hiçbiri baştan sona boş değerler içeremez; böyle bir durumda hiçbir şey çizilmeyecektir.

Çizgilerin kalınlık, renk ve stilleri, DRAW_SECTION stiline benzer şekilde, derleyici direktifleri ile veya dinamik olarak PlotIndexSetInteger() fonksiyonunun kullanımıyla belirtilebilir. Çizim özelliklerinin dinamik olarak değiştirilmesi, göstergelerin "canlılaştırılmasını" sağlar, bu şekilde göstergelerin görünümleri mevcut duruma göre değişir.

Parçalar, gösterge tamponunun boş olmayan bir değerinden, yine boş olmayan bir değerine kadar çizilir. Bir değerin "boş" olacağını belirtmek için, değeri PLOT_EMPTY_VALUE özelliğiyle ayarlayın:

//--- 0 (boş) değer, çizime katılmayacak
   PlotIndexSetDouble(çizim_indisi_DRAW_ZIGZAG,PLOT_EMPTY_VALUE,0);

Gösterge tamponlarının değerlerini her zaman açıkça doldurun, atlamak istediğiniz çubukları boş değer olarak ayarlayın.

DRAW_ZIGZAG stilinin çizimi için gereken tampon sayısı 2'dir.

High ve Low fiyatların temelinde bir testere şekli çizen gösterge örneği. Zigzag çizgilerinin renkleri, kalınlıkları ve stilleri N tikte bir rassal olarak değişir.

DRAW_ZIGZAG stiline bir örnek

DRAW_ZIGZAG stiline sahip plot1 için, özelliklerin başlangıçta #property derleyici direktifi kullanılarak belirlendiğini; sonrasında ise bu özelliklerin, OnCalculate() fonksiyonu içinde önceden hazırlanmış bir listeden rassal olarak ayarlandığını lütfen not ediniz. N parametresi, el ile yapılandırma olasılığı göz önüne alınarak, göstergenin dışsal parametreleri içinde ayarlanır (göstergenin özellikler penceresindeki Veriler sekmesi).

//+------------------------------------------------------------------+
//|                                                  DRAW_ZIGZAG.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description "DRAW_ZIGZAG stilini betimleyen bir gösterge"
#property description "düz parçalar halinde, bir günlük çubuk atlayarak bir \"testere\" şekli çizer"
#property description "Atlanacak gün, gösterge başlangıcında rassal olarak seçilir"
#property description "Parçaların renk, genişlik ve stilleri, her N tikten sonra"
#property description " rassal olarak değiştirilir"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ZigZag
#property indicator_label1  "ZigZag"
#property indicator_type1   DRAW_ZIGZAG
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- giriş parametreleri
input int      N=5;              // Değişim için gerekli tik sayısı 
//--- gösterge tamponları
double         ZigZagBuffer1[];
double         ZigZagBuffer2[];
//--- Haftanın, göstergenin çizilmeyeceği günü
int invisible_day;
//--- Renkleri depolayacak bir dizi
color colors[]={clrRed,clrBlue,clrGreen};
//--- Çizgi stillerinin depolanması için bir dizi
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Dizilerin gösterge tamponlarına bağlanması
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA);
//--- 0 ile 6 arasında bir rassal sayı al, bu numaraya sahip gün için gösterge çizilmez
   invisible_day=MathRand()%6;
//--- 0 (boş) değer, çizime katılmayacak
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- 0 (boş) değer, çizime katılmayacak
   PlotIndexSetString(0,PLOT_LABEL,"ZigZag1;ZigZag2");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   static int ticks=0;
//--- Çizginin stilini,rengini ve genişliğini değiştirmek için tikleri hesapla
   ticks++;
//--- Yeterli sayıda tik birikmişse
   if(ticks>=N)
     {
      //--- Çizgi özelliklerini değiştir
      ChangeLineAppearance();
      //--- Tik sayacını sıfırla
      ticks=0;
     }
 
//--- Her bir çubuğun gün bilgisini almak için gereken zaman yapısı
   MqlDateTime dt;
 
//--- Hesaplamaların başlangıç pozisyonu
   int start=0;
//--- Eğer gösterge bir önceki tikte hesaplanmışsa, hesaplamayı sondan bir önceki çubuktan başlat
   if(prev_calculated!=0) start=prev_calculated-1;
//--- Hesap döngüsü
   for(int i=start;i<rates_total;i++)
     {
      //--- Yapı içinde çubuk açılış zamanını yaz
      TimeToStruct(time[i],dt);
      //--- Bu çubuğun gün numarası invisible_day değerine eşit
      if(dt.day_of_week==invisible_day)
        {
         //--- Bu çubuk için boş değerleri göstergeye yaz
         ZigZagBuffer1[i]=0;
         ZigZagBuffer2[i]=0;
        }
      //--- Haftanın günü tamamsa, tamponları doldur
      else
        {
         //--- Çubuk sayısı çift ise
         if(i%2==0)
           {
            //---  İlk tampona High değerini ikinciye Low değerini yaz
            ZigZagBuffer1[i]=high[i];
            ZigZagBuffer2[i]=low[i];
           }
         //--- Sayı teek ise
         else
           {
            //--- Çubuğu ters sırada doldur
            ZigZagBuffer1[i]=low[i];
            ZigZagBuffer2[i]=high[i];
           }
        }
     }
//--- bir sonraki çağrı için prev_calculated değerine dönüş yap
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Zigzag parçalarının görünümünü değiştirir                        |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Zigzag özelliklerine dair bilginin biçimlendirilmesi için bir dizgi
   string comm="";
//--- ZigZag rengini değiştirmek için bir blok
   int number=MathRand(); // Rassal bir sayı al
//--- Bölen, colors[] dizisinin boyutuna eşit
   int size=ArraySize(colors);
//--- Bölümden kalan tam-sayı değeri şeklinde yeni bir renk seçmek için, indis değerini al
   int color_index=number%size;
//--- Rengi PLOT_LINE_COLOR özelliği şeklinde ayarla
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Çizgi rengini ayarla
   comm=comm+"\r\n"+(string)colors[color_index];
 
//--- Çizgi kalınlığını değiştirmek için bir blok
   number=MathRand();
//--- Tam-sayı bölümden kalan genişliği al
   int width=number%5;   // Genişlik 0'dan 4'e ayarlandı
//--- Rengi PLOT_LINE_WIDTH özelliği şeklinde ayarla
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Çizgi kalınlığını yaz
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- Çizgi stilini değiştirmek için bir blok
   number=MathRand();
//--- Bölen, syles dizisinin büyüklüğüne eşit
   size=ArraySize(styles);
//--- Yeni bir stil seçmek için, indis değerini, bölümden kalan tam-sayı değeri şeklinde al
   int style_index=number%size;
//--- Rengi PLOT_LINE_COLOR özelliği şeklinde ayarla
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Çizgi stilini yaz
   comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Hesaplamada atlanan gün hakkında bilgi ekle
   comm="\r\nNot plotted day - "+EnumToString((ENUM_DAY_OF_WEEK)invisible_day)+comm;
//--- Bir yorum kullanarak, çizelge üzerinde bilgi göster
   Comment(comm);
  }