CopySeries

Belirtilen sembol, zaman dilimi ve veri miktarı için MqlRates yapısından belirtilen dizi kümesine senkronize zaman serilerini alır. Elemanlar şimdiki zamandan geçmişe doğru sayılır, yani 0'a eşit başlangıç konumu mevcut çubuk anlamına gelir.

copyseries

Kopyalanacak veri miktarı bilinmiyorsa, alıcı diziler için dinamik dizi kullanılması önerilir. Çünkü eğer kopyalanan veri miktarı dizinin içerebileceğinden daha fazla olursa, talep edilen tüm verilerin diziye sığması amacıyla dizide yeniden dağıtım gerçekleşebilir.

Belirli bir miktarda veri kopyalanacaksa, gereksiz bellek yeniden tahsisini önlemek adına statik olarak tahsis edilmiş arabellek kullanılması önerilir.

Alıcı dizinin as_series=true veya as_series=false olmak üzere hangi özelliğe sahip olduğu önemli değildir: veriler, dizi için tahsis edilmiş fiziksel belleğin başına en eski zaman serisi elemanı gelecek şekilde kopyalanacaktır.

int  CopySeries(
   string           symbol_name,       // sembolün adı
   ENUM_TIMEFRAMES  timeframe,         // zaman dilimi
   int              start_pos,         // başlangıç konumu
   int              count,             // kopyalanacak veri miktarı
   ulong            rates_mask,        // istenen zaman serilerini belirtmek için bayrak kombinasyonu
   void&            array1[],          // ilk zaman serisinin verilerinin kopyalanacağı dizi
   void&            array2[]           // ikinci zaman serisinin verilerinin kopyalanacağı dizi
   ...
   );

Parametreler

symbol_name

[in]  Sembol.

timeframe

[in]  Zaman dilimi.

start_pos

[in]  Kopyalanacak ilk elemanın indeksi.

count

[in]  Kopyalanacak eleman sayısı.

rates_mask

[in] ENUM_COPY_RATES numaralandırmasından bayrak kombinasyonu.

array1, array2,...

[out] MqlRates yapısından zaman serisini almak için uygun türde dizi. Fonksiyona iletilen dizilerin sırası, MqlRates yapısındaki alanların sırasıyla eşleşmelidir.

Geri dönüş değeri

Kopyalanan elemanların sayısı veya hata durumunda -1.

Not

Talep edilen veri aralığı sunucuda bulunan verileri aşıyorsa, fonksiyon -1 geri döndürür. Talep edilen veri aralığı TERMINAL_MAXBARS'ı (grafikteki maksimum çubuk sayısı) aşıyorsa, fonksiyon yine -1 geri döndürür.

Göstergeden veri talep edilirken, istenen zaman serileri henüz oluşturulmadıysa veya sunucudan indirilmesi gerekiyorsa, fonksiyon hemen -1 geri döndürür. Böyle bir durumda, aynı zamanda verilerin indirilmesi/oluşturulması da başlatılır.

Uzman Danışmandan veya komut dosyasından veri talep edilirken, terminalde yerel olarak ilgili veriler yoksa, sunucudan indirme işlemi başlatılır ve bu süreçte yerel geçmişten oluşturulabiliyorsa gerekli zaman serileri oluşturulur. Fonksiyon, zaman aşımı süresi dolduğunda hazır olan veri miktarını geri döndürür, ancak geçmişin indirilme işlemi halen devam eder, böylece bir sonraki benzer talepte daha fazla veri geri döndürülür.

CopySeries ve CopyRates arasındaki fark

CopySeries fonksiyonu, tek bir çağrıyla yalnızca gerekli zaman serilerinin farklı dizilere alınmasına olanak sağlar ve bu sırada zaman serilerinin tamamı senkronize edilir. Bu, belirli bir N indeksi için elde edilen dizilerdeki tüm değerlerin belirtilen sembol / zaman dilimindeki aynı çubuğa ait olacağı anlamına gelir. Böylece, programcının alınan tüm zaman serilerini çubuğun açılış zamanına göre senkronize etmesine gerek kalmaz.

