DRAW_COLOR_BARS

DRAW_COLOR_BARS stili Open, High, Low ve Close fiyatlarını içeren dört gösterge tamponunun temelinde çubuklar çizer. Bu stil, DRAW_BARS stilinin gelişmiş bir versiyonudur ve önceden tanımlanmış bir renk kümesi içinden, her çubuk için ayrı bir rengin belirlenmesini sağlar. 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_COLOR_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_COLOR_BARS stilinin çizimi için gereken tampon sayısı 5'tir:

  • Open, High, Low ve Close değerleri için dört tampon;
  • çubuğa çizilecek rengin indisini depolamak için bir tampon (ayarlanması, sadece çizilecek çubuklar için anlam taşır).

Çizilecek tüm tamponlar birbiri ardına, verilen sırayla dizilmelidir: Open, High, Low, Close ve renk tamponu. Fiyat tamponlarını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_COLOR_BARS stiline bir örnek

DRAW_COLOR_BARS stilindeki plot1 için, #property derleyici direktifi ile başlangıçta 8 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.

//+------------------------------------------------------------------+
//|                                              DRAW_COLOR_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_COLOR_BARS stilini betimleyen bir gösterge"
#property description "Ayrı bir penceredeki, seçilen sembolün çubuklarını farklı renklerle ç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 5
#property indicator_plots   1
//--- plot ColorBars
#property indicator_label1  "ColorBars"
#property indicator_type1   DRAW_COLOR_BARS
//--- Çubukları renklendirmek için 8 renk tanımla (özel dizide depolanırlar)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#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         ColorBarsBuffer1[];
double         ColorBarsBuffer2[];
double         ColorBarsBuffer3[];
double         ColorBarsBuffer4[];
double         ColorBarsColors[];
//--- Sembol ismi
string symbol;
int    bars_colors;
//--- Renkleri depolayacak 14 elemanlı bir dizi
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrMagenta,clrCyan,clrMediumPurple
  };
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- gösterge tamponlarının eşlenmesi
   SetIndexBuffer(0,ColorBarsBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorBarsBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorBarsBuffer3,INDICATOR_DATA);
   SetIndexBuffer(3,ColorBarsBuffer4,INDICATOR_DATA);
   SetIndexBuffer(4,ColorBarsColors,INDICATOR_COLOR_INDEX);
//---- Çubukların renklendirilmesi için kullanılacak renklerin sayısı
   bars_colors=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;
//--- Çubuğun renginin, genişliğinin ve stilinin değiştirileceği tikleri say
   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();
      //--- Mumların çizimi için kullanılan renkleri değiştir
      ChangeColors(colors,bars_colors);
      int tries=0;
      //--- Tamponları, sembolün fiyatlarıyla doldurmak için 5 deneme gerçekleştir
      while(!CopyFromSymbolToBuffers(symbol,rates_total,bars_colors) && 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,int bar_colors)
  {
//--- 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_COLOR_BARS("+name+")");
     }
//--- Tamponları boş değerlerle başlat
   ArrayInitialize(ColorBarsBuffer1,0.0);
   ArrayInitialize(ColorBarsBuffer2,0.0);
   ArrayInitialize(ColorBarsBuffer3,0.0);
   ArrayInitialize(ColorBarsBuffer4,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
      ColorBarsBuffer1[buffer_index]=rates[i].open;
      ColorBarsBuffer2[buffer_index]=rates[i].high;
      ColorBarsBuffer3[buffer_index]=rates[i].low;
      ColorBarsBuffer4[buffer_index]=rates[i].close;
      //---
      ColorBarsColors[buffer_index]=i%bar_colors;
     }
   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);
  }
//+------------------------------------------------------------------+
//| Zigzag kısımların rengini 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("BarColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Ç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="";
 
//--- Çubuk genişliğini 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 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);
  }