DRAW_COLOR_HISTOGRAM

DRAW_COLOR_HISTOGRAM stili, sıfırdan belirtilen bir değere kadar bir renkli sütun dizisi şeklinde histogram çizer. Değerler gösterge tamponundan alınır. Her bir sütun, daha önceden tanımlan mış bir küme içerisinden, kendine has bir renge sahip olabilir.

Histogramın kalınlık, renk ve stilleri, DRAW_HISTOGRAM stiline benzer şekilde, derleyici direktifleri ile veya dinamik olarak PlotIndexSetInteger() fonksiyonunun kullanımıyla belirtilebilir. Çizim özelliklerinin dinamik olarak değişmesi, mevcut duruma bağlı olarak, histogram görünümünün de değişmesini sağlar.

Her çubuk için sıfır seviyesinden bir sütun çizildiğinden, DRAW_COLOR_HISTOGRAM stilinin ayrı bir pencerede kullanılması daha iyi olacaktır. Bu çizim tipi genellikle osilatör tipi göstergeler çizmek için kullanılır, örneğin, Awesome Oscillator veya Market Facilitation Index. Görüntülenmeyecek boş değerler için sıfır değeri belirtilmelidir.

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

  • bir tampon, her çubuktaki dikey kısmın sıfır olmayan değerlerinin depolanması için kullanılır; kısımın ikinci ucu, her zaman göstergenin sıfır çizgisi üzerinde olur;
  • 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, virgülle ayrılmış şekilde #property indicator_color1 derleyici direktifi ile belirlenebilir. Renklerin sayısı 64'ü geçemez.

MathSin() fonksiyonu temelinde, belirtilen bir renk ile bir sinüsoid çizen gösterge örneği. Tüm histogram sütunlarının renkleri, genişlikleri ve stilleri, her N tikte bir rassal olarak değişir. "bars" parametresi, sinüsoidin periyodunu belirtir, yani belirtilen sayıdaki çubuğun ardından sinüsoid döngüyü tekrar edecektir.

DRAW_COLOR_HISTOGRAM stiline bir örnek

DRAW_COLOR_HISTOGRAM stiline sahip plot1 için, #property derleyici direktifi ile başlangıçta 5 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östergenin özellikler penceresindeki Veriler sekmesi).

//+------------------------------------------------------------------+
//|                                         DRAW_COLOR_HISTOGRAM.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_HISTOGRAM stilini betimleyen bir gösterge"
#property description "Ayrı bir pencerede, histogram şeklinde bir sinüsoid çizer"
#property description "Çubukların renk ve genişliği, her N tikten sonra"
#property description "rassal olarak değiştirilir"
#property description "bars parametresi, sinüsoidin tekrar edeceği çubuk sayısını ayarlar"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- giriş parametreleri
input int      bars=30;          // Çubuk sayısıyla, sinüsoid periyodu
input int      N=5;              // Histogramı değiştirmek için gereken tik sayısı
//--- plot Color_Histogram
#property indicator_label1  "Color_Histogram"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
//--- Kısımları renklendirmek için 8 renk tanımla (özel dizide depolanırlar)
#property indicator_color1  clrRed,clrGreen,clrBlue,clrYellow,clrMagenta,clrCyan,clrMediumSeaGreen,clrGold
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- Değerler için bir tampon
double         Color_HistogramBuffer[];
//--- İndisler için bir tampon
double         Color_HistogramColors[];
//--- Bars parametresi ile çarpıldığında, 2Pi'lik açıyı radyan olarak alabilmemiz için gereken çarpan
double         multiplier;
int            color_sections;
//--- 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_HistogramBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,Color_HistogramColors,INDICATOR_COLOR_INDEX);
//---- Sinüsoidin renklendirilmesi için gereken renklerin sayısı
   color_sections=8;   // #property indicator_color1 özelliğindeki yoruma bak
//--- Çarpan değerini hesapla
   if(bars>1)multiplier=2.*M_PI/bars;
   else
     {
      PrintFormat("bars=%d değerini 1'den büyük olarak ayarla",bars);
      //--- Göstergenin erken sonlandırılması
      return(INIT_PARAMETERS_INCORRECT);
     }   
//---
   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();
      //--- Histogram için kullanılan renkleri değiştir
      ChangeColors(colors,color_sections);      
      //--- Tik sayacını sıfırla
      ticks=0;
     }
 
//--- Gösterge değerlerini hesapla
   int start=0;
//--- Daha önceki OnCalculate çağrısında hesaplanmışsa
   if(prev_calculated>0) start=prev_calculated-1; // hesaplama başlangıcını son seferin bir eksiğine ayarla
//--- Gösterge tamponunu değerlerle doldur
   for(int i=start;i<rates_total;i++)
     {
      //--- Bir değer
      Color_HistogramBuffer[i]=sin(i*multiplier);
      //--- Renk
      int color_index=i%(bars*color_sections);
      color_index/=bars;
      Color_HistogramColors[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("HistogramColorIndex[%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);
  }