DRAW_COLOR_ARROW

DRAW_COLOR_ARROW stili, gösterge tamponunun değerlerine göre renkli oklar çizer, (Wingdings tipi semboller). DRAW_ARROW stilinin aksine bu stilde her bir sembolün rengi, indicator_color1 özelliği kullanılarak, önceden tanımlanmış bir dizi renk içinden seçilebilir.

Sembollerin kalınlık ve genişlikleriDRAW_ARROW 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, gösterge görünümünün değişmesini sağlar.

Sembol kodu, PLOT_ARROW özelliği kullanılarak ayarlanır.

PLOT_ARROW için varsayılan değer 159'dur (daire).

Her ok, gerçekte bir yüksekliğe ve tutturma noktasına sahip olan bir semboldür ve çizelge üzerinde bazı önemli bilgileri örtebilir (örneğin bir çubuğun kapanış fiyatı). Bu nedenle, çizelge ölçeğine bağlı olmayan, piksel bazında bir dikey kaydırmayı ayrıyeten belirtebiliriz. Bu durumda oklar, belirtilen piksel sayısı kadar aşağı kaydırılacaktır, ayrıca gösterge değeri de aynı kalacaktır:

//--- Oklar için piksel bazında dikey kaydırma ayarla
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);

PLOT_ARROW_SHIFT'in negatif değerleri, okun yukarı kaydırılacağı anlamına gelir, pozitif bir değer ise aşağı kaydırma demektir.

DRAW_COLOR_ARROW stili, bir alt pencerede veya çizelge ana penceresinde kullanılabilir. Boş değerler çizilmez ve "Veri Penceresinde" gösterilmezler; bu yüzden gösterge tamponlarındaki tüm değerler açıkça ayarlanmalıdır. Tamponlar sıfır değeri ile başlatılamazlar.

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

DRAW_COLOR_ARROW çizimi için gereken tamponların sayısı 2'dir.

  • Sembol çiziminde kullanılacak fiyat değerini depolamak için bir tampon (ayrıca, PLOT_ARROW_SHIFT özelliğinde verilen piksel bazında bir kaydırma değeri);
  • Sembol çiziminde kullanılacak renk indisini depolamak için bir tampon (sadece boş olmayan değerlerler anlamlıdır).

Bir önceki çubuğun kapanış fiyatından daha yüksek kapanış fiyatına sahip olan çubuğun üzerine ok çizen gösterge örneği Tüm okların genişlikleri, kaydırma değerleri ve sembol kodları, her N tikte bir değiştirilir. Sembolün rengi, üzerine çizildiği çubuğun numarasına bağlıdır.

DRAW_COLOR_ARROW stilinin bir örneği

DRAW_COLOR_ARROW stilindeki plot1 örneğinde, renk ve boyut özellikleri, #property derleyici direktifi kullanılarak belirlenir, sonrasında iseOnCalculate() fonksiyonunda, özellikler rassal olarak ayarlanır. 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).

#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_ARROW.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_ARROW stilini betimleyen bir gösterge"
#property description "Unicode karakterler ile, çizelge üzerinde farklı renklerde oklar çizer"
#property description "Okun rengi, genişliği, kaydırma değeri ve sembol kodu, her N tikten sonra"
#property description " rassal olarak değiştirilir"
#property description "code parametresi, temel değeri ayarlar: code=159 (daire)"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorArrow
#property indicator_label1  "ColorArrow"
#property indicator_type1   DRAW_COLOR_ARROW
//--- Haftanın günleri temelinde, histogramın renklendirilmesi için 8 renk tanımla (özel dizide depolanırlar)
#property indicator_color1  clrRed,clrBlue,clrSeaGreen,clrGold,clrDarkOrange,clrMagenta,clrYellowGreen,clrChocolate
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
 
//--- giriş parametreleri
input int      N=5;         // Değiştirilecek tik sayısı 
input ushort   code=159;    // DRAW_ARROW içinde çizilecek sembol kodu
int            color_sections;
//--- Grafik için bir gösterge tamponu
double         ColorArrowBuffer[];
//--- Renk indislerinin depolanması için bir dizi
double         ColorArrowColors[];
//--- Renkleri depolayacak 14 elemanlı bir dizi
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- gösterge tamponlarının eşlenmesi
   SetIndexBuffer(0,ColorArrowBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorArrowColors,INDICATOR_COLOR_INDEX);
//--- PLOT_ARROW içinde çizilecek sembol kodunu tanımla
   PlotIndexSetInteger(0,PLOT_ARROW,code);
//--- Oklar için piksel bazında dikey kaydırma ayarla
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,5);
//--- Boş değer 0 olarak ayarla
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);   
//---- Sinüsoidin renklendirilmesi için gereken renklerin sayısı
   color_sections=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;
//--- Rengin, boyutun, kaydırma değerinin ve sembol kodunun değiştirileceği tikleri hesapla
   ticks++;
//--- Tikler önemli bir sayıda biriktirilmişse
   if(ticks>=N)
     {
      //--- Ok özelliklerini değiştir
      ChangeLineAppearance();
      //--- Histogramın çiziminde kullanılacak renkleri değiştir
      ChangeColors(colors,color_sections);
      //--- Tik sayacını sıfırla
      ticks=0;
     }
 
//--- Gösterge değerlerinin hesaplanması için bir blok
   int start=1;
   if(prev_calculated>0) start=prev_calculated-1;
//--- Hesap döngüsü
   for(int i=1;i<rates_total;i++)
     {
      //--- mevcut Close (kapanış) fiyatı öncekinden yüksekse, bir ok çiz
      if(close[i]>close[i-1])
         ColorArrowBuffer[i]=close[i];
      //--- Aksi durumda anlamsız değer belirt
      else
         ColorArrowBuffer[i]=0;
      //--- Ok rengi
      int index=i%color_sections;
      ColorArrowColors[i]=index;
     }
//--- bir sonraki çağrı için prev_calculated değerine dönüş yap
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Çizgi 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("ArrowColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Göstergenin görüntülenen çizgisinin görünümünü değiştirir        |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Çizgi özelliklerine dair bilginin biçimlendirilmesi için bir dizgi
   string comm="";
//--- Çizgi kalınlığını 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 ayarlanır
//--- Rengi PLOT_LINE_WIDTH özelliği şeklinde ayarla
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Çizgi kalınlığını yaz
   comm=comm+" Width="+IntegerToString(width);
   
//--- Ok kodunu (PLOT_ARROW) değiştirmek için bir blok 
   number=MathRand();
//--- Yeni ok kodunu hesaplamak için tam-sayı bölümünden kalanı al (0'dan 19'a)
   int code_add=number%20;
//--- code+code_add işleminin sonucu olarak yeni sembol kodunu ayarla
   PlotIndexSetInteger(0,PLOT_ARROW,code+code_add);
//--- PLOT_ARROW sembol kodunu yaz
   comm="\r\n"+"PLOT_ARROW="+IntegerToString(code+code_add)+comm;   
 
//--- Okların dikey kaydırma değerini piksel bazında değiştirmek için bir blok
   number=MathRand();
//--- Kaydırma değerini tamsayı bölümünün kalanı olarak al
   int shift=20-number%41;
//--- Yeni kaydırma değerini şuradan ayarla
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);
//--- PLOT_ARROW_SHIFT kaydırma değerini yaz
   comm="\r\n"+"PLOT_ARROW_SHIFT="+IntegerToString(shift)+comm;
 
//--- Bir yorum kullanarak, çizelge üzerinde bilgi göster
   Comment(comm);
  }