ArrayCopy

Bir diziyi diğerine kopyalar.

int  ArrayCopy(
   void&        dst_array[],         // hedef dizi
   const void&  src_array[],         // kaynak dizi
   int          dst_start=0,         // hangi indisten başlanarak hedef diziye yazılacak
   int          src_start=0,         // kaynak dizinin ilk indisi
   int          count=WHOLE_ARRAY    // eleman sayısı
   );

Parametreler

dst_array[]

[out]  Hedef dizi

src_array[]

[in]  Kaynak dizi

dst_start=0

[in]  Hedef dizideki başlangıç indisi. Varsayılan olarak başlangıç indisi sıfırdır.

src_start=0

[in]  Kaynak dizideki başlangıç indisi. Varsayılan olarak başlangıç indisi sıfırdır.

count=WHOLE_ARRAY

[in]  Kopyalanması gereken eleman sayısı. Varsayılan olarak bütün dizi kopyalanır (count=WHOLE_ARRAY).

Dönüş değeri

Kopyalanan eleman sayısına dönüş yapar.

Not

'count<0' veya 'count>src_size-src_start' koşulları mevcutsa, dizinin kalan bölümlerinin tamamı kopyalanır. Diziler soldan sağa doğru kopyalanır. Serilerde ve dizilerde başlangıç pozisyonu soldan sağa kopyalama için tanımlanmış ve düzenlenmiştir.

Eğer diziler farklı tiptelerse, kopyalama sırasında kaynak dizinin her elemanının hedef dizinin tipine dönüştürülmesi denenecektir. Dizgi dizileri sadece dizgi dizilerine kopyalanabilir. Başlatma gerektiren nesneleri içeren sınıflardan ve yapılardan oluşan diziler kopyalanmazlar. Yapılardan oluşan bir dizi, sadece aynı tipli bir diziye kopyalanabilir.

İndisleme yönü zaman serilerindeki gibi olan dinamik diziler için, hedef dizinin büyüklüğü otomatik olarak kopyalanan veri sayısına genişletilir. Hedef dizinin büyüklüğü hiçbir durumda azaltılmaz.

Örnek:

#property description "Bu gösterge, yerel olarak yüksek ve düşük"
#property description "mumları vurgular. Uç değerlerin bulunacağı zaman aralığının"
#property description "uzunluğu bir giriş parametresiyle belirlenmelidir."
//--- gösterge ayarları
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   1
//---- grafik
#property indicator_label1  "Extremums"
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_color1  clrLightSteelBlue,clrRed,clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- ön tanımlı sabitler
#define INDICATOR_EMPTY_VALUE 0.0
//--- giriş parametreleri
input int InpNum=4; // Yarım aralık uzunluğu
//--- gösterge tamponları
double ExtOpen[];
double ExtHigh[];
double ExtLow[];
double ExtClose[];
double ExtColor[];
//--- global değişkenler
int    ExtStart=0; // uçdeğer olmayan ilk mumun indisi
int    ExtCount=0; // uçdeğer olmayanların belirlenen aralıktaki sayısı
//+------------------------------------------------------------------+
//| Uçdeğer olmayan mumların doldurulması                            |
//+------------------------------------------------------------------+
void FillCandles(const double &open[],const double &high[],
                 const double &low[],const double &close[])
  {
//--- mumları doldur
   ArrayCopy(ExtOpen,open,ExtStart,ExtStart,ExtCount);
   ArrayCopy(ExtHigh,high,ExtStart,ExtStart,ExtCount);
   ArrayCopy(ExtLow,low,ExtStart,ExtStart,ExtCount);
   ArrayCopy(ExtClose,close,ExtStart,ExtStart,ExtCount);
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- gösterge tamponlarının eşlenmesi
   SetIndexBuffer(0,ExtOpen);
   SetIndexBuffer(1,ExtHigh);
   SetIndexBuffer(2,ExtLow);
   SetIndexBuffer(3,ExtClose);
   SetIndexBuffer(4,ExtColor,INDICATOR_COLOR_INDEX);
//--- gösterilmeyen değeri belirle
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);
//--- veri penceresinde gösterilebilmeleri için gösterge tamponlarını isimlendir
   PlotIndexSetString(0,PLOT_LABEL,"Open;High;Low;Close");
