DRAW_COLOR_SECTION

DRAW_COLOR_SECTION stili, DRAW_SECTION stilinin renkli versiyonudur ama onun aksine, farklı renkteki kısımların çizimine olanak sağlar. DRAW_COLOR_SECTION stili, 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 parçasının rengi, parçanın sonuna denk gelen çubuğun üzerine çizilecek renk indisinin belirtilmesiyle tanımlanabilir.

Parçaların 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 (kısımlar), gösterge tamponunun boş olmayan bir değerinden, yine boş olmayan bir değerine kadar çizilir ve boş değerler gözardı edilir. Bir değerin "boş" olarak göz önüne alınacağını belirtmek için, bu değeri PLOT_EMPTY_VALUE özelliği ile ayarlayın: Örneğin, gösterge, sıfır olmayan değerler üzerindeki parçalardan oluşan bir dizi şeklinde çizilecekse, sıfır değerini boş değer olarak ayarlamalısınız:

//--- 0 (boş) değer, çizime katılmayacak
   PlotIndexSetDouble(çizim_indisi_DRAW_COLOR_SECTION,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_SECTION tamponunun çizimi için gereken tamponların sayısı 2'dir.

  • bir tampon çizginin çizileceği gösterge 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).

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

High (yüksek) fiyat değerlerini kullanarak, 5 çubuk uzunluğunda renkli parçalar çizen bir gösterge örneği. Parçaların renkleri, kalınlıkları ve stilleri N tikte bir rassal olarak değişir.

DRAW_COLOR_SECTION stilinin bir örneği

DRAW_COLOR_SECTION stilindeki plot1 için, özelliklerin başlangıçta #property derleyici direktifi kullanılarak belirlendiğini; Sonrasında ise renklerin, 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österge Özellikleri penceresindeki Veriler sekmesi).

//+------------------------------------------------------------------+
//|                                           DRAW_COLOR_SECTION.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_SECTION stilini betimleyen bir gösterge"
#property description "Belirtilen çubuk sayısı uzunluğunda renkli parçalar çizer"
#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 2
#property indicator_plots   1
//--- plot ColorSection
#property indicator_label1  "ColorSection"
#property indicator_type1   DRAW_COLOR_SECTION
//--- Kısımları renklendirmek için 8 renk tanımla (özel dizide depolanırlar)
#property indicator_color1  clrRed,clrGold,clrMediumBlue,clrLime,clrMagenta,clrBrown,clrTan,clrMediumVioletRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- giriş parametreleri
input int      N=5;                      // Değişimin gerçekleştirileceği tik sayısı
input int      bars_in_section=5;        // Çubuk sayısı olarak, parçaların uzunluğu
//--- Parçaların sonlarını hesaplamak için ek bir değişken
int            divider;
int            color_sections;
//--- Çizim için bir tampon
double         ColorSectionBuffer[];
//--- Herbir çubuk üzerindeki çizgi rengini depolayan bir tampon
double         ColorSectionColors[];
//--- 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,ColorSectionBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorSectionColors,INDICATOR_COLOR_INDEX);
//--- 0 (boş) değer, çizime katılmayacak
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- Parçaların renklendirilmesinde kullanılacak renk sayısı
   int color_sections=8;   //  #property indicator_color1 özelliğinde yoruma bakın
//--- Gösterge parametresini kontrol et
   if(bars_in_section<=0)
     {
      PrintFormat("Geçersiz parça uzunluğu=%d",bars_in_section);
      return(INIT_PARAMETERS_INCORRECT);
     }
   else divider=color_sections*bars_in_section;
//---
   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();
      //--- Parçaların çiziminde kullanılan renkleri değiştir
      ChangeColors(colors,color_sections);
      //--- Tik sayacını sıfırla
      ticks=0;
     }
 
//--- Gösterge değerlerinin hesaplanmaya başlanacağı çubuğun numarası
   int start=0;
//--- Gösterge daha önce hesaplanmışsa, başlangıcı bir önceki çubuğa al
   if(prev_calculated>0) start=prev_calculated-1;
//--- Burada göstergenin tüm değerleri hesaplanır
   for(int i=start;i<rates_total;i++)
     {
      //--- Eğer çubuk numarası section_length ile bölünebiliyorsa, parçanın sonuna gelinmiş demektir
      if(i%bars_in_section==0)
        {
         //--- Parçanın sonunu bu çubuğun High (yüksek) fiyatına ayarla
         ColorSectionBuffer[i]=high[i];
         //--- Çubuk sayısının scetion_length*number_of_colors değerine bölümünden kalan
         int rest=i%divider;
         //renk numarasını =  0'dan number_of_colors-1 değerine kadar al
         int color_indext=rest/bars_in_section;
         ColorSectionColors[i]=color_indext;
        }
      //---Bölümden kalan 'bars' değerine eşitse, 
      else
        {
         //--- Hiçbir değişim olmadıysa çubuğu gözardı et - 0 olarak ayarla
         else ColorSectionBuffer[i]=0;
        }
     }
//--- 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("SectionColorIndex[%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);
  }