OnCalculate

Fonksiyon, fiyat veri değişikliklerini işlemek için Calculate olayı oluştuğunda göstergelerde çağrılır. İki fonksiyon tipi vardır. Bir göstergede, sadece onlardan biri kullanılabilir.

Veri dizisine dayalı hesaplama

int  OnCalculate(
   const int        rates_total,       // fiyat[] dizisi boyutu
   const int        prev_calculated,   // önceki çağrıda yönetilen bar sayısı
   const int        begin,             // Anlamlı verilerin başladığı fiyat dizisi endeks numarası
   const double&    price[]            // hesaplama için değer dizisi
   );

Mevcut zaman aralığının zaman serilerine bağlı hesaplamalar

int  OnCalculate(
   const int        rates_total,       // girdi zaman serilerinin boyutu
   const int        prev_calculated,   // önceki çağrıda yönetilen bar sayısı
   const datetime&  time[],            // Açılış zamanı dizisi
   const double&    open[],            // Açılış fiyat dizisi
   const double&    high[],            // Yüksek fiyat dizisi
   const double&    low[],             // Düşük fiyat dizisi
   const double&    close[],           // Kapanış fiyat dizisi
   const long&      tick_volume[],     // Tik Hacim dizisi
   const long&      volume[],          // Gerçek hacim dizisi
   const int&       spread[]           // Spread dizisi
   );

Parametreler

rates_total

[in]  Hesaplama için göstergeye uygun fiyat[] dizisi veya girdi serilerinin boyutu. İkinci fonksiyon tipinde; parametre değeri, çalıştığı grafikteki bar sayısına karşılık gelir.

prev_calculated

[in] Önceki çağrı sırasında, OnCalculate() fonksiyonu tarafından geri döndürülmüş değeri içerir. Bu durum, fonksiyonun önceki çalışmasından beri değişmemiş olan barların atlanması için tasarlanmıştır.

begin

[in]  Anlamlı verilerin başladığı fiyat dizisi endeks değeri. Bu durum, doğru değeri olmayan kayıp veya başlangıç verilerini atlamanıza izin verir.

price[]

[in]  hesaplama için değer dizisi. Fiyat zaman serilerinin biri veya bir hesaplanmış gösterge ara belleği, fiyat[] dizisi olarak geçirilebilir. Hesaplama için geçirilen veri türü _AppliedTo önceden tanımlanmış değişkeni kullanılarak tanımlanabilir.

time{}

[in]  Bar açılış zaman değerlerini içeren dizi.

open[]

[in]  Açılış(Open) fiyat değerlerini içeren dizi.

high[]

[in]  Yüksek(High) fiyat değerlerini içeren dizi.

low[]

[in]  Düşük(Low) fiyat değerlerini içeren dizi.

close[]

[in]  Kapanış(Close) fiyat değerlerini içeren dizi.

tick_volume[]

[in]  Tik hacim değerlerini içeren dizi.

volume[]

[in]  Alım-satım hacim(Real volume) değerlerini içeren dizi.

spread[]

[in]  Barların spread değerlerini içeren dizi.

Geri dönüş değeri

Bir sonraki fonksiyon çağrısı sırasında prev_calculated parametresi olarak geçirilecek int tip değeri.

Not

Eğer OnCalculate() fonksiyonu sıfıra eşitse, müşteri terminalinin DataWindow bölümünde hiçbir gösterge değeri gösterilmez.

Eğer fiyat verisi OnCalculate() fonksiyonunun son çağrısından beri değiştirilmişse (daha derin bir geçmiş yüklendi veya geçmişteki fiyat boşluğu doldu), prev_calculated girdi parametresinin değeri terminalin kendisi tarafından sıfıra ayarlanır.

time[], open[], high[], low[], close[], tick_volume[], volume[] ve spread[] dizileri arasında indeksleme yönünü belirlemek için, ArrayGetAsSeries() fonksiyonunu çağırın. Varsayılanlara bağlı olmamak için, ArraySetAsSeries() fonksiyonunu çalışılacak olan diziler için çağırın.

İlk fonksiyon tipinin kullanımında; gösterge çalıştırılırken parametre sekmesindeki -gerekli zaman serileri yada gösterge- ayarı, bir kullanıcı tarafından fiyat[] dizisi olarak seçilir. Bunu yapmak için, "Apply to" alanının açılır listesinde gerekli elemanları belirtin.

