DRAW_CANDLES

DRAW_CANDLES stili Open, High, Low ve Close fiyatlarını içeren dört gösterge tamponunu temel alarak mum şekilli çubuklar çizer. 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.

Mumların renkleri derleyici direktifleri ile veya dinamik olarak PlotIndexSetInteger() fonksiyonu ile ayarlanabilir. Çizim özelliklerinin dinamik olarak değiştirilmesi göstergelerin "canlılaşması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 bayrağı ile ayarlayın:

//--- 0 (boş) değer, çizime katılmayacak
   PlotIndexSetDouble(çizim_indisi_DRAW_CANDLES,PLOT_EMPTY_VALUE,0);

Gösterge tamponlarını her zaman açık şekilde doldurun, atlamak istediğiniz çubukları boş değer olarak ayarlayın.

DRAW_CANDLES stili için gereken tampon sayısı 4'tür. Çizilecek tüm tamponlar birbiri ardına ve varsayılan sırayla dizilmelidir: Open, High, Low ve Close. Tamponların hiçbiri baştan sona boş değerler içeremez, zira böyle bir durumda hiçbir şey çizilmeyecektir.

DRAW_CANDLES stilinde mumların görünümünü için üç farklı renk ayarlayabilirsiniz. Sadece bir renk ayarlanması durumunda tüm mumlar belirtilen bu renkle çizilir.

//--- tek renk ile çizilen eş-biçiçmli mumlar
#property indicator_label1  "One color candles"
#property indicator_type1   DRAW_CANDLES
//--- sadece bir renk belirtildiği için tüm mumlar aynı renk ile çizilecek
#property indicator_color1  clrGreen  

Virgülle ayrılmış iki renk belirtilir, birincisi dış-hatlara yani şamdana, ikincisi ise mum gövdesine uygulanır.

//--- şamdanlar ve mumlar için farklı renkler
#property indicator_label1  "Two color candles"
#property indicator_type1   DRAW_CANDLES
//--- burada yeşil renk şamdana, beyaz ise mum gövdesine uygulanır
#property indicator_color1  clrGreen,clrWhite 

Virgülle ayrılmış üç renk belirtilmesi durumunda yükselen ve düşen mumlar farklı renklerle çizilir. Bu durumda ilk renk dış hatlara uygulanırken diğer ikisi sırasıyla boğa ve ayı mumlarına uygulanır.

//--- şamdanlar ve mumlar için farklı renkler
#property indicator_label1  "One color candles"
#property indicator_type1   DRAW_CANDLES
//--- şamdan rengi yeşil, boğa mumu beyaz, ayı mumu kırmızı
#property indicator_color1  clrGreen,clrWhite,clrRed

DRAW_CANDLES stili, bu şekilde özel renklendirme seçenekleri oluşturmanızı sağlar. Ayrıca tüm renkler PlotIndexSetInteger (composition_index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_index, color) fonksiyonu ile dinamik olarak değiştirilebilir; burada modifier_index şu değerleri alabilir:

  • 0 – mumların ve dış hatlarının rengi
  • 1– boğa mumunun rengi
  • 2 – ayı mumunun rengi

//--- mumların ve dış hatlarının rengini ayarla
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
//--- boğa mumunun rengini ayarla
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
//--- ayı mumunun rengini ayarla
PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);

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_CANDLES stilinin bir örneği

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_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_CANDLES stilini tanıtmak 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 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  "DRAW_CANDLES1"
#property indicator_type1   DRAW_CANDLES
#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         Candle1Buffer1[];
double         Candle1Buffer2[];
double         Candle1Buffer3[];
double         Candle1Buffer4[];
//--- 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ütfen 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,Candle1Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Candle1Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,Candle1Buffer3,INDICATOR_DATA);
   SetIndexBuffer(3,Candle1Buffer4,INDICATOR_DATA);
//--- 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_CANDLES("+symbol+")");
//---
   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;
//--- Ç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();
      //--- Biçimi değiştir
      ChangeLineAppearance();
      //--- Piyasa Gözlemi penceresinden yeni bir sembol seç
      int tries=0;
      //--- plot1 tamponlarını sembolün fiyatlarıyla doldurmak için 5 deneme yap
      while(!CopyFromSymbolToBuffers(symbol,rates_total,0,
            Candle1Buffer1,Candle1Buffer2,Candle1Buffer3,Candle1Buffer4)
            && 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[]
                             )
  {
//--- rates[] dizisinde, Open, High, Low ve Close fiyatlarını kopyalayacağız
   MqlRates rates[];
//--- Deneme sayacı
   int attempts=0;
//--- Kaç tane kopyalandı
   int copied=0;
//--- İstenen 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 dizgisi oluştur
      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(plot_index,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Close");
     }
//--- 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;
     }
   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]);
//--- Rengi yaz
   comm=comm+"\r\n"+(string)colors[color_index];
//--- Sembol ismini yaz
   comm="\r\n"+symbol+comm;
//--- Bir yorum kullanarak çizelge üzerinde bilgi göster
   Comment(comm);
  }