Zaman serilerinin tamamını bir MqlRates dizisi olarak geri döndüren CopyRates'in aksine, CopySeries fonksiyonu yalnızca gerekli zaman serilerinin farklı diziler halinde alınmasını mümkün kılar. Bu, istenen zaman serilerini belirtmek üzere bayrak kombinasyonu ayarlanarak yapılır. Fonksiyona iletilen dizilerin sırası, MqlRates yapısındaki alanların sırasıyla eşleşmelidir:

struct MqlRates
  {
   datetime time;         // açılış zamanı
   double   open;         // açılış fiyatı
   double   high;         // yüksek fiyatı
   double   low;          // düşük fiyatı
   double   close;        // kapanış fiyatı
   long     tick_volume;  // tik hacmi
   int      spread;       // spread
   long     real_volume;  // gerçek hacim
  }

Örneğin, mevcut sembol / zaman diliminde son 100 çubuk için time, close ve real_volume zaman serilerinin değerleri alınması gerekiyorsa, çağrı aşağıdaki gibi olmalıdır:

datetime time[];
double   close[];
long     volume[];
CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);

Burada, time, close ve volume dizilerinin sırası önemlidir: MqlRates yapısındaki alanların sırasına karşılık gelmelidir. Ancak rates_mask içerisindeki değerlerin sırası önemli değildir. Maske şu şekilde olabilir:

COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE

Örnek:

//--- girdi parametreleri
input datetime InpDateFrom=D'2022.01.01 00:00:00';
input datetime InpDateTo  =D'2023.01.01 00:00:00';
input uint     InpCount   =20;
//+------------------------------------------------------------------+
//| Komut dosyası başlatma fonksiyonu                                |
//+------------------------------------------------------------------+
void OnStart(void)
  {
//--- MqlRates yapısından zaman serileri almak için diziler
   double   open[];
   double   close[];
   float    closef[];
   datetime time1[], time2[];
//--- double türünde diziye kapanış fiyatlarını talep et
   ResetLastError();
   int res1=CopySeries(NULLPERIOD_CURRENT0InpCount,
                       COPY_RATES_TIME|COPY_RATES_CLOSEtime1close);
   PrintFormat("1. CopySeries %d değer geri döndürdü. Hata kodu=%d"res1GetLastError());
   ArrayPrint(close);
  
//--- açılış fiyatlarını da talep et ve kapanış fiyatları için float türünü kullan
   ResetLastError();
   int res2=CopySeries(NULLPERIOD_CURRENT0InpCount,
                       COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPENtime2openclosef);
   PrintFormat("2. CopySeries %d değer geri döndürdü. Hata kodu=%d"res2GetLastError());
   ArrayPrint(closef);
//--- alınan verileri karşılaştır
   if((res1==res2) && (time1[0]==time2[0]))
     {
      Print("  | Time             |    Open      | Close double | Close float |");
      for(int i=0i<10i++)
        {
         PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                     iTimeToString(time1[i]), open[i], close[i], closef[i]);
        }
     }
//--- Sonuç
 1. CopySeries 20 değer geri döndürdü. Hata kodu:0 Error code=0
 [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
 [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
 2. CopySeries 20 değer geri döndürdü. Hata kodu:0 Error code=0
 [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
 [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
   | Time             |    Open      | Close double | Close float |
 0 | 2023.03.01 17:00 |   1.06660    |   1.06722    |   1.06722   |
 1 | 2023.03.01 18:00 |   1.06722    |   1.06733    |   1.06733   |
 2 | 2023.03.01 19:00 |   1.06734    |   1.06653    |   1.06653   |
 3 | 2023.03.01 20:00 |   1.06654    |   1.06520    |   1.06520   |
 4 | 2023.03.01 21:00 |   1.06520    |   1.06573    |   1.06573   |
 5 | 2023.03.01 22:00 |   1.06572    |   1.06649    |   1.06649   |
 6 | 2023.03.01 23:00 |   1.06649    |   1.06694    |   1.06694   |
 7 | 2023.03.02 00:00 |   1.06683    |   1.06675    |   1.06675   |
 8 | 2023.03.02 01:00 |   1.06675    |   1.06684    |   1.06684   |
 9 | 2023.03.02 02:00 |   1.06687    |   1.06604    |   1.06604   |
//---
  }

Ayrıca bakınız

Yapılar ve sınıflar, CopyRates