DRAW_HISTOGRAM

DRAW_HISTOGRAM stili, sıfır seviyesinden belirtilen değere kadar, belirtilen renkte bir sütun dizisi şeklinde bir histogram çizer. Değerler gösterge tamponundan alınır. Sütunların kalınlık, renk ve stilleri, DRAW_LINE 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_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, Bears Power veya OsMA. Görüntülenmeyecek boş değerler için sıfır değeri belirtilmelidir.

DRAW_HISTOGRAM stilinin çizimi için gereken tampon sayısı 1'dir.

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_HISTOGRAM stiline bir örnek

DRAW_HISTOGRAM stilindeki plot1 için, özelliklerin başlangıçta #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, 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_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_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üsoid döngüsü içindeki çubuk sayısını ayarlar"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Histogram
#property indicator_label1  "Histogram"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  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ı
//--- gösterge tamponları
double         HistogramBuffer[];
//--- Bars parametresi ile çarpıldığında, 2Pi'lik açıyı radyan olarak alabilmemiz için gereken çarpan
double    multiplier;
//--- Renkleri depolayacak bir dizi
color colors[]={clrRed,clrBlue,clrGreen};
//--- Ç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,HistogramBuffer,INDICATOR_DATA);
//--- Ç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();
      //--- 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++)
     {
      HistogramBuffer[i]=sin(i*multiplier);
     }
//--- Fonksiyonun sonraki çağrıları için prev_calculated değerine dönüş yap
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Gösterge çizgilerinin görünümünü değiştirir                      |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Çizgi özelliklerine dair bilginin biçimlendirilmesi için bir dizgi
   string comm="";
//--- Çizgi rengini değiştirmek için bir blok
   int number=MathRand(); // Rassal bir sayı al
//--- Bölen, colors[] dizisinin boyutuna eşit
   int size=ArraySize(colors);
//--- Bölümden kalan tam-sayı değeri şeklinde yeni bir renk seçmek için, indis değerini al
   int color_index=number%size;
//--- Rengi PLOT_LINE_COLOR özelliği şeklinde ayarla
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Çizgi rengini ayarla
   comm=comm+"\r\n"+(string)colors[color_index];
 
//--- Çizgi kalınlığını değiştirmek için bir blok
   number=MathRand();
//--- Tam-sayı bölümden kalan genişliği al
   int width=number%5;   // Genişlik 0'dan 4'e ayarlandı
//--- Kalınlığı 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
   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;
//--- Çizgi stilini 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);
  }