ArrayBsearch

Artan şekilde sıralanmış çok-boyutlu bir sayısal dizi üzerinde, belirtilen değeri arar. Arama ilk boyuttaki elemanlar üzerinde gerçekleştirilir.

double tipli bir dizide arama yapmak için

int  ArrayBsearch(
   const double&    array[],   // aranacak dizi
   double           value      // ne aranıyor
   );

float tipli bir dizide arama yapmak için

int  ArrayBsearch(
   const float&    array[],   // aranacak dizi
   float           value      // ne için aranıyor
   );

long tipli bir dizide arama yapmak için

int  ArrayBsearch(
   const long&    array[],   // aranacak dizi
   long           value      // ne aranıyor
   );

int tipli bir dizide arama yapmak için

int  ArrayBsearch(
   const int&    array[],   // aranacak dizi
   int           value      // ne aranıyor
   );

short tipli bir dizide arama yapmak için

int  ArrayBsearch(
   const short&    array[],   // aranacak dizi
   short           value      // ne aranıyor
   );

char tipli bir dizide arama yapmak için

int  ArrayBsearch(
   const char&    array[],   // aranacak dizi
   char           value      // ne aranıyor
   );

Parametreler

array[]

[in]  Aranacak sayısal dizi.

value

[in]  Aranacak değer.

Dönüş değeri

Fonksiyon bulunan elemanın indisine dönüş yapar. Aranan eleman bulunamazsa, en yakın değerli elemanın indisine dönüş yapar.

Not

İkili aramalar sadece sıralanmış dizilerde işler. Sayısal dizileri sıralamak için ArraySort() fonksiyonunu kullanın.

Örnek:

#property description "RSI göstergesinin verilerine dayanan bu script"
#property description "belirlenen zaman aralığında, piyasadaki"
#property description "aşırı alım ve aşırı satım alanlarını göstermektedir."
//--- script çalıştırıldığında giriş parametrelerinin penceresini göster
#property script_show_inputs
//--- giriş parametreleri
input int                InpMAPeriod=14;                    // Hareketli ortalama periodu
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;       // Fiyat tipi
input double             InpOversoldValue=30.0;             // Aşırı satım seviyesi
input double             InpOverboughtValue=70.0;           // Aşırı alım seviyesi
input datetime           InpDateStart=D'2012.01.01 00:00';  // Analiz başlangıç tarihi
input datetime           InpDateFinish=D'2013.01.01 00:00'; // Analiz bitiş tarihi
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double rsi_buff[]; // gösterge değerlerinin dizisi
   int    size=0;     // dizi büyüklüğü
//--- RSI göstergesinin tanıtıcı değerini al
   ResetLastError();
   int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
   if(rsi_handle==INVALID_HANDLE)
     {
      //--- gösterge tanıtıcı değeri alınamadı
      PrintFormat("Gösterge tanıtıcı değerinin alınmasında hata. Hata kodu = %d",GetLastError());
      return;
     }
//--- gösterge, verileri hesaplayana kadar döngüde kalacak
   while(BarsCalculated(rsi_handle)==-1)
     {
      //--- eğer gösterge, betiğin işlemini zoraki tamamlamışsa çık
      if(IsStopped())
         return;
      //--- göstergenin değerlerini hesaplamasına izin vermek için kısa bir duraklama
      Sleep(10);
     }
//--- belli bir zaman aralığı için gösterge değerlerini kopyala
   ResetLastError();
   if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
     {
      PrintFormat("Gösterge değerlerinin kopyalanması başarısız oldu. Hata kodu = %d",GetLastError());
      return;
     }
//--- dizi büyüklüğünü al
   size=ArraySize(rsi_buff);
//--- diziyi sırala
   ArraySort(rsi_buff);
//--- (yüzdelik terimlerle) piyasanın aşırı satım alanında olduğu zamanı bul
   double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- (yüzdelik terimlerle) piyasanın aşırı alım alanında olduğu zamanı bul
   double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- dizgilerden hareketle veriyi göstermek için
   string str=""+TimeToString(InpDateStart,TIME_DATE)+" tarihinden "
              +TimeToString(InpDateFinish,TIME_DATE)+" tarihine kadar piyasa:";
   string str_ovb="zamanın "+DoubleToString(ovb,2)+"% kadarında aşırı alım alanında";
   string str_ovs="zamanın "+DoubleToString(ovs,2)+"% kadarında aşırı satım alanında";
//--- veriyi çizelge üzerinde göster
   CreateLabel("top",5,60,str,clrDodgerBlue);
   CreateLabel("overbought",5,35,str_ovb,clrDodgerBlue);
   CreateLabel("oversold",5,10,str_ovs,clrDodgerBlue);
//--- çizelgeyi yeniden çiz
   ChartRedraw(0);
//--- durakla
   Sleep(10000);
  }
//+------------------------------------------------------------------+
//| Çizelgenin sol alt köşesinde yorumu göster                       |
//+------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
                 const string str,const color clr)
  {
//--- etiketi oluştur
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- etiketi sol alt köşeye bağla
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- tutturma konumunu değiştir
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- tutturma noktasının X yönünde uzaklığı
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- tutturma noktasının Y yönünde uzaklığı
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- etiket metni
   ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- metin rengi
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- metin boyutu
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
  }