DRAW_HISTOGRAM2

The DRAW_HISTOGRAM2 stili, belirtilen renkte bir histogram çizer – iki gösterge tamponunun değerlerini kullanarak dikey parçalar çizer. Parçaların kalınlıkları, renkleri 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.

DRAW_HISTOGRAM2 stili, ayrı bir pencerede veya çizelge ana penceresinde 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 sıfır değeri ile başlatılamazlar.

DRAW_HISTOGRAM2 stilinin çizimi için gereken gösterge tamponu sayısı 2'dir.

Open (açılış) ve Close (kapanış) fiyatları arasında, belirtilen renk ve kalınlıkta bir dikey parça - histogramı - çizen gösterge örneği. Tüm histogram sütunlarının renkleri, genişlikleri ve stilleri, her N tikte bir değişir. Gösterge başlangıcında, OnInit() fonksiyonu içinde, göstergenin çizilmeyeceği günün numarası - invisible_day - rassal olarak ayarlanır. Bu amaçla boş değer şu şekilde ayarlanır, PLOT_EMPTY_VALUE=0:

//--- Bir boş değer ayarla
   PlotIndexSetDouble(çizim_indisi_DRAW_SECTION,PLOT_EMPTY_VALUE,0);

DRAW_HISTOGRAM2 stiline bir örnek

DRAW_HISTOGRAM2 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_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_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 2
#property indicator_plots   1
//--- plot Histogram_2
#property indicator_label1  "Histogram_2"
#property indicator_type1   DRAW_HISTOGRAM2
#property indicator_color1  clrRed
#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ı
//--- gösterge tamponları
double         Histogram_2Buffer1[];
double         Histogram_2Buffer2[];
//--- Haftanın, göstergenin çizilmeyeceği günü
int invisible_day;
//--- 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,Histogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Histogram_2Buffer2,INDICATOR_DATA);
//--- Bir boş değer ayarla
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- 0 ile 5 arası bir rassal sayı al
   invisible_day=MathRand()%6;
//---
   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;
//--- 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);
      if(dt.day_of_week==invisible_day)
        {
         Histogram_2Buffer1[i]=0;
         Histogram_2Buffer2[i]=0;
        }
      else
        {
         Histogram_2Buffer1[i]=open[i];
         Histogram_2Buffer2[i]=close[i];
        }
     }
//--- 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 renginin değişimi 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ı
//--- Çizgi genişliğini 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;
//--- Hesaplamada atlanan gün hakkında bilgi ekle
   comm="\r\nNot plotted day - "+EnumToString((ENUM_DAY_OF_WEEK)invisible_day)+comm;
//--- Bir yorum kullanarak, çizelge üzerinde bilgi göster
   Comment(comm);
  }