ArrayBsearch

Busca el valor especificado en el array numérico multidimensional ordenado en orden ascendente. La búsqueda se realiza por los elementos de la primera dimensión.

Para buscar en un array del tipo double

int  ArrayBsearch(
   const double&    array[],   // array para la búsqueda
   double           value      // lo que buscamos
   );

Para buscar en un array del tipo float

int  ArrayBsearch(
   const float&    array[],   // array para la búsqueda
   float           value      // lo que buscamos
   );

Para buscar en un array del tipo long

int  ArrayBsearch(
   const long&    array[],   // array para la búsqueda
   long           value      // lo que buscamos
   );

Para buscar en un array del tipo int

int  ArrayBsearch(
   const int&    array[],   // array para la búsqueda
   int           value      // lo que buscamos
   );

Para buscar en un array del tipo short

int  ArrayBsearch(
   const short&    array[],   // array para la búsqueda
   short           value      // lo que buscamos
   );

Para buscar en un array del tipo char

int  ArrayBsearch(
   const char&    array[],   // array para la búsqueda
   char           value      // lo que buscamos
   );

Parámetros

array[]

[in]  Array numérico para la búsqueda.

value

[in]  Valor para la búsqueda.

Valor devuelto

Devuelve el índice del elemento encontrado. Si el valor buscado no ha sido encontrado, la función devuelve el índice del elemento más cercano por el valor.

Nota

La búsqueda binaria procesa sólo los arrays clasificados. Para clasificar un array numérico se utiliza la función ArraySort().

Ejemplo:

#property description "Script a base de los datos del indicador RSI muestra en la ventana del gráfico"
#property description "la información sobre la frecuencia con la que el mercado se encuentra en las zonas de sobrecompra"
#property description "y sobreventa durante el período de tiempo especificado.
//--- mostramos la ventana de los parámetros de entrada durante el arranque del script
#property script_show_inputs
//--- parámetros de entrada
input int                InpMAPeriod=14;                    // Período de Media móvil
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;       // Tipo del precio
input double             InpOversoldValue=30.0;             // Nivel de sobreventa
input double             InpOverboughtValue=70.0;           // Nivel de sobrecompra
input datetime           InpDateStart=D'2012.01.01 00:00';  // Fecha de inicio del análisis
input datetime           InpDateFinish=D'2013.01.01 00:00'; // Fecha de finalización del análisis
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double rsi_buff[]; // array de valores del indicador
   int    size=0;     // tamaño del array
//--- obtenemos el manejador del indicador RSI
   ResetLastError();
   int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
   if(rsi_handle==INVALID_HANDLE)
     {
      //--- fallo al obtener el manejador del indicador
      PrintFormat("Fallo al obtener el manejador. Código del error = %d",GetLastError());
      return;
     }
//--- seguimos en el ciclo hasta que el indicador no termine de calcular todos sus valores
   while(BarsCalculated(rsi_handle)==-1)
     {
      //--- salimos si el usuario finaliza el trabajo del script de forma forzada
      if(IsStopped())
         return;
      //--- retardo para que al indicador le de tiempo a calcular sus valores
      Sleep(10);
     }
//--- copiamos los valores del indicador durante un período determinado
   ResetLastError();
   if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
     {
      PrintFormat("Fallo al copiar los valores del indicador. Código del error = %d",GetLastError());
      return;
     }
//--- obtenemos el tamaño del array
   size=ArraySize(rsi_buff);
//--- clasificamos el array
   ArraySort(rsi_buff);
//--- averiguamos el porcentaje de tiempo durante el que el mercado se encuentra en la zona de sobreventa
   double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- averiguamos el porcentaje de tiempo durante el que el mercado se encuentra en la zona de sobrecompra
   double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- formamos cadenas para visualizar los datos
   string str="De "+TimeToString(InpDateStart,TIME_DATE)+" a "
              +TimeToString(InpDateFinish,TIME_DATE)+" el mercado estaba:";
   string str_ovb="en la zona de sobrecompra "+DoubleToString(ovb,2)+"% de tiempo";
   string str_ovs="en la zona de sobreventa "+DoubleToString(ovs,2)+"% de tiempo";
//--- mostramos los datos en el gráfico
   CreateLabel("top",5,60,str,clrDodgerBlue);
   CreateLabel("overbought",5,35,str_ovb,clrDodgerBlue);
   CreateLabel("oversold",5,10,str_ovs,clrDodgerBlue);
//--- redibujamos el gráfico
   ChartRedraw(0);
//--- retardo
   Sleep(10000);
  }
//+------------------------------------------------------------------+
//| Mostrar comentario en la esquina inferior izquierda del gráfico  |
//+------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
                 const string str,const color clr)
  {
//--- crear etiqueta
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- anclar etiqueta a la esquina inferior izquierda
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- cambiamos la posición del punto de anclaje
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- distancia del punto de anclaje por el eje X
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- distancia del punto de anclaje por el eje Y
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- texto de la etiqueta
   ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- color del texto
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- tamaño del texto
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
  }