DRAW_ARROW

DRAW_ARROW stili, gösterge değerindeki değere bağlı olarak, belirtilen renkte oklar çizer (Wingdings semboller kümesi). Sembollerin kalınlık ve genişlikleri DRAW_LINE stiline benzer şekilde belirtilebilir - derleyici direktifleri ile veya dinamik olarak PlotIndexSetInteger() fonksiyonunun kullanımıyla. Ç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'da çizmek için Wingdings yazı tipinden bir sembolün kodunu tanımla
   PlotIndexSetInteger(0,PLOT_ARROW,code);

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_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_ARROW,PLOT_EMPTY_VALUE,0);

DRAW_ARROW stilini çizmek için gereken tampon sayısı 1'dir.

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 renkleri, genişlikleri, kaydırma değerleri ve sembol kodları, her N tikte bir rassal olarak değişir.

DRAW_ARROW stilinin örneği

DRAW_ARROW stilindeki plot1 örneğinde, renk ve boyut özellikleri, #property derleyici direktifi kullanılarak belirlenir, sonrasında ise OnCalculate() 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).

//+------------------------------------------------------------------+
//|                                                   DRAW_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_ARROW stilini tanıtmak için bir gösterge"
#property description "Unicode karakteriyle, çizelge üzerinde 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 1
#property indicator_plots   1
//--- grafik Histogram
#property indicator_label1  "Arrows"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrGreen
#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
//--- Grafik için bir gösterge tamponu
double         ArrowsBuffer[];
//--- Renkleri depolayacak bir dizi
color colors[]={clrRed,clrBlue,clrGreen};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- gösterge tamponlarının eşlenmesi
   SetIndexBuffer(0,ArrowsBuffer,INDICATOR_DATA);
//--- 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);
//---
   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)
     {
      //--- Çizgi özelliklerini değiştir
      ChangeLineAppearance();
      //--- 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])
         ArrowsBuffer[i]=close[i];
      //--- Aksi durumda sıfır değeri ayarla
      else
         ArrowsBuffer[i]=0;
     }
//--- bir sonraki çağrı için prev_calculated değerine dönüş yap
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Sembollerin göstergedeki görünümünü değiştir                     |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Gösterge özellikleri hakkında alınan bilgiyi biçimlendirmek için bir dize
   string comm="";
//--- Ok rengini 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];
 
//--- Okların boyutunu değiştirmek için bir blok
   number=MathRand();
//--- Tam-sayı bölümden kalan genişliği al
   int width=number%5;   // Boyut 0'dan 4'e ayarlandı
//--- Rengi PLOT_LINE_WIDTH özelliği şeklinde ayarla
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Ok boyutunu yaz
   comm=comm+"\r\nWidth="+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 -20'den 20'ye 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);
  }