DRAW_BARS

DRAW_BARS stili Open, High, Low ve Close fiyatlarını içeren dört gösterge tamponunun temelinde çubuklar çizer. Bu stil, bir çizelge alt penceresinde yer alanlar ve diğer finansal araçlar da dahil olmak üzere, çubuklar şeklinde göstergeler oluşturulması için tasarlanmıştır.

Çubukların renkleri derleyici direktifleri ile veya dinamik olarak, PlotIndexSetInteger() fonksiyonunu kullanarak ayarlanabilir. Ç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.

Gösterge, dört gösterge tamponundan hiçbirinin boş değer içermediği çubuklar için çizilir. Bir değerin "boş" olarak göz önüne alınacağını belirtmek için, bu değeri PLOT_EMPTY_VALUE özelliğine ayarlayın:

//--- 0 (boş) değer, çizime katılmayacak
   PlotIndexSetDouble(çizim_indisi_DRAW_BARS,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_BARS stili için gereken tampon sayısı 4'tür. Çizilecek tüm tamponlar birbiri ardına, verilen sırayla dizilmelidir: Open, High, Low ve Close. Tamponların hiçbiri baştan sona boş değerler içeremez; böyle bir durumda hiçbir şey çizilmeyecektir.

Ayrı bir pencerede yer alan seçilmiş finansal aracın üzerine çubuklar çizen gösterge örneği. Çubukların rengi her N tikte rassal olarak değişir. 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_ARROW stilinin örneği

DRAW_BARS stilindeki plot1 için, renk ve boyut özelliklerinin #property derleyici direktifi kullanılarak belirlendiğini; sonrasında ise rengin, OnCalculate() fonksiyonu içinde önceden hazırlanmış bir listeden rassal olarak ayarlandığını lütfen not ediniz.

//+------------------------------------------------------------------+
//|                                                    DRAW_BARS.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_BARS stilini tanıtmak için bir gösterge"
#property description "Seçilen sembolün çubuklarını ayrı bir pencerede çizer"
#property description "Çubukların renk ve genişliği ve ayrıca sembol, her N tikten sonra"
#property description "rassal olarak değiştirilir"
 
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot Bars
#property indicator_label1  "Bars"
#property indicator_type1   DRAW_BARS
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- giriş parametreleri
input int      N=5;              // Tipin değişmesi için gereken tik sayısı
input int      bars=500;         // Gösterilecek çubuk sayısı
input bool     messages=false;   // "Uzmanlar" günlüğünde mesajları göster
//--- Gösterge tamponları
double         BarsBuffer1[];
double         BarsBuffer2[];
double         BarsBuffer3[];
double         BarsBuffer4[];
//--- Sembol ismi
string symbol;
//--- Renkleri depolayacak bir dizi
color colors[]={clrRed,clrBlue,clrGreen,clrPurple,clrBrown,clrIndianRed};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Çubuklar çok küçükse - işi planlanandan önce bitir
   if(bars<50)
     {
      Comment("Lüyfen daha fazla sayıda çubuk belirtin! Gösterge işlemi sonlandırıldı");
      return(INIT_PARAMETERS_INCORRECT);
     }
//--- gösterge tamponlarının eşlenmesi
   SetIndexBuffer(0,BarsBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,BarsBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,BarsBuffer3,INDICATOR_DATA);
   SetIndexBuffer(3,BarsBuffer4,INDICATOR_DATA);
//--- Çubukların çizileceği sembolün ismi
   symbol=_Symbol;
//--- Sembolün görünümünü ayarla
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
   IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_BARS("+symbol+")");
//--- Bir boş değer
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//---
   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++;
//--- Yeterli sayıda tik birikmişse
   if(ticks>=N)
     {
      //--- Piyasa Gözlemi penceresinden yeni bir sembol seç
      symbol=GetRandomSymbolName();
      //--- Çizgi özelliklerini değiştir
      ChangeLineAppearance();
 
      int tries=0;
      //--- Tamponları, sembolün fiyatlarıyla doldurmak için 5 deneme gerçekleştir
      while(!CopyFromSymbolToBuffers(symbol,rates_total) && tries<5)
        {
         //--- CopyFromSymbolToBuffers() fonksiyonunun çağrıları için bir sayaç
         tries++;
        }
      //--- Tik sayacını sıfırla
      ticks=0;
     }
//--- bir sonraki çağrı için prev_calculated değerine dönüş yap
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Gösterge tamponlarını fiyatlarla doldur                          |
//+------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,int total)
  {
//--- rates[] dizisinde, Open, High, Low ve Close fiyatlarını kopyalayacağız
   MqlRates rates[];
//--- Deneme sayacı
   int attempts=0;
//--- Kaç tane kopyalandı
   int copied=0;
//--- Istenen sembole dair bir zaman serisi elde etmek için 25 deneme gerçekleştir
   while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
     {
      Sleep(100);
      attempts++;
      if(messagesPrintFormat("%s CopyRates(%s) denemeler=%d",__FUNCTION__,name,attempts);
     }
//--- Yeterli sayıda çubuk kopyalanamamışsa
   if(copied!=bars)
     {
      //--- Bir mesaj dizgisinden
      string comm=StringFormat("%s sembolü için, sadece %d çubuk alınabildi (istenen %d çubuktan)",
                               name,
                               copied,
                               bars
                               );
      //--- Mesajı, ana çizelge penceresindeki bir yorumda göster
      Comment(comm);
      //--- Mesajı göster
      if(messagesPrint(comm);
      return(false);
     }
   else
     {
      //--- Sembolün görüntüsünü ayarla 
      PlotIndexSetString(0,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Close");
      IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_BARS("+name+")");
     }
//--- Tamponları boş değerlerle başlat
   ArrayInitialize(BarsBuffer1,0.0);   
   ArrayInitialize(BarsBuffer2,0.0);   
   ArrayInitialize(BarsBuffer3,0.0);   
   ArrayInitialize(BarsBuffer4,0.0);   
//--- Fiyatları tamponlara kopyala
   for(int i=0;i<copied;i++)
     {
      //--- Tamponlar için uygun indisleri hesapla
      int buffer_index=total-copied+i;
      //--- Fiyatları tamponlara yaz
      BarsBuffer1[buffer_index]=rates[i].open;
      BarsBuffer2[buffer_index]=rates[i].high;
      BarsBuffer3[buffer_index]=rates[i].low;
      BarsBuffer4[buffer_index]=rates[i].close;
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Piyasa Gözleminden rassal bir sembole dönüş yapar                |
//+------------------------------------------------------------------+
string GetRandomSymbolName()
  {
//--- Piyasa Gözleminde görünen sembollerin sayısı
   int symbols=SymbolsTotal(true);
//--- Sembolün listedeki pozisyonu - 0'dan symbols'e kadar rassal bir sayı
   int number=MathRand()%symbols;
//--- Belirtilen konumdaki sembolün ismine dönüş yap
   return SymbolName(number,true);
  }
//+------------------------------------------------------------------+
//| Çubukların görünümünü değiştirir                                 |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Çubuk özellikleri ile ilgili bilgiyi biçimlendirmek için bir dizgi
   string comm="";
//--- Çubukların renklerini 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];
 
//--- Çubuk genişliğini 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ı
//--- Rengi PLOT_LINE_WIDTH özelliği şeklinde ayarla
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Çizgi kalınlığını yaz
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- Sembol ismini yaz
   comm="\r\n"+symbol+comm;
 
//--- Bir yorum kullanarak, çizelge üzerinde bilgi göster
   Comment(comm);
  }