ArraySort

Çok boyutlu bir sayısal dizinin ilk boyutundaki elemanları artan şekilde sıralar.

bool  ArraySort(
   void&  array[]      // sıralanacak dizi
   );

Parametreler

array[]

[in][out]  Sıralanacak sayısal dizi.

Dönüş değeri

Başarılı sonuç için 'true' değerine, aksi durumda 'false' değerine dönüş yapar.

Not

Dizi, AS_SERIES bayrağının değerine bakılmaksızın her zaman artan şekilde sıralanır.

ArraySort ve ArrayBSearch fonksiyonları tüm dizileri parametre olarak kabul eder. Ama arama ve sıralama işlemleri sadece ilk boyutta gerçekleştirilir.

Örnek:

#property description "Gösterge önceki ayın verisini inceleyerek, küçük ve büyük tik hacimli tüm"
#property description "mumları boyar. Tik hacmi dizisi böyle mumları tanımlamak için sıralanır."
#property description "Dizi elemanlarının ilk InpSmallVolume yüzdesini kapsayan hacme sahip"
#property description "mumlar küçük farz edilir. Dizi elemanlarının son InpBigVolume yüzdesini"
#property description "kapsayan hacme sahip mumlar ise büyük farz edilir."
//--- gösterge ayarları
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   1
//--- grafik
#property indicator_label1  "VolumeFactor"
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_color1  clrDodgerBlue,clrOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- ön tanımlı sabitler
#define INDICATOR_EMPTY_VALUE 0.0
//--- giriş parametreleri
input int InpSmallVolume=15; // Küçük hacimlerin yüzdelik değeri (<50)
input int InpBigVolume=20;   // Büyük hacimlerin yüzdelik değeri (<50)
//--- analiz başlangıç zamanı (kaydırılacak)
datetime ExtStartTime;
//--- gösterge tamponları
double   ExtOpenBuff[];
double   ExtHighBuff[];
double   ExtLowBuff[];
double   ExtCloseBuff[];
double   ExtColorBuff[];
//--- mumların gösterilmesi için sınır hacim değerleri
long     ExtLeftBorder=0;
long     ExtRightBorder=0;
//+------------------------------------------------------------------+
//| Tik hacimleri için sınır değerlerini al                          |
//+------------------------------------------------------------------+
bool GetVolumeBorders(void)
  {
//--- değişkenler
   datetime stop_time;  // kopyalama durdurma zamanı
   long     buff[];     // kopyalama tamponu
//--- durdurma zamanı şu anki zaman olsun
   stop_time=TimeCurrent();
//--- başlangıç zamanı şimdikinden bir ay önceki olsun
   ExtStartTime=GetStartTime(stop_time);
//--- tik hacmi değerlerini al
   ResetLastError();
   if(CopyTickVolume(Symbol(),Period(),ExtStartTime,stop_time,buff)==-1)
     {
      //--- verinin alınması başarısız oldu, yeniden hesaplama komutu için false dönüşü yap
      PrintFormat("Tik hacmi değerlerinin alınması başarısız oldu. Hata kodu = %d",GetLastError());
      return(false);
     }
//--- dizi büyüklüğünü hesapla
   int size=ArraySize(buff);
//--- diziyi sırala
   ArraySort(buff);
//--- tik hacimleri için sağ ve sol sınırları tanımla
   ExtLeftBorder=buff[size*InpSmallVolume/100];
   ExtRightBorder=buff[(size-1)*(100-InpBigVolume)/100];
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Bir ay önceki verinin alınması                                   |
//+------------------------------------------------------------------+
datetime GetStartTime(const datetime stop_time)
  {
//--- durdurma zamanını MqlDateTime tipli yapı değişkenine dönüştür
   MqlDateTime temp;
   TimeToStruct(stop_time,temp);
//--- bir ay önceki veriyi al
   if(temp.mon>1)
      temp.mon-=1;  // mevcut ay, yılın ilk ayı değil. Bu yüzden, bir öncekinin numarası bir eksik olacak
   else
     {
      temp.mon=12;  // mevcut ay, yılın ilk ayı. Bu yüzden, bir öncekinin numarası 12 olacak,
      temp.year-=1; // yıl numarası bir küçükse
     }
//--- gün numarası 28'i aşamaz
   if(temp.day>28)
      temp.day=28;
//--- elde edilen tarih değerine dönüş yap
   return(StructToTime(temp));
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- giriş parametreleri koşulları sağlıyor mu kontrol et
   if(InpSmallVolume<0 || InpSmallVolume>=50 || InpBigVolume<0 || InpBigVolume>=50)
     {
      Print("Hatalı giriş parametreleri");
      return(INIT_PARAMETERS_INCORRECT);
     }
//--- gösterge tamponlarının eşlenmesi
   SetIndexBuffer(0,ExtOpenBuff);
   SetIndexBuffer(1,ExtHighBuff);
   SetIndexBuffer(2,ExtLowBuff);
   SetIndexBuffer(3,ExtCloseBuff);
   SetIndexBuffer(4,ExtColorBuff,INDICATOR_COLOR_INDEX);
//--- gösterilmeyecek olan değeri ayarla
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);
//--- gösterge tamponlarının etiketlerini ayarla
   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[])
  {
//--- hala işlenmeyen çubuklar var mı kontrol et
   if(prev_calculated<rates_total)
     {
      //--- sağ ve sol hacim sınırları için yeni değerler al
      if(!GetVolumeBorders())
         return(0);
     }
//--- çubuk hesaplama için değişkeni başlat
   int start=prev_calculated;
//--- gösterge değerleri bir önceki tik ile zaten hesaplanmışsa son çubukta çalış
   if(start>0)
      start--;
//--- zaman serilerindeki doğrudan indislemeyi ayarla
   ArraySetAsSeries(time,false);
   ArraySetAsSeries(open,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(low,false);
   ArraySetAsSeries(close,false);
   ArraySetAsSeries(tick_volume,false);
//--- gösterge değerlerini hesaplayan döngü
   for(int i=start;i<rates_total;i++)
     {
      //--- başlangıç tarihinden başlayarak mumları doldur
      if(ExtStartTime<=time[i])
        {
         //--- değer sağ sınırdan küçük değilse, mumu doldur
         if(tick_volume[i]>=ExtRightBorder)
           {
            //--- mumu çizmek için veri al
            ExtOpenBuff[i]=open[i];
            ExtHighBuff[i]=high[i];
            ExtLowBuff[i]=low[i];
            ExtCloseBuff[i]=close[i];
            //--- DodgerBlue (parlak gök mavisi) renk
            ExtColorBuff[i]=0;
            //--- döngüye devam et
            continue;
           }
         //--- değer, sol sınırı aşmamışsa, mumu doldur
         if(tick_volume[i]<=ExtLeftBorder)
           {
            //--- mumu çizmek için veri al
            ExtOpenBuff[i]=open[i];
            ExtHighBuff[i]=high[i];
            ExtLowBuff[i]=low[i];
            ExtCloseBuff[i]=close[i];
            //--- Orange (turuncu) renk
            ExtColorBuff[i]=1;
            //--- döngüye devam et
            continue;
           }
        }
      //--- hesaplamaya katılmayan boş değerli çubukları ayarla
      ExtOpenBuff[i]=INDICATOR_EMPTY_VALUE;
      ExtHighBuff[i]=INDICATOR_EMPTY_VALUE;
      ExtLowBuff[i]=INDICATOR_EMPTY_VALUE;
      ExtCloseBuff[i]=INDICATOR_EMPTY_VALUE;
     }
//--- bir sonraki çağrı için prev_calculated değerine dönüş yap
   return(rates_total);
  }

Ayrıca Bakınız

ArrayBsearch