//---
   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[])
  {
//--- indisleme yönünü zaman serisi şeklinde ayarla
   ArraySetAsSeries(open,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(low,false);
   ArraySetAsSeries(close,false);
//--- çubukların hesaplanmasında kullanılan başlangıç değişkeni 
   int start=prev_calculated;
//--- ilk InpNum*2 çubuk boyunca hesaplama başlamayacak
   if(start==0)
     {
      start+=InpNum*2;
      ExtStart=0;
      ExtCount=0;
     }
//--- çubuk şekil almışsa, bir sonraki potansiyel uçdeğeri kontrol et
   if(rates_total-start==1)
      start--;
//--- uçdeğer için kontrol edilecek çubuk indisi
   int ext;
//--- gösterge değeri hesaplama döngüsü
   for(int i=start;i<rates_total-1;i++)
     {
      //--- ilk olarak i indisli çubukta, çizim yapılmadan
      ExtOpen[i]=0;
      ExtHigh[i]=0;
      ExtLow[i]=0;
      ExtClose[i]=0;
      //--- kontrol amaçlı uçdeğer indisi
      ext=i-InpNum;
      //--- yerel maksimumu kontrol et
      if(IsMax(high,ext))
        {
         //--- uçdeğerli mumu vurgula
         ExtOpen[ext]=open[ext];
         ExtHigh[ext]=high[ext];
         ExtLow[ext]=low[ext];
         ExtClose[ext]=close[ext];
         ExtColor[ext]=1;
         //--- uçdeğere kadar olan diğer çubukları belirsiz bir renk ile vurgula
         FillCandles(open,high,low,close);
         //--- değişken olan renkleri değiştir
         ExtStart=ext+1;
         ExtCount=0;
         //--- bir sonraki tekrara geç
         continue;
        }
      //--- yerel minimum için kontrol et
      if(IsMin(low,ext))
        {
         //--- uçdeğerli mumu vurgula
         ExtOpen[ext]=open[ext];
         ExtHigh[ext]=high[ext];
         ExtLow[ext]=low[ext];
         ExtClose[ext]=close[ext];
         ExtColor[ext]=2;
         //--- uçdeğere kadar olan diğer çubukları belirsiz bir renk ile vurgula
         FillCandles(open,high,low,close);
         //--- değişken olan değerleri değiştir
         ExtStart=ext+1;
         ExtCount=0;
         //--- bir sonraki tekrara geç
         continue;
        }
      //--- belirlenmiş aralıktaki uç olmayan değerlerin sayısını artır
      ExtCount++;
     }
//--- bir sonraki çağrı için prev_calculated değerine dönüş yap
   return(rates_total);
  }
//+----------------------------------------------------------------------+
//| Mevcut dizi elemanının yerel yüksek değer olup olmadığını kontrol et |
//+----------------------------------------------------------------------+
bool IsMax(const double &price[],const int ind)
  {
//--- aralık başlangıç değişkeni
   int i=ind-InpNum;
//--- aralığın son periyotu
   int finish=ind+InpNum+1;
//--- aralığın ilk yarısını kontrol et
   for(;i<ind;i++)
     {
      if(price[ind]<=price[i])
         return(false);
     }
//--- aralığın ikinci yarısını kontrol et
   for(i=ind+1;i<finish;i++)
     {
      if(price[ind]<=price[i])
         return(false);
     }
//--- bu bir uçdeğer
   return(true);
  }
//+---------------------------------------------------------------------+
//| Mevcut dizi elemanının yerel düşük değer olup olmadığını kontrol et |
//+---------------------------------------------------------------------+
bool IsMin(const double &price[],const int ind)
  {
//--- aralık başlangıç değişkeni
   int i=ind-InpNum;
//--- aralık son değişkeni
   int finish=ind+InpNum+1;
//--- aralığın ilk yarısını kontrol et
   for(;i<ind;i++)
     {
      if(price[ind]>=price[i])
         return(false);
     }
//--- aralığın ikinci yarısını kontrol et
   for(i=ind+1;i<finish;i++)
     {
      if(price[ind]>=price[i])
         return(false);
     }
//--- bu bir uçdeğer
   return(true);
  }