MetaTrader 5 herunterladen

ArrayBsearch

Sucht nach dem angegebenen Wert in einem aufsteigend sortierten mehrdimensionalen Array. Es wird unter Elementen der ersten Dimension ermittelt.

für Suchen im Array des Typs double

int ArrayBsearch(
   const double&    array[],   // das Array für die Suche 
   double           value      // was wird gesucht
   );

für Suche im Array des Typs float

int ArrayBsearch(
   const float&    array[],   // das Array für die Suche 
   float           value      // was wird gesucht
   );

für Suche im Array des Typs long

int ArrayBsearch(
   const long&    array[],   // das Array für die Suche 
   long           value      // was wird gesucht
   );

für Suche im Array des Typs int

int ArrayBsearch(
   const int&    array[],   // Array für die Suche
   int           value      // was wird gesucht
   );

für Suche im Array des Typs short

int ArrayBsearch(
   const short&    array[],   // Array für die Suche
   short           value      // was wird gesucht
   );

für Suche im Array des Typs char

int ArrayBsearch(
   const char&    array[],   // Array für die Suche
   char           value      // was wird gesucht
   );

Parameter

array[]

[in]  Numerisches Array für die Suche.

value

[in]  Wert für die Suche.

Rückgabewert

Gibt Index des gefundenen Elementes zurück. Wenn der gesuchte Wert nicht gefunden wird, wird Index des Elementes, der den nächsten Wert hat.

Bemerkung

Binäre Suche verarbeitet sortierte Arrays nur. Für Sortieren des numerischen Arrays wird die Funktion ArraySort() verwendet.

Beispiel:

#property description "Skript auf der RSI Indikator wird im Chart Fenster angezeigt"
#property description "die Daten wie oft der Markt in eine überkauft"
#property description "und überverkauft Zonen in den angegebenen Zeitraum war."
//--- Beim Starten des Skripts zeigen Sie den Fenster mit den Eingabeparametern an 
#property script_show_inputs
//--- Eingabeparameters
input int                InpMAPeriod=14;                    // Periode des gleitenden Durchschnitts
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;       // Preistyp
input double             InpOversoldValue=30.0;             // Überverkauft Ebene
input double             InpOverboughtValue=70.0;           // Überkauft Ebene
input datetime           InpDateStart=D'2012.01.01 00:00';  // Das Anfangsdatum der Analyse
input datetime           InpDateFinish=D'2013.01.01 00:00'; // das Abschlußdatum der Analyse
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double rsi_buff[]; // das Array der Indikatorwerte
   int    size=0;     // die Größe des Arrays
//--- erhalten Sie die Handle des RSI Indikators
   ResetLastError();
   int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
   if(rsi_handle==INVALID_HANDLE)
     {
      //--- Es misslang, Handle des Indikators zu bekommen
      PrintFormat("Fehler beim Erhalten die Handle des Indikators. Fehlercode = %d",GetLastError());
      return;
     }
//--- Wir befinden uns im Zyklus, bis der Indikator alle Werten berechnen wird
   while(BarsCalculated(rsi_handle)==-1)
     {
      //--- Wir gehen hinaus, wenn der Benutzer die Arbeit des Skripts zwangsläufig beendet hat
      if(IsStopped())
         return;
      //--- die Verzögerungszeit, damit der Indikator geschafft, seine Werte zu berechnen
      Sleep(10);
     }
//--- kopieren Sie die Indikatorwerte für eine angegebene Period
   ResetLastError();
   if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1)
     {
      PrintFormat("Es misslang, die Indikatorwerte zu kopieren. Fehlercode = %d",GetLastError());
      return;
     }
//--- erhalten Sie die Größe des Arrays
   size=ArraySize(rsi_buff);
//--- sortieren Sie das Array
   ArraySort(rsi_buff);
//--- erkennen Sie welches Prozent der Zeit sich den Markt in der überverkauft Zone befand
   double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size;
//--- erkennen Sie welches Prozent der Zeit sich den Markt in der überkauft Zone befand
   double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size;
//--- bilden Sie die Zeilen für die Schlussfolgerung der Daten
   string str="Seit "+TimeToString(InpDateStart,TIME_DATE)+" bis "
              +TimeToString(InpDateFinish,TIME_DATE)+" der Markt ist in:";
   string str_ovb="den überkauft Zone "+DoubleToString(ovb,2)+"% Zeit";
   string str_ovs="den überverkauft Zone "+DoubleToString(ovs,2)+"% Zeit";
//--- zeigen Sie die Daten in der Chart
   CreateLabel("top",5,60,str,clrDodgerBlue);
   CreateLabel("overbought",5,35,str_ovb,clrDodgerBlue);
   CreateLabel("oversold",5,10,str_ovs,clrDodgerBlue);
//--- zeichnen Sie die Chart
   ChartRedraw(0);
//--- die Verzögerung
   Sleep(10000);
  }
//+------------------------------------------------------------------+
//| Zeigt den Kommentar in der unteren linken Ecke der Chart         |
//+------------------------------------------------------------------+
void CreateLabel(const string name,const int x,const int y,
                 const string str,const color clr)
  {
//--- Label erstellen
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- Bindung von Label zu dem linken unteren Ecke
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
//--- ändern Sie die Position der Ankerpunkt
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
//--- die Länge der X-Achse von der Ankerpunkt
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
//--- die Länge der Y-Achse von der Ankerpunkt
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- der Text-Label
   ObjectSetString(0,name,OBJPROP_TEXT,str);
//--- die Textfarbe
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- die Textgröße
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
  }