DRAW_COLOR_CANDLES

The DRAW_COLOR_CANDLES stili, DRAW_CANDLES stili gibi; Open, High, Low ve Close fiyatlarını içeren dört gösterge tamponunun değerlerini kullanarak mumlar çizer. Ayrıca, her bir mumun renginin verilen bir küme içerisinden seçilmesine olanak tanır. Bu amaçla stil, her bir çubuk için kullanılacak rengin indisini depolayan özel bir tampon içerir. Ayrı bir çizelge alt penceresinde yer alanlar ve diğer finansal araçlar da dahil olmak üzere, mum şeklinde göstergeler oluşturulması için tasarlanmıştır.

Mum renklerinin sayısı, 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 fiyat tamponundan hiçbirinin boş değer içermediği çubuklar için ayarlanır. Bir değerin "boş" olacağını belirtmek için, değeri PLOT_EMPTY_VALUE özelliğiyle ayarlayın:

//--- 0 (boş) değer, çizime katılmayacak
   PlotIndexSetDouble(çizim_indisi_DRAW_COLOR_CANDLES,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_CANDLES stilinin çizimi için gereken tamponların 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 mumlar çizen gösterge örneği. Mumları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_CANDLES stiline bir örnek

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_COLOR_CANDLES.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_CANDLES stilini betimlemek için bir gösterge."
#property description "Seçilen sembolün mumlarını ayrı bir pencerede çizer"
#property description " "
#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 ColorCandles
#property indicator_label1  "ColorCandles"
#property indicator_type1   DRAW_COLOR_CANDLES
//--- Mumları 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 mumların sayısı
input bool     messages=false;   // "Uzmanlar" günlüğünde mesajları göster
//--- Gösterge tamponları
double         ColorCandlesBuffer1[];
double         ColorCandlesBuffer2[];
double         ColorCandlesBuffer3[];
double         ColorCandlesBuffer4[];
double         ColorCandlesColors[];
int            candles_colors;
//--- Sembol ismi
string symbol;
//--- 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()
  {
//--- Ç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,ColorCandlesBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorCandlesBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorCandlesBuffer3,INDICATOR_DATA);
   SetIndexBuffer(3,ColorCandlesBuffer4,INDICATOR_DATA);
   SetIndexBuffer(4,ColorCandlesColors,INDICATOR_COLOR_INDEX);
//--- Bir boş değer
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Ç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_COLOR_CANDLES("+symbol+")");
//---- Mumların renklendirilmesi için gereken renklerin sayısı
   candles_colors=8;     //   #property indicator_color1 özelliğindeki yoruma bakınız
//--- 
   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=INT_MAX-100;
//--- Stili ve rengi değiştirmek için tikleri say
   ticks++;
//--- Yeterli sayıda tik birikmişse
   if(ticks>=N)
     {
      //--- Piyasa Gözlemi penceresinden yeni bir sembol seç
      symbol=GetRandomSymbolName();
      //--- Biçimi değiştir
      ChangeLineAppearance();
      //--- Mumların çizimi için kullanılan renkleri değiştir
      ChangeColors(colors,candles_colors);
 
      int tries=0;
      //--- plot1 tamponlarını, sembolün fiyatlarıyla doldurmak için 5 deneme yap
      while(!CopyFromSymbolToBuffers(symbol,rates_total,0,
            ColorCandlesBuffer1,ColorCandlesBuffer2,ColorCandlesBuffer3,
            ColorCandlesBuffer4,ColorCandlesColors,candles_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);
  }
//+------------------------------------------------------------------+
//| Belirtilen mumu doldurur                                         |
//+------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,
                             int total,
                             int plot_index,
                             double &buff1[],
                             double &buff2[],
                             double &buff3[],
                             double &buff4[],
                             double &col_buffer[],
                             int    cndl_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(messages) Print(comm);
      return(false);
     }
   else
     {
      //--- Sembolün görüntüsünü ayarla 
      PlotIndexSetString(plot_index,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Close");
      IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_COLOR_CANDLES("+symbol+")");
     }
//--- Tamponları boş değerlerle başlat
   ArrayInitialize(buff1,0.0);
   ArrayInitialize(buff2,0.0);
   ArrayInitialize(buff3,0.0);
   ArrayInitialize(buff4,0.0);
//--- Her tik ile birlikte 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
      buff1[buffer_index]=rates[i].open;
      buff2[buffer_index]=rates[i].high;
      buff3[buffer_index]=rates[i].low;
      buff4[buffer_index]=rates[i].close;
      //--- Mum rengini ayarla
      int color_index=i%cndl_colors;
      col_buffer[buffer_index]=color_index;
     }
   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);
  }
//+------------------------------------------------------------------+
//| Mum 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("CandleColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Mumların görünümünü değiştirir                                   |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Mum özelliklerine dair bilginin biçimlendirilmesi için bir dizgi
   string comm="";
//--- Sembol ismini yaz
   comm="\r\n"+symbol+comm;
//--- Bir yorum kullanarak, çizelge üzerinde bilgi göster
   Comment(comm);
  }