DRAW_COLOR_LINE

DRAW_COLOR_LINE stili, DRAW_LINE stilinin renkli versiyonudur. Aynı şekilde bu da gösterge tamponunun değerlerini kullanarak bir çizgi çizer. Ama bu stil, başlığında COLOR sözcüğünü taşıyan tüm renkli stiller gibi, özel bir ek tampona sahiptir. Bu tampon, özel olarak ayarlanmış bir renk dizisi içindeki renklerin indislerini depolar. Bu şekilde, her bir çizgi kısmının rengi, söz konusu çubuğun üzerine çizilecek rengin indisinin belirtilmesiyle tanımlanabilir.

Çizgilerin genişlikleri, stilleri ve renkleri, derleyici direktifleri ile veya dinamik olarak PlotIndexSetInteger() fonksiyonunu kullanarak ayarlanabilir. Ç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.

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

  • bir tampon çizginin çizileceği gösterge değerlerini depolamak için;
  • bir tampon, çizginin her bir çubuk üzerindeki renk indisini depolamak için.

Renkler, #property indicator_color1 derleyici direktifi ile virgülle ayrılmış şekilde belirtilebilir. Renklerin sayısı 64'ü geçemez.

//--- Her bir çubuğu renklendirmek için 5 renk tanımla (özel dizide depolanacaklar)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (en çok 64 adet renk belirtilebilir)

Çubukların Close (kapanış) fiyatlarını kullanarak çizgi çizen bir gösterge örneği. Çizgi kalınlığı ve stili her N=5 tikte bir rassal olarak değişir.

DRAW_COLOR_LINE stiline bir örnek

Çizgi kısımlarının renklerini de, özel ChangeColors() fonksiyonu ile rassal olarak değiştir.

//+------------------------------------------------------------------+
//| Çizgi kısımlarının renklerini 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 tamsayı bölümünün kalanı şeklinde bir indis 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("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }

Örnekte, göstergelerin "renkli" versiyonların özelliği gösterilmektedir - bir çizgi kısmının rengini değiştirmek için (renk indislerini içeren) ColorLineColors[] tamponundaki değerleri değiştirmeniz gerekmez. Tek yapmanız gereken, özel bir dizi içinde yeni renkler ayarlamaktır. Bu, PlotIndexSetInteger() fonksiyonunu ile sadece küçük bir renk dizisini değiştirerek, rengi tüm çizim için hızlıca ve bir kerede değiştirebilmenizi sağlar.

DRAW_COLOR_LINE stilindeki plot1 için, özelliklerin #property derleyici direktifi kullanılarak belirlendiğini; sonrasında ise üç özelliğin, OnCalculate() fonksiyonu içinde önceden hazırlanmış bir listeden rassal olarak ayarlandığını lütfen not ediniz.

N parametresi ve Length (çubuklardaki renkli kısımların uzunluğu), 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_LINE.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_LINE stilinin betimlenmesi için bir gösterge"
#property description "Close fiyatları üzerinde 20 çubuk üstünde renkli parçalar halinde bir çizgi çizer"
#property description "çizgi parçalarının renk, genişlik ve stili, her N tikten sonra"
#property description "rassal olarak değiştirilir"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorLine
#property indicator_label1  "ColorLine"
#property indicator_type1   DRAW_COLOR_LINE
//--- Her bir çubuğu renklendirmek için 5 renk tanımla (özel dizide depolanacaklar)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (en çok 64 adet renk belirtilebilir)
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- giriş parametreleri
input int      N=5;           // Değişim için kullanılacak tik sayısı
input int      Length=20;     // Çubuklardaki her renk parçasının uzunluğu
int            line_colors=5; // Ayarlanmış renk sayısı 5 - #property indicator_color1 özelliğine bakınız
//--- Çizim için bir tampon
double         ColorLineBuffer[];
//--- Herbir çubuk üzerindeki çizgi rengini depolayan bir tampon
double         ColorLineColors[];
 
//--- Renkleri depolamak için 7 elemanlı bir dizi
color colors[]={clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod};
//--- Ç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 tamponunun dizi ile bağlanması
   SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorLineColors,INDICATOR_COLOR_INDEX);
//--- Pseudo-rassal sayı oluşturucusunun başlatılması
   MathSrand(GetTickCount());
//---
   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++;
//--- Tikler önemli bir sayıda biriktirilmişse
   if(ticks>=N)
     {
      //--- Çizgi özelliklerini değiştir
      ChangeLineAppearance();
      //--- Çizgi parçalarının renklerini değiştir
      ChangeColors(colors,5);
      //--- Tik sayacını sıfırla
      ticks=0;
     }
 
//--- Gösterge değerlerinin hesaplanması için bir blok
   for(int i=0;i<rates_total;i++)
     {
      //--- Gösterge değerini tampona yaz
      ColorLineBuffer[i]=close[i];
      //--- Şimdi, bu çubuk için rassal olarak bir renk ayarla
      int color_index=i%(5*Length);
      color_index=color_index/Length;
      //--- Bu çubuk için çizgi, color_index indisli rengi alacak
      ColorLineColors[i]=color_index;
     }
 
//--- Fonksiyonun sonraki çağrıları için prev_calculated değerine dönüş yap
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Çizgi kısımlarının renklerini 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 tamsayı bölümünün kalanı şeklinde bir indis 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("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Göstergenin görüntülenen çizgisinin görünümünü değiştirir        |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Çizgi ö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 ayarlanır
//--- Rengi PLOT_LINE_WIDTH özelliği şeklinde ayarla
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Çizgi kalınlığını yaz
   comm=comm+" Width="+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=EnumToString(styles[style_index])+", "+comm;
//--- Bir yorum kullanarak, çizelge üzerinde bilgi göster
   Comment(comm);
  }