Özel Göstergeler

Özel göstergelerin tasarımında kullanılan grup fonksiyonları. Bu fonksiyonlar, Uzman Danışmanların ve script dosyalarının yazımında kullanılamaz.

Fonksiyon

Eylem

SetIndexBuffer

Belirtilen gösterge tamponunu, tek boyutlu, double tipli dinamik bir diziye bağlar

IndicatorSetDouble

double tipi gösterge özelliğinin değerini ayarlar

IndicatorSetInteger

int tipi gösterge özelliğinin değerini ayarlar

IndicatorSetString

string tipi gösterge özelliğinin değerini ayarlar

PlotIndexSetDouble

double tipi gösterge çizgisi özelliğinin değerini ayarlar

PlotIndexSetInteger

int tipi gösterge çizgisi özelliğinin değerini ayarlar

PlotIndexSetString

string tipi gösterge çizgisi özelliğinin değerini ayarlar

PlotIndexGetInteger

tam-sayı tipli gösterge çizgisi özelliğinin değerine dönüş yapar

Gösterge özellikleri, derleyici direktiflerini veya fonksiyonları kullanılarak ayarlanabilir. Bunu daha iyi anlamanız için, örneklerdeki gösterge stilleri üzerinde çalışmanız tavsiye edilir.

Bir özel gösterge için gereken tüm hesaplamalar, ön tanımlı OnCalculate() fonksiyonu içinde yer almalıdır. Eğer, OnCalculate() fonksiyonunun kısa biçimdeki çağrısını kullanıyorsanız

int OnCalculate (const int rates_total,      // price[] dizisinin büyüklüğü

burada rates_total değişkeni, gösterge değerlerinin hesaplanması için parametre olarak fonksiyona geçirilen price[] dizisindeki, toplam eleman sayısını belirtir.

prev_calculated parametresi, OnCalculate() fonksiyonunun bir önceki çağrıdaki uygulama sonucudur; gösterge değerlerinin hesaplanması için algoritmanın düzenlenmesini ve saklanmasını sağlar. Örneğin mevcut değerle rates_total = 1000, prev_calculated = 999 ise, her gösterge tamponunun sadece bir değeri için hesaplama yapmamız yeterli olabilir.

Eğer "price" dizisinin büyüklüğü ile ilgili bilgi mevcut olmasaydı, bu durumda, her bir gösterge tamponu için 1000 değerin hesaplanması gerekliliği ortaya çıkarırdı. OnCalculate() fonksiyonunun ilk çağrısında, prev_calculated = 0 olarak verilir. Eğer price[] dizisi bir şekilde değişmişse, bu durumda prev_calculated değeri 0'a eşit olur.

begin parametresi, price dizisindeki başlangıç değerlerinin sayısını verir; hesaplanabilir veri içermez. Örneğin, Accelerator Oscillator (ilk 37 değerin hesaplanmadığı) göstergesinin değerleri, giriş parametresi olarak kullanılırsa, begin = 37 olur. Örnek olarak, basit bir göstergeyi düşünelim:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- gösterge tamponları
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- gösterge tamponlarının eşlenmesi
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
 
  {
//---
   Print("begin = ",begin,"  prev_calculated = ",prev_calculated,"  rates_total = ",rates_total);
//--- bir sonraki çağrı için prev_calculated değerine dönüş yap
   return(rates_total);
  }

Bunu "Klavuz" penceresinden Accelerator Oscillator göstergesinin penceresine sürükleyelim ve hesaplamaların, mevcut (önceki) bir göstergenin değerleriyle yapılacağını belirtelim:

Daha önce eklenmiş bir göstergenin değerleri ile başka bir göstergenin hesaplanması

Sonuç olarak prev_calculated değeri, OnCalculate() fonksiyonunun ilk çağrısında sıfıra, daha sonraki çağrılarda ise (fiyat çizelgesinde bulunan çubukların sayısı değişene kadar) rates_total değerine eşit olacaktır.

'begin' parametresi, değerlerin alındığı başlangıç çubuklarının sayısını gösterir.

'begin' parametresinin değeri tam olarak başlangıçtaki çubuklarının sayısına eşittir ve Accelerator göstergesinin mantığına göre bu çubukların değerleri hesaplamaya katılmayacaktır. Accelerator.mq5 özel göstergesinin kaynak koduna bakacak olursak, OnInit() fonksiyonundaki şu satırları görürüz:

//--- çizime hangi çubuğun indisinden başlanacağını ayarlar
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,37);

PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, empty_first_values) fonksiyonunu kullanarak, gösterge tamponunun sıfır indisli dizisindeki var olmayan, (empty_first_values) yani hesaplamaya katılmayacak ilk değerlerin sayısını ayarlarız. Bu şekilde, aşağıdaki mekanizmalara sahip oluruz:

  1. başka bir göstergenin hesaplanmasında kullanılmaması gereken başlangıç değerlerinin sayısının ayarlanması;
  2. başka bir özel göstergenin çağrılması durumunda, gözardı edilecek ilk değerlerin sayısına dair bilginin edinilmesi.