Zaman Serilerine ve Gösterge Verilerine Erişim

Bu fonksiyonlar, zaman-serileri ve göstergelerle çalışmak için tasarlanmıştır. Bu fonksiyonlar, zaman-serileri ve göstergelerle çalışmak için tasarlanmıştır. Zaman-serilerinin değerlerini ve gösterge verilerini kopyalamak için sadece dinamik dizilerin kullanılması önerilir, çünkü kopyalamayı yapan fonksiyonlar, değerlerin girileceği diziler için bellek tahsis etmek amacıyla tasarlanmışlardır.

Bu kuralın önemli bir istisnası bulunmaktadır: zaman-serilerinin ve gösterge verilerinin kopyalanmasına sıklıkla ihtiyaç duyuluyorsa (örneğin Uzman Danışman içindeki her OnTick() çağrısında veya gösterge içindeki her bir OnCalculate() çağrısı sırasında), bu durumda statik olarak dağıtılmış diziler kullanılmalıdır. Çünkü dinamik diziler için bellek tahsisi işlemleri fazladan zaman gerektirir, bu da sınama ve optimizasyon sırasında etkili olacaktır.

Zaman-serileri ve gösterge değerlerine erişmek amacıyla fonksiyonlar kullanıldığında, indisleme yönü de hesaba katılmalıdır. Bu konu, Dizilerde ve zaman-serilerinde indisleme yönü bölümünde açıklanmıştır.

Zaman-serileri ve gösterge verilerine yapılan erişim, verinin hazır olup olmamasına bakılmaksızın uygulanır (buna asenkron erişim) denir. Bu, özel göstergelerin hesaplanması için oldukça önemli bir özeliktir; eğer dizi içinde veri yoksa Copy...() tipindeki fonksiyonlar anında hata dönüşü yaparlar. Ama, scriptlerden ve Uzman Danışmanlardan erişim gerçekleştirirken, küçük bir duraklama içerisine verileri almak için birkaç deneme gerçekleştirilir. Bu duraklama, gereken zaman-serisi verilerinin alınması için yeterli sürenin sağlanması amacını taşımaktadır

Veri Erişiminin Düzenlenmesi bölümü, MetaTrader 5 müşteri terminali içerisinde fiyat verilerinin istenmesine, alınmasına ve saklanmasına dair detayları içermektedir.

Bir zaman-serisindeki ve bir normal dizideki indisleme yönü

Bir dizideki tarihsel verilere, verilerin sonundan başlayarak erişim gerçekleştirilir. Fiziksel olarak yeni veri, dizinin sonuna yazılır ve dizinin son elemanının indisi her zaman sıfıra eşittir. Zaman-serilerinde 0 indisi mevcut çubuğun verisini, yani mevcut zaman-aralığında tamamlanmamış olan çubuğa karşılık gelir.

Zaman-aralığı tek bir çubuğun şekillendiği zaman periyodudur. 21 adet ön-tanımlı standart zaman-aralığı bulunmaktadır.

Fonksiyon

Eylem

SeriesInfoInteger

Tarihsel verinin durumu ile ilgili veriye dönüş yapar

Bars

Belirtilen sembol ve periyot ile geçmişteki çubukların sayısına dönüş yapar

BarsCalculated

Bir gösterge tamponundaki hesaplanan verilerin sayısına dönüş yapar, hata durumunda ise -1 durumuna (veri henüz hesaplanmadı) dönüş yapar

IndicatorCreate

MqlParam tipi parametrelerden oluşmuş bir dizi ile oluşturulan belirli bir teknik göstergenin tanıtıcı değerine dönüş yapar

IndicatorParameters

Belirtilen tanıtıcı değere bağlı olarak, gösterge giriş parametrelerinin sayısına, değerlerine ve tiplerine dönüş yapar

IndicatorRelease

Gösterge tanıtıcı değerini kaldırır ve başka biri tarafından kullanılmıyorsa hesaplama bloğunu serbest bırakır

CopyBuffer

Belirtilen bir göstergenin belirtilen bir tamponunu bir dizi içine kopyalar

CopyRates

Belirtilen sembol ve periyot için Rates yapısının tarihsel verisini bir diziye kopyalar

CopySeries

Gets the synchronized timeseries from the Rates structure for the specified symbol-period and the specified amount

CopyTime

Belirtilen sembol ve periyot için çubuk açılış zamanına dair geçmiş verisini bir diziye kopyalar

CopyOpen

Belirtilen sembol ve periyot için çubuk açılış fiyatına dair geçmiş verisini bir diziye kopyalar

CopyHigh

Belirtilen sembol ve periyot için maksimal çubuk fiyatına dair geçmiş verisini bir diziye kopyalar

CopyLow

Belirtilen sembol ve periyot için minimal çubuk fiyatına dair geçmiş verisini bir diziye kopyalar

CopyClose

Belirtilen sembol ve periyot için çubuk kapanış fiyatına dair geçmiş verisini bir diziye kopyalar

CopyTickVolume

Belirtilen sembol ve periyot için tik hacmine dair geçmiş verisini bir diziye kopyalar

CopyRealVolume

Belirtilen sembol ve periyot için alım-satım hacmine dair geçmiş verisini bir diziye kopyalar

CopySpread

Belirtilen sembol ve periyot için makas değerine dair geçmiş verisini bir diziye kopyalar

CopyTicks

