ArrayBsearch

Searches for a specified value in a multidimensional numeric array sorted ascending. Search is performed through the elements of the first dimension.

Per la ricerca in un array di tipo double

int  ArrayBsearch(
   const double&    array[],   // array per la ricerca
   double           value      // ciò che dev'essere cercato
   );

Per la ricerca in un array di tipo float

int  ArrayBsearch(
   const float&    array[],   // array per la ricerca
   float           value      // ciò che dev'essere cercato
   );

Per la ricerca in un array di tipo long

int  ArrayBsearch(
   const long&    array[],   // array per la ricerca
   long           value      // ciò che dev'essere cercato
   );

Per la ricerca in un array di tipo int

int  ArrayBsearch(
   const int&    array[],   // array per la ricerca
   int           value      // ciò che dev'essere cercato
   );

Per la ricerca in un array di tipo short

int  ArrayBsearch(
   const short&    array[],   // array per la ricerca
   short           value      // ciò che dev'essere cercato
   );

Per la ricerca in un array di tipo char

int  ArrayBsearch(
   const char&    array[],   // array per la ricerca
   char           value      // ciò che dev'essere cercato
   );

Parametri

array[]

[in] Array numerico per la ricerca.

valore

[in] Valore per la ricerca.

Valore restituito

La funzione restituisce l'indice di un elemento trovato. Se il valore desiderato non viene trovato, la funzione restituisce l'indice di un elemento più vicino in termini di valore.

Nota

La ricerca binaria elabora solo array ordinati. Per ordinare gli array numerici utilizzare la funzione ArraySort().

Esempio:

#property description "Lo Script è basato sui dati che l'indicatore RSI mostra"
#property description "quanto spesso il mercato era in"
#property description "area overbought ed oversold nell'intervallo di tempo specificato."
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- parametri di input
input int                InpMAPeriod=14;                    // Periodo media mobile
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;       // Tipo di prezzo
input double             InpOversoldValue=30.0;             // Livello Oversold (_* SovraVenduto)
input double             InpOverboughtValue=70.0;           // Livello Overbought (_* SovraComprato)
input datetime           InpDateStart=D'2012.01.01 00:00';  // Data di inizio Analisi
input datetime           InpDateFinish=D'2013.01.01 00:00'; // Data di Fine Analisi
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script                                         |
//+--------------------------------------------------------------------------------+
voidOnStart()
  {
   double rsi_buff[]; // array dei valori dell'indicatore
   int    size=0;     // grandezza dell' array
//--- riceve l'handle dell'indicatore RSI
   ResetLastError();
   int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
   if(rsi_handle==INVALID_HANDLE)
     {
      //--- fallimento nel ricevere l'handle dell'indicatore
      PrintFormat("Indicator handle receiving error. Codice Errore = %d",GetLastError());
      return;
     }
//--- è in loop, finchè l'indicatore calcola tutti i suoi valori
   while(BarsCalculated(rsi_handle)==-1)
     {
      //--- esce se l'indicatore ha completato forzatamente l'operazione dello script
      if(IsStopped())
         return;
      //--- una pausa per permettere all'indicatore di calcolare tutti i suoi valori
      Sleep(10);
     }
//--- copia i valori dell'indicatore per un certo periodo di tempo
   ResetLastError();
   if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
     {
      PrintFormat("Fallimento nel copiare i valori dell'indicatore. Codice Errore = %d",GetLastError());
      return;
     }
//--- riceve la grandezza dell'array
   size=ArraySize(rsi_buff);
//--- ordina l'array
   ArraySort(rsi_buff);
//--- trova l'orario (in termini percetuali) in cui il mercato era in area Oversold
   double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- trova l'orario (in termini percetuali) in cui il mercato era in area Overbought
   double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- forma la stringa per visualizzare i dati
   string str="From "+TimeToString(InpDateStart,TIME_DATE)+" to "
              +TimeToString(InpDateFinish,TIME_DATE)+" il mercato era:";
   string str_ovb="in area overbought per il "+DoubleToString(ovb,2)+"% del tempo";
   string str_ovs="in area oversold per il "+DoubleToString(ovs,2)+"% del tempo";
//--- mostra i dati sul chart
   CreateLabel("top",5,60,str,clrDodgerBlue);
   CreateLabel("overbought",5,35,str_ovb,clrDodgerBlue);
   CreateLabel("oversold",5,10,str_ovs,clrDodgerBlue);
//--- redisegna il chart
   ChartRedraw(0);
//--- pausa
   Sleep(10000);
  }
//+--------------------------------------------------------------------------------+
//| Mostra i commenti sull' angolo sinistro superiore del chart                    |
//+--------------------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
                 const string str,const color clr)
  {
//--- crea l'etichetta
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- associa l'etichetta verso l'angolo in basso a sinistra
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- cambia la posizione del punto di ancoraggio
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- distanza dal punto di ancoraggio in direzione-X
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- distanza dal punto di ancoraggio in direzione-Y
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- testo dell'etichetta
   ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- colore del testo
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- grandezza del testo
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
  }