Diğer MQL5 programlarından özel gösterge değerlerini almak için, iCustom() fonksiyonu kullanılır. Sonraki operasyonlar için gösterge yönetimini geri döndürür. Ayrıca, gerekli fiyat [] dizisini veya farklı bir göstergenin yönetimini belirtmekte mümkündür. Bu parametre, bir özel göstergenin girdi değişkenleri listesinde en son geçmelidir.

OnCalculate() fonksiyonu tarafından ve prev_calculated ikinci girdi parametresi tarafından geri döndürülen değerler arasındaki bağlantıyı kullanmak gereklidir. Fonksiyonu çağırırken, prev_calculated parametresi bir önceki çağrı sırasında OnCalculate() fonksiyonu tarafından geri döndürülen değeri içerir. Bu durum, fonksiyonun bir önceki çalışmasından beri değişmemiş olan barlar için tekrarlayan hesaplamaları önlemek amacıyla, özel bir göstergenin hesaplanması adına kaynak koruyucu algoritmaların uygulanmasını mümkün kılar.

 

Örnek gösterge

//+------------------------------------------------------------------+
//|                                           OnCalculate_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Örnek Momentum göstergesi hesaplaması"
 
//---- gösterge ayarları
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
//---- girdiler
input int MomentumPeriod=14; // Hesaplama zaman aralığı
//---- gösterge arabelleği
double    MomentumBuffer[];
//--- Hesaplama zaman aralığını saklamak için global değişkenler
int       IntPeriod;
//+------------------------------------------------------------------+
//| Özel gösterge başlatma fonksiyonu                                |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- girdi parametrelerini kontrol et
   if(MomentumPeriod<0)
     {
      IntPeriod=14;
      Print("Zaman aralığı parametresi yanlış bir değere sahiptir. Aşağıdaki değer hesaplamalar için kullanılacaktır ",IntPeriod);
     }
   else
      IntPeriod=MomentumPeriod;
//---- arabellekler  
   SetIndexBuffer(0,MomentumBuffer,INDICATOR_DATA);
//---- DataWindow ve alt pencerede görüntülenecek gösterge ismi
   IndicatorSetString(INDICATOR_SHORTNAME,"Momentum"+"("+string(IntPeriod)+")");
//--- çizilmeye oradan başlanacak olan barın indeksini ayarla
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,IntPeriod-1);
//--- çizilmeyen boş bir değer olarak 0.0'ı ayarla
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//--- görüntülenecek gösterge hassasiyeti
   IndicatorSetInteger(INDICATOR_DIGITS,2);
  }
//+------------------------------------------------------------------+
//|  Momentum gösterge hesaplaması                                   |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,     // fiyat[] dizisi boyutu 
                const int prev_calculated, // önceki yönetilen bar sayısı
                const int begin,           // anlamlı verilerin başladığı yer 
                const double &price[])     // yönetim için veri dizisi
  {
//--- hesaplamalar için başlangıç pozisyonu
   int StartCalcPosition=(IntPeriod-1)+begin;
//---- eğer hesaplama verisi yetersizse
   if(rates_total<StartCalcPosition)
      return(0);  // sıfır değeri ile çık - gösterge hesaplanmaz
//--- doğru çizim başlar
   if(begin>0)
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartCalcPosition+(IntPeriod-1));
//--- hesaplamayı başlat, başlangıç pozisyonunu tanımla
   int pos=prev_calculated-1;
   if(pos<StartCalcPosition)
      pos=begin+IntPeriod;
//--- ana hesaplama döngüsü
   for(int i=pos;i<rates_total && !IsStopped();i++)
      MomentumBuffer[i]=price[i]*100/price[i-IntPeriod];
//--- OnCalculate gerçekleşimi tamamlandı. Sonraki çağrı için yeni prev_calculated değerini geri döndür
   return(rates_total);
  }

Ayrıca bakınız

ArrayGetAsSeries, ArraySetAsSeries, iCustom, Olay yönetimi fonksiyonları, Program yürütme, Müşteri terminali olayları, Zaman serilerine ve göstergelere eriş