DRAW_COLOR_HISTOGRAM2

DRAW_COLOR_HISTOGRAM2 stili, belirtilen renkte bir histogram çizer – iki gösterge değerinin değerlerini kullanarak dikey kısımları çizer. DRAW_HISTOGRAM2 stilinin aksine, bu stilde her bir sütun, daha önceden tanımlan mış bir küme içerisinden, kendine has bir renge sahip olabilir. Tüm kısımların değerleri gösterge tamponundan alınır.

Sembollerin kalınlık ve genişlikleriDRAW_HISTOGRAM2 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.

DRAW_COLOR_HISTOGRAM2 stili, çizelge ana penceresinde veya ayrı alt pencerelerde kullanılabilir. Boş değerler için hiçbir şey çizilmez; gösterge tamponundaki tüm değerler açıkça ayarlanmalıdır. Tamponlar boş değerler ile başlatılmazlar.

DRAW_COLOR_HISTOGRAM2 stilinin çizimi için gereken tampon sayısı 3'tür:

  • iki tampon, çubuk üzerindeki dikey kısımların üst ve alt sınırlarını depolamak için;
  • bir tampon, kısımı çizmekte kullanılacak rengin indisini depolamak için (sadece, boş olmayan değerlerler için ayarlanması mantıklıdır).

High (yüksek) ve Low (düşük) fiyatlar arasında, belirtilen renkte bir histogram çizen gösterge örneği. Histogram, haftanın her günü için ayrı bir değer alır. Histogramın gün rengi, kalınlığı ve stili, her N tik ile rassal olarak değişir.

DRAW_COLOR_HISTOGRAM2 stiline bir örnek

DRAW_COLOR_HISTOGRAM2 stiline sahip plot1 için, #property derleyici direktifi ile başlangıçta 5 renk ayarlandığını, daha sonra rengin, OnCalculate() fonksiyonu içerisindeki 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_HISTOGRAM2.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_HISTOGRAM2 stilini betimleyen bir gösterge"
#property description "Her bir çubuk üzerinde Open ve Close arasındaki bir kısımı çizer"
#property description "renk, genişlik ve stil, her N tikten sonra"
#property description "rassal olarak değiştirilir"
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1
//--- plot ColorHistogram_2
#property indicator_label1  "ColorHistogram_2"
#property indicator_type1   DRAW_COLOR_HISTOGRAM2
//--- Haftanın günlerine göre histogramı renklendirmek için 5 renk tanımla (özel dizide depolanırlar)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
 
//--- giriş parametreleri
input int      N=5;              // Histogramı değiştirmek için gereken tik sayısı
int            color_sections;
//--- Değer tamponları
double         ColorHistogram_2Buffer1[];
double         ColorHistogram_2Buffer2[];
//--- İndisler için bir tampon
double         ColorHistogram_2Colors[];
//--- 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,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//--- Bir boş değer ayarla
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- Sinüsoidin renklendirilmesi için gereken renklerin sayısı
   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++;
//--- Tikler önemli bir sayıda biriktirilmişse
   if(ticks>=N)
     {
      //--- Çizgi özelliklerini değiştir
      ChangeLineAppearance();
      //--- Histogramın çiziminde kullanılacak renkleri değiştir
      ChangeColors(colors,color_sections);      
      //--- Tik sayacını sıfırla
      ticks=0;
     }
 
//--- Gösterge değerlerini hesapla
   int start=0;
//--- Haftanın günlerini her bir çubuğun açılışını kullanarak almak için
   MqlDateTime dt;
//--- 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++)
     {
      TimeToStruct(time[i],dt);
      //--- değer
      ColorHistogram_2Buffer1[i]=high[i];
      ColorHistogram_2Buffer2[i]=low[i];
      //--- Haftanın gününe göre renk indisini ayarla
      int day=dt.day_of_week;
      ColorHistogram_2Colors[i]=day;
     }
//--- 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, 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("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);
  }