DRAW_COLOR_ZIGZAG

DRAW_COLOR_ZIGZAG stili, iki gösterge tamponunun değerlerini kullanarak farklı renkte kısımlar (parçalar) çizer. Bu stil, DRAW_ZIGZAG stilinin renkli versiyonudur, yani her bir parça için ayrı bir rengin önceden ayarlanmış bir renk kümesi içerisinden seçilmesine izin verir. 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.

Çizginin kalınlık, renk ve stilleri, DRAW_ZIGZAG 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_COLOR_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_COLOR_ZIGZAG stilinin çizimi için gereken tampon sayısı 3'tür:

  • iki tampon, zigzag parçalarının (kısımlarının) son değerlerini depolamak için;
  • bir tampon, parçayı çizmekte kullanılan renk indisini depolamak için (sadece, boş olmayan değerlerler için ayarlanması mantıklıdır).

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

DRAW_COLOR_ZIGZAG stiline bir örnek

DRAW_COLOR_ZIGZAG stiline sahip olan plot1 için, #property derleyici direktifi ile başlangıçta 8 renk ayarlandığını, daha sonra OnCalculate() fonksiyonu içerisinde, rengin colors[] dizisinde depolanan 14 renk arasından rassal olarak seçildiğini 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österge Özellikleri penceresindeki Veriler sekmesi).

//+------------------------------------------------------------------+
//|                                            DRAW_COLOR_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_COLOR_ZIGZAG stilini betimleyen bir gösterge"
#property description "Renkli parçalar dizisi şeklinde bir kırık çizgi çizer, renk ise haftanın gününün numarasına bağlıdır"
#property description "Parçaların renk, genişlik ve stilleri, her N tikten sonra"
#property description " rassal olarak değiştirilir"
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1
//--- plot Color_Zigzag
#property indicator_label1  "Color_Zigzag"
#property indicator_type1   DRAW_COLOR_ZIGZAG
//--- Kısımları renklendirmek için 8 renk tanımla (özel dizide depolanırlar)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- giriş parametreleri
input int      N=5;              // Değişim için gerekli tik sayısı 
int            color_sections;
//--- Parça sonlarının değerleri için tamponlar
double         Color_ZigzagBuffer1[];
double         Color_ZigzagBuffer2[];
//--- Parça sonlarının renk indisleri için tamponlar
double         Color_ZigzagColors[];
//--- Renkleri depolayacak 14 elemanlı bir dizi
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//--- Ç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()
  {
//--- gösterge tamponlarının eşlenmesi
   SetIndexBuffer(0,Color_ZigzagBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Color_ZigzagBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,Color_ZigzagColors,INDICATOR_COLOR_INDEX);
//----Zigzag'ı renklendirmek için renk indisi
   color_sections=8;   //  #property indicator_color1 özelliğindeki yoruma bak
//---
   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();
      //--- Parçaların çiziminde kullanılan renkleri değiştir
      ChangeColors(colors,color_sections);
      //--- 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);
 
      //--- Çubuk numarası çift ise
      if(i%2==0)
        {
         //---  High değerini 1-inci tampona ve Low değerini 2-inci tampona yaz one
         Color_ZigzagBuffer1[i]=high[i];
         Color_ZigzagBuffer2[i]=low[i];
         //--- Parçanın rengi
         Color_ZigzagColors[i]=dt.day_of_year%color_sections;
        }
      //--- çubuk numarası tek ise
      else
        {
         //--- Çubukları ters sırada doldur
         Color_ZigzagBuffer1[i]=low[i];
         Color_ZigzagBuffer2[i]=high[i];
         //--- Parçanın rengi
         Color_ZigzagColors[i]=dt.day_of_year%color_sections;         
        }
     }
//--- bir sonraki çağrı için prev_calculated değerine dönüş yap
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Zigzag kısımların rengini değiştirir                             |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- Renklerin sayısı
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- Her renk indisi için rassal olarak bir renk tanımla
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- Rassal bir değer al
      int number=MathRand();
      //--- col[] dizisi içinde, tam-sayı bölümünden kalan şeklinde bir indisi al
      int i=number%size;
      //--- Her bir indis için, rengi PLOT_LINE_COLOR özelliği şeklinde ayarla
      PlotIndexSetInteger(0,                    //  Bir grafiksel stilin numarası
                          PLOT_LINE_COLOR,      //  Özellik tanımlayıcı
                          plot_color_ind,       //  Rengin girildiği indis
                          cols[i]);             //  Yeni bir renk
      //--- Renkleri yaz
      comm=comm+StringFormat("ZigzagColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Zigzag parçalarının görünümünü değiştirir                        |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Color_ZigZag özelliklerine dair bilginin biçimlendirilmesi için bir dizgi
   string comm="";
//--- Çizgi kalınlığını değiştirmek için bir blok
   int 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
   int 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;
//--- Bir yorum kullanarak, çizelge üzerinde bilgi göster
   Comment(comm);
  }