ArrayBsearch

Recherche une valeur spécifiée dans un tableau numérique multi-dimmensionnel trié par ordre croissant. La recherche est effectuée parmi les éléments de la première dimension.

Pour chercher dans un tableau d'éléments de type double

int  ArrayBsearch(
   const double&    array[],   // tableau où effectuer la recherche
   double           value      // valeur à rechercher
   );

Pour chercher dans un tableau d'éléments de type float

int  ArrayBsearch(
   const float&    array[],   // tableau où effectuer la recherche
   float           value      // valeur à rechercher
   );

Pour chercher dans un tableau d'éléments de type long

int  ArrayBsearch(
   const long&    array[],   // tableau où effectuer la recherche
   long           value      // valeur à rechercher
   );

Pour chercher dans un tableau d'éléments de type int

int  ArrayBsearch(
   const int&    array[],   // tableau où effectuer la recherche
   int           value      // valeur à rechercher
   );

Pour chercher dans un tableau d'éléments de type short

int  ArrayBsearch(
   const short&    array[],   // tableau où effectuer la recherche
   short           value      // valeur à rechercher
   );

Pour chercher dans un tableau d'éléments de type caractères

int  ArrayBsearch(
   const char&    array[],   // tableau où effectuer la recherche
   char           value      // valeur à rechercher
   );

Paramètres

array[]

[in]  Tableau numérique ou effectuer la recherche.

value

[in]  Valeur à rechercher.

Valeur de Retour

La fonction retourne l'indice de l'élément trouvé. Si la valeur recherchée n'est pas trouvée, la fonction retourne l'indice de l'élément dont la valeur est la plus proche.

Note

La recherche binaire ne s'effectue que sur des tableaux triés. Pour trier des tableaux numériques, utiliser la fonction ArraySort().

Exemple :

#property description "Le script, basé sur l'indicateur RSI, affiche"
#property description "combien de fois le marché était dans les zones"
#property description "de surachat/survente dans l'intervalle de temps spécifié."
//--- affiche la fenêtre des paramètres d'entrée au lancement du script
#property script_show_inputs
//--- paramètres d'entrée
input int                InpMAPeriod=14;                    // Période de la moyenne mobile
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;       // Type du prix
input double             InpOversoldValue=30.0;             // Niveau de survente
input double             InpOverboughtValue=70.0;           // Niveau de surachat
input datetime           InpDateStart=D'2012.01.01 00:00';  // Date de début d'analyse
input datetime           InpDateFinish=D'2013.01.01 00:00'; // Date de fin d'analyse
//+------------------------------------------------------------------+
//| Fonction de démarrage du script                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   double rsi_buff[]; // tableau des valeurs de l'indicateur
   int    size=0;     // taille du tableau
//--- récupère le handle de l'indicateur RSI
   ResetLastError();
   int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
   if(rsi_handle==INVALID_HANDLE)
     {
      //--- échec de récupération du handle de l'indicateur
      PrintFormat("Erreur de récupération du handle de l'indicateur. Code d'erreur = %d",GetLastError());
      return;
     }
//--- boucle tant que toutes les valeurs de l'indicateur n'ont pas été calculées
   while(BarsCalculated(rsi_handle)==-1)
     {
      //--- sort si l'indicateur a été arrêté
      if(IsStopped())
         return;
      //--- pause pour permettre à l'indicateur de calculer toutes ses valeurs
      Sleep(10);
     }
//--- copie les valeurs de l'indicateur pour un certain intervalle de temps
   ResetLastError();
   if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
     {
      PrintFormat("Echec de la copie des valeurs de l'indicateur. Code d'erreur = %d",GetLastError());
      return;
     }
//--- récupère la taille du tableau
   size=ArraySize(rsi_buff);
//--- trie le tableau
   ArraySort(rsi_buff);
//--- recherche du temps passé (en pourcentage) par le marché en zone de survente
   double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- recherche du temps passé (en pourcentage) par le marché en zone de surachat
   double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- crée les chaînes de caractères pour l'affichage des données
   string str="De "+TimeToString(InpDateStart,TIME_DATE)+" à "
              +TimeToString(InpDateFinish,TIME_DATE)+" le marché était :";
   string str_ovb="en zone de surachat "+DoubleToString(ovb,2)+"% du temps";
   string str_ovs="en zone de survente "+DoubleToString(ovs,2)+"% du temps";
//--- affiche les données sur le graphique
   CreateLabel("top",5,60,str,clrDodgerBlue);
   CreateLabel("suracheté",5,35,str_ovb,clrDodgerBlue);
   CreateLabel("survendu",5,10,str_ovs,clrDodgerBlue);
//--- redéssine le graphique
   ChartRedraw(0);
//--- pause
   Sleep(10000);
  }
//+------------------------------------------------------------------+
//| Affiche le commentaire dans le coin inférieur gauche du graphique|
//+------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
                 const string str,const color clr)
  {
//--- crée l'étiquette
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- lie le lable au coin inférieur gauche
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- change la position du point d'ancrage
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- distance depuis le point d'ancrage dans la direction X
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- distance depuis le point d'ancrage dans la direction Y
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- texte de l'étiquette
   ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- couleur du texte
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- taille du texte
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
  }