MqlTick biçimindeki tik verilerini ticks_array dizisine aktarır

CopyTicksRange

belirtilen aralıktaki tik fiyatlarını MqlTick biçiminde ticks_array dizisine depolar

iBars

Tarihte mevcut karşılık gelen sembol ve dönemin çubuk sayısını döndürür

iBarShift

Zamana göre bar arama. İşlev, belirtilen zamana karşılık gelen çubuğun dizinini döndürür

iClose

İlgili grafikteki çubuğun Kapanış fiyatını ('shift' parametresiyle gösterilir) döndürür

iHigh

İlgili grafikteki çubuğun Yüksek fiyatını ('shift' parametresiyle gösterilir) döndürür

iHighest

İlgili grafikte bulunan en yüksek değerin indeksini döndürür (geçerli çubuğa göre)

iLow

İlgili grafikteki çubuğun Düşük fiyatını ('shift' parametresiyle gösterilir) döndürür

iLowest

İlgili grafikte bulunan en küçük değerin indeksini döndürür (geçerli çubuğa göre)

iOpen

İlgili grafikteki çubuğun Açılış fiyatını ('shift' parametresiyle gösterilir) döndürür

iTime

İlgili grafikteki çubuğun açılış zamanını ('shift' parametresiyle gösterilir) döndürür

iTickVolume

İlgili grafikteki çubuğun tik hacmini ('shift' parametresi ile gösterilir) döndürür

iRealVolume

İlgili grafikteki çubuğun gerçek hacmini ('shift' parametresiyle gösterilir) döndürür

iVolume

İlgili grafikteki çubuğun tik hacmini ('shift' parametresi ile gösterilir) döndürür

iSpread

İlgili grafikteki çubuğun spread değerini ('shift' parametresiyle gösterilir) döndürür

ArraySetAsSeries() fonksiyonunun kullanımıyla dizilerdeki veri erişiminin zaman-serilerindeki gibi ayarlanabilmesine rağmen, dizi elemanlarının aynı ve tek şekilde depolandıkları unutulmamalıdır - sadece indisleme yönü değişir. Bu özelliği gösterebilmek için şu örneği çalıştıralım:

   datetime TimeAsSeries[];
//--- diziye erişimi zaman-serilerindeki gibi ayarla
   ArraySetAsSeries(TimeAsSeries,true);
   ResetLastError();
   int copied=CopyTime(NULL,0,0,10,TimeAsSeries);
   if(copied<=0)
     {
      Print("Son 10 çubuğun açılış zamanını kopyalama işlemi başarısız oldu");
      return;
     }
   Print("TimeCurrent =",TimeCurrent());
   Print("ArraySize(Time) =",ArraySize(TimeAsSeries));
   int size=ArraySize(TimeAsSeries);
   for(int i=0;i<size;i++)
     {
      Print("TimeAsSeries["+i+"] =",TimeAsSeries[i]);
     }
 
   datetime ArrayNotSeries[];
   ArraySetAsSeries(ArrayNotSeries,false);
   ResetLastError();
   copied=CopyTime(NULL,0,0,10,ArrayNotSeries);
   if(copied<=0)
     {
      Print("Son 10 çubuğun açılış zamanını kopyalama işlemi başarısız oldu");
      return;
     }   
   size=ArraySize(ArrayNotSeries);
   for(int i=size-1;i>=0;i--)
     {
      Print("ArrayNotSeries["+i+"] =",ArrayNotSeries[i]);
     }

Sonuç olarak şöyle bir çıktı alırız:

TimeCurrent = 2009.06.11 14:16:23
ArraySize(Time) = 10
TimeAsSeries[0] = 2009.06.11 14:00:00
TimeAsSeries[1] = 2009.06.11 13:00:00
TimeAsSeries[2] = 2009.06.11 12:00:00
TimeAsSeries[3] = 2009.06.11 11:00:00
TimeAsSeries[4] = 2009.06.11 10:00:00
TimeAsSeries[5] = 2009.06.11 09:00:00
TimeAsSeries[6] = 2009.06.11 08:00:00
TimeAsSeries[7] = 2009.06.11 07:00:00
TimeAsSeries[8] = 2009.06.11 06:00:00
TimeAsSeries[9] = 2009.06.11 05:00:00
 
ArrayNotSeries[9] = 2009.06.11 14:00:00
ArrayNotSeries[8] = 2009.06.11 13:00:00
ArrayNotSeries[7] = 2009.06.11 12:00:00
ArrayNotSeries[6] = 2009.06.11 11:00:00
ArrayNotSeries[5] = 2009.06.11 10:00:00
ArrayNotSeries[4] = 2009.06.11 09:00:00
ArrayNotSeries[3] = 2009.06.11 08:00:00
ArrayNotSeries[2] = 2009.06.11 07:00:00
ArrayNotSeries[1] = 2009.06.11 06:00:00
ArrayNotSeries[0] = 2009.06.11 05:00:00

Çıktıdan da görebileceğimiz gibi, TimeAsSeries dizisinin indisi yükseldikçe, indisin zaman değeri azalıyor, Yani, şimdiki zamandan geçmişe doğru hareket ediyoruz. Normal ArrayNotSeries dizisi içinse sonuçlar farklı - indis büyürken, geçmişten günümüze hareket ediyoruz.

Ayrıca Bakınız

ArrayIsDynamic, ArrayGetAsSeries, ArraySetAsSeries, ArrayIsSeries