ArrayBsearch

Procura um valor especificado em um array numérico multidimensional ordenado em ordem crescente. A pesquisa é realizada através dos elementos da primeira dimensão.

Para buscar em um array de tipo double

int  ArrayBsearch(
   const double&    array[],   // array para busca
   double           value      // o que é pesquisada por
   );

Para buscar em um array de tipo float

int  ArrayBsearch(
   const float&     array[],   // array para busca
   float            value      // o que é pesquisada por
   );

Para buscar em um array de tipo long

int  ArrayBsearch(
   const long&      array[],   // array para busca
   long             value      // o que é pesquisada por
   );

Para buscar em um array de tipo int

int  ArrayBsearch(
   const int&       array[],   // array para busca
   int              value      // o que é pesquisada por
   );

Para buscar em um array de tipo short

int  ArrayBsearch(
   const short&     array[],   // array para busca
   short            value      // o que é pesquisada por
   );

Para buscar em um array de tipo char

int  ArrayBsearch(
   const char&      array[],   // array para busca
   char             value      // o que é pesquisada por
   );

Parâmetros

array[]

[in]  Array numérico para busca.

value

[in]  Valor para busca.

Valor do Retorno

A função retorna o índice de um elemento encontrado. Se o valor desejado não for encontrado, a função retorna o índice de um elemento mais próximo em valor.

Observação

A busca binária processa somente arrays ordenados. Para ordenar arrays numéricos use a função ArraySort().

Exemplo:

#property description "Script baseado no indicador RSI para visualização de dados"
#property description "quantas vezes o mercado ficou em"
#property description "áreas sobre-compradas e sobre-vendidas em intervalo de tempo específico."
//--- mosta a janela dos parâmetros de entrada quando lançado o script
#property script_show_inputs
//--- parâmetros de entrada
input int                InpMAPeriod=14;                    // Período de média móvel
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;       // Tipo de preço
input double             InpOversoldValue=30.0;             // Nível sobre-vendido
input double             InpOverboughtValue=70.0;           // Nível sobre-comprado
input datetime           InpDateStart=D'2012.01.01 00:00';  // Data de início para análise
input datetime           InpDateFinish=D'2013.01.01 00:00'; // Data final para análise
//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar)                        |
//+------------------------------------------------------------------+
void OnStart()
  {
   double rsi_buff[]; // array do valores do indicador
   int    size=0;     // tamanho de array
//--- receber a manipulação do indicador RSI
   ResetLastError();
   int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
   if(rsi_handle==INVALID_HANDLE)
     {
      //--- falha para receber a manipulação do indicador
      PrintFormat("Manipulador de indicator recebido com erro. Código de erro = %d",GetLastError());
      return;
     }
//--- fica no loop, até que o indicador calcula todos os seus valores
   while(BarsCalculated(rsi_handle)==-1)
     {
      //--- sair se o indicador concluir forçadamente a operação de script
      if(IsStopped())
         return;
      //--- uma pausa para permitir que o indicador calcule todos os seus valores
      Sleep(10);
     }
//--- copiar os valores do indicador para um determinado período de tempo
   ResetLastError();
   if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
     {
      PrintFormat("Falha para copiar valores do indicador. Código de erro = %d",GetLastError());
      return;
     }
//--- recebe o tamanho do array
   size=ArraySize(rsi_buff);
//--- classificar o array
   ArraySort(rsi_buff);
//--- descobrir o tempo (em termos percentuais) que o mercado ficou na área sobre-vendida
   double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- descobrir o tempo (em termos percentuais) que o mercado ficou na área sobre-comprada
   double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- formar as strings para exibir os dados
   string str="A partir de "+TimeToString(InpDateStart,TIME_DATE)+" para "
              +TimeToString(InpDateFinish,TIME_DATE)+" o mercado ficou:";
   string str_ovb="em área sobre-comprada "+DoubleToString(ovb,2)+"% do tempo";
   string str_ovs="em área sobre-vendida "+DoubleToString(ovs,2)+"% do tempo";
//--- mostrar os dados no gráfico
   CreateLabel("topo",5,60,str,clrDodgerBlue);
   CreateLabel("sobre-comprado",5,35,str_ovb,clrDodgerBlue);
   CreateLabel("sobre-vendido",5,10,str_ovs,clrDodgerBlue);
//--- redesenhar o gráfico
   ChartRedraw(0);
//--- pausa
   Sleep(10000);
  }
//+------------------------------------------------------------------+
//| Mostrar comentário no canto inferior esquerdo do gráfico         |
//+------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
                 const string str,const color clr)
  {
//--- cria um rótulo (label)
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- colocar a etiqueta no canto inferior esquerdo
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- alterar a posição do ponto de ancoragem
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- distância a partir do ponto de ancoragem na direção X
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- distância a partir do ponto de ancoragem na direção Y
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- texto do rótulo
   ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- cor do texto
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- tamanho do texto
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
  }