CopyBuffer

Belirtilen bir göstergenin belirtilen bir tamponundan gereken miktarda veri alır.

copyBuffer

Kopyalanan verinin elemanlarının (buffer_num indisine sahip tamponu) sayılması şimdiden geçmişe doğru gerçekleşir, yani 0 başlangıç konumu mevcut çubuk anlamına gelir.

Bilinmeyen miktardaki bir veriyi kopyalarken, buffer[] alıcı tamponu için dinamik dizilerin kullanılması önerilir; çünkü CopyBuffer() fonksiyonu, alıcı diziye, kopyalanan verinin büyüklüğü kadar bellek tahsis etmeye çalışacaktır. Eğer bir gösterge tamponu (SetIndexBufer() fonksiyonu ile değerlerini saklamak için önceden tahsis edilen dizi), buffer[] alıcı dizisi olarak kullanılıyorsa, kısmi kopyalamaya izin verilir. Bu duruma bir örnek, terminal standart paketindeki Awesome_Oscillator.mql5 özel göstergesinde bulunabilir.

Bir gösterge tamponunun değerlerini kısmen başka bir diziye kopyalamak istiyorsanız (gösterge tamponu olmayan bir diziye), istenen verinin kopyalanacağı bir ara dizi kullanmalısınız. Ardından, istenen sayıdaki değeri, alıcı dizinin istenen yerlerine elementsel olarak kopyalayın.

Eğer kopyalayacağınız verinin tam miktarını biliyorsanız, aşırı bellek tahsisini önlemek amacıyla statik olarak tahsis edilmiş bir tampon kullanmanız daha iyi olacaktır.

Hedef dizisinin erişim özelliğinin ne olduğu önem taşımaz - as_series=true veya as_series=false. Veri, en eski elemanın tahsis edilen fiziksel belleğin başlangıcında konumlanacağı şekilde yerleştirilir. Bu fonksiyonun 3 çağrı şekli bulunmaktadır.

İlk pozisyon ve istenen eleman sayısı ile çağrı

int  CopyBuffer(
   int       indicator_handle,     // gösterge tanıtıcı değeri
   int       buffer_num,           // gösterge tamponunun numarası
   int       start_pos,            // başlangıç pozisyonu
   int       count,                // kopyalanacak veri miktarı
   double    buffer[]              // hedef dizi
   );

Başlangıç tarihi ve istenen eleman sayısı ile çağrı

int  CopyBuffer(
   int       indicator_handle,     // gösterge tanıtıcı değeri
   int       buffer_num,           // gösterge tamponunun numarası
   datetime  start_time,           // başlangıç tarihi ve zamanı
   int       count,                // kopyalanacak veri miktarı
   double    buffer[]              // hedef dizi
   );

İstene aralığın başlangıç ve bitiş tarihi ile çağrı

int  CopyBuffer(
   int       indicator_handle,     // gösterge tanıtıcı değeri
   int       buffer_num,           // gösterge tamponunun numarası
   datetime  start_time,           // başlangıç tarihi ve zamanı
   datetime  stop_time,            // son tarih ve zaman
   double    buffer[]              // hedef dizi
   );

Parametreler

indicator_handle

[in]  Karşılık gelen fonksiyonla dönüşü yapılan gösterge tanıtıcı değeri.

buffer_num

[in]  Gösterge tamponunun numarası.

start_pos

[in]  Kopyalanacak ilk elemanın konumu.

count

[in]  Kopyalanacak veri miktarı.

start_time

[in]  İlk elemana denk gelen çubuk zamanı.

stop_time

[in]  Son elemana denk gelen çubuk zamanı.

buffer[]

[out] double tipli dizi.

Dönüş değeri

Kopyalanan veri sayısına veya hata durumunda -1 değerine dönüş yapar.

Not

Bir göstergeden veri istenirken, istenen zaman-serisi henüz kurulmamışsa veya sunucudan yüklenmemişse, fonksiyon hemen -1 dönüşü yapacaktır ve yükleme/kurma işlemi başlatılacaktır.

Bir Uzman Danışmandan veya bir scriptten veri istenirken, istenen veri terminalde yerel olarak bulunmuyorsa sunucudan yükleme işlemi başlatılacaktır, eğer veri kurulu durumdaysa ama hazır değilse, o zaman serinin kurulumuna başlanacaktır. Varsayılan zaman-aşımı süresi geçildiğinde, fonksiyon hazır olan verinin miktarına dönüş yapacaktır.

Örnek:

//+------------------------------------------------------------------+
//|                                              TestCopyBuffer3.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot MA
#property indicator_label1  "MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- giriş parametreleri
input bool               AsSeries=true;
input int                period=15;
input ENUM_MA_METHOD     smootMode=MODE_EMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int                shift=0;
//--- gösterge tamponları
double                   MABuffer[];
int                      ma_handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- gösterge tamponlarının eşlenmesi
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   Print("Parametre AsSeries = ",AsSeries);
   Print("SetIndexBuffer() çağrısından sonra gösterge tamponu bir zaman-serisi = ",
         ArrayGetAsSeries(MABuffer));
//--- gösterge kısa ismini ayarla
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//--- AsSeries(giriş parametrelerine bağlı olarak) çağrısını ayarla
   ArraySetAsSeries(MABuffer,AsSeries);
   Print("ArraySetAsSeries(MABuffer,true) çağrısından sonra gösterge tamponu bir zaman-serisi = ",
         ArrayGetAsSeries(MABuffer));
//---
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
   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[])
  {
//--- tüm veriler hesaplanmış mı kontrol et
   if(BarsCalculated(ma_handle)<rates_total) return(0);
//--- tüm verileri kopyalayamayız
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      //--- son değer her zaman kopyalanır
      to_copy++;
     }
//--- kopyalamaya çalış
   if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
//--- bir sonraki çağrı için prev_calculated değerine dönüş yap
   return(rates_total);
  }
//+------------------------------------------------------------------+

Yukarıdaki örnekte, bir gösterge tamponunun aynı sembol/periyot değerine sahip bir göstergenin tamponuyla nasıl doldurulacağı gösterilmektedir.

Tarihsel veri istemiyle ilgili detaylı bir örnek için Nesne Bağlama Yöntemleri bölümüne bakınız. Söz konusu örnekte iFractals göstergesinden son 1000 alınması ve son 10 yukarı/aşağı fraktalin çizelge üzerine çizilmesi gösterilmektedir. Benzer bir teknik, eksik veriye sahip olan ve genellikle aşağıda belirtilen stillerle çizilen tüm göstergelerde kullanılabilir:

 

Ayrıca Bakınız

Özel Göstergelerin Özellikleri, SetIndexBuffer