DRAW_SECTION

DRAW_SECTION stili, gösterge tamponunun değerlerine göre, kısımlar (parçalar) çizer. Çizgilerin kalınlık, renk ve stilleri, DRAW_LINE stiline benzer şekilde, (derleyici direktifleri ile veya dinamik olarak PlotIndexSetInteger() fonksiyonunun kullanımıyla) belirtilebilir. Ç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.

Parçalar (kısımlar), gösterge tamponunun boş olmayan bir değerinden, yine boş olmayan bir değerine kadar çizilir ve boş değerler gözardı edilir. Bir değerin "boş" olarak göz önüne alınacağını belirtmek için, bu değeri PLOT_EMPTY_VALUE özelliği ile ayarlayın: Örneğin, gösterge, sıfır olmayan değerler üzerindeki parçalardan oluşan bir dizi şeklinde çizilecekse, sıfır değerini boş değer olarak ayarlamalısınız:

//--- 0 (boş) değer, çizime katılmayacak
   PlotIndexSetDouble(çizim_indisi_DRAW_SECTION,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_SECTION stilinin çizilmesi için gereken tampon sayısı 1'dir.

High ve Low fiyatların arasında parçalar çizen gösterge örneği. Tüm parçaların renkleri, genişlikleri ve stilleri, her N tikte bir değişir.

DRAW_SECTION stiline bir örnek

DRAW_SECTION stiline sahip plot1 için, özelliklerin başlangıçta #property derleyici direktifi kullanılarak belirlendiğini; sonrasında ise üç özelliğin, OnCalculate() fonksiyonu içinde önceden hazırlanmış bir listeden rassal olarak ayarlandığını lütfen not ediniz. 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_SECTION.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_SECTION stilini betimleyen bir gösterge"
#property description "Her bars çubuk üzerine düz parçalar çizer"
#property description "Parçaların renk, genişlik ve stilleri, her N tikten sonra"
#property description "rassal olarak değiştirilir"
 
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Section
#property indicator_label1  "Section"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- giriş parametreleri
input int      bars=5;           // Parçaların çubuk bazında uzunluğu
input int      N=5;              // Parçaların stillerinin değiştirileceği tik sayısı
//--- Grafik için bir gösterge tamponu
double         SectionBuffer[];
//--- Parçaların sonlarını hesaplamak için ek bir değişken
int            divider;
//--- Renkleri depolayacak bir dizi
color colors[]={clrRed,clrBlue,clrGreen};
//--- Çizgi stillerinin depolanması için bir dizi
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Gösterge tamponunun dizi ile bağlanması
   SetIndexBuffer(0,SectionBuffer,INDICATOR_DATA);
//--- 0 (boş) değer, çizime katılmayacak
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Gösterge parametresini kontrol et
   if(bars<=0)
     {
      PrintFormat("Hatalı parametre değeri bar=%d",bars);
      return(INIT_PARAMETERS_INCORRECT);
     }
   else divider=2*bars;
//---+
   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;
//--- Çizginin stilini,rengini ve genişliğini değiştirmek için 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 hesaplanmaya başlanacağı çubuğun numarası
   int start=0;
//--- Gösterge daha önce hesaplanmışsa, başlangıcı bir önceki çubuğa al
   if(prev_calculated>0) start=prev_calculated-1;
//--- Burada göstergenin tüm değerleri hesaplanır
   for(int i=start;i<rates_total;i++)
     {
      //--- çubuk sayısının 2*bars değerine bölümünden kalanı al
      int rest=i%divider;
      //--- Eğer sayı 2*bars değerine bölünebiliyorsa
      if(rest==0)
        {
         //--- Parçanın sonunu bu çubuğun High (yüksek) fiyatına ayarla
         SectionBuffer[i]=high[i];
        }
      //---Bölümden kalan 'bars' değerine eşitse, 
      else
        {
         //--- Parçanın sonunu bu çubuğun High (yüksek) fiyatına ayarla
         if(rest==bars) SectionBuffer[i]=low[i];
         //--- Hiçbir değişim olmadıysa çubuğu gözardı et - 0 olarak ayarla
         else SectionBuffer[i]=0;
        }
     }
//--- Fonksiyonun sonraki çağrıları için prev_calculated değerine dönüş yap
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Göstergedeki parçaların görünümünü değiştirir                    |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Çizgi özelliklerine dair bilginin biçimlendirilmesi için bir dizgi
   string comm="";
//--- Çizgi renginin değişimi 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];
 
//--- Çizgi kalınlığını değiştirmek için bir blok
   number=MathRand();
//--- Tam-sayı bölümden kalan genişliği al
   int width=number%5;   // Genişlik 0'dan 4'e ayarlandı
//--- Kalınlığı ayarla
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Çizgi kalınlığını yaz
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- Çizgi stilini değiştirmek için bir blok
   number=MathRand();
//--- Bölen, syles dizisinin büyüklüğüne eşit
   size=ArraySize(styles);
//--- Yeni bir stil seçmek için, indis değerini, bölümden kalan tam-sayı değeri şeklinde al
   int style_index=number%size;
//--- Çizgi stilini ayarla
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Çizgi stilini yaz
   comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Bir yorum kullanarak, çizelge üzerinde bilgi göster
   Comment(comm);
  }