MetaTrader 5 herunterladen

ArraySort

Sortiert ein mehrdimensionales Array aufsteigend in der ersten Dimension.

bool  ArraySort(
   void&  array[]      // Array für Sortieren 
   );

Parameter

array[]

[in][out]  Numerischer Wert für Sortieren.

Rückgabewert

Gibt true beim Erfolg zurück, sonst false.

Hinweis

Das Array wird immer aufsteigend sortiert, unabhängig vom Wert des AS_SERIES Parameters.

Die ArraySort und ArrayBSearch Funktionen nehmen als Parameter ein Array mit beliebig vielen Dimensionen an, dabei erfolgt die Sortierung und die Suche nur in der ersten (zero) Dimension.

Beispiel:

#property description "Der Indikator analysiert die Daten für den letzten Monat und zeichnet alle Kerzen mit den kleinen"
#property description "und größen Tick Volumen aus. Für die Bestimmung solcher Kerzen wird die Sortierung"
#property description "das Tick Volumen Array erzeugt. Die Kerzen, deren Volumen die erste InpSmallVolume"
#property description "der Prozente des Arrays bilden, gelten für die Kleinen. Die Kerzen, deren Tick Volumen "
#property description "die letzte InpBigVolume der Prozente des Arrays bilden, gelten für die Größen."
//--- der Indikator Einstellungen
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   1
//--- plot
#property indicator_label1  "VolumeFactor"
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_color1  clrDodgerBlue,clrOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- vordefinierte Konstante
#define INDICATOR_EMPTY_VALUE 0.0
//--- Eingabeparameters
input int InpSmallVolume=15; // Das Prozent der kleinen Volumen (<50)
input int InpBigVolume=20;   // Das Prozent der größen Volumen (<50)
//--- die Anfangszeit der Analyse (wird sich verschieben)
datetime ExtStartTime;
//--- die Indikator Puffers
double   ExtOpenBuff[];
double   ExtHighBuff[];
double   ExtLowBuff[];
double   ExtCloseBuff[];
double   ExtColorBuff[];
//--- die Grenzwerte der Volumen für die Abbildung der Kerzen
long     ExtLeftBorder=0;
long     ExtRightBorder=0;
//+------------------------------------------------------------------+
//| Erhalten Sie die Grenzwerte für Tick Volumen                     |
//+------------------------------------------------------------------+
bool GetVolumeBorders(void)
  {
//--- Variablen
   datetime stop_time;  // die Abschlusszeit von Kopieren
   long     buff[];     // Der Puffer, wohin wir kopieren werden
//--- Abschlusszeit - aktuelle Zeit
   stop_time=TimeCurrent();
//--- die Anfangszeit - einen Monat früher als die aktuelle
   ExtStartTime=GetStartTime(stop_time);
//--- erhalten Sie die Werte der Tick Volumen
   ResetLastError();
   if(CopyTickVolume(Symbol(),Period(),ExtStartTime,stop_time,buff)==-1)
     {
      //--- Es misslang, die Daten zu bekommen, geben Sie false für den Start der Mannschaft auf die Umrechnung zurück
      PrintFormat("Es misslang, die Werte von Tick Volumen zu bekommen. Fehlercode = %d",GetLastError());
      return(false);
     }
//--- berechnen Sie die Größe des Arrays
   int size=ArraySize(buff);
//--- sortieren Sie das Array
   ArraySort(buff);
//--- bestimmen Sie die Werte der linken und der rechten Grenzen für Tick Volumen
   ExtLeftBorder=buff[size*InpSmallVolume/100];
   ExtRightBorder=buff[(size-1)*(100-InpBigVolume)/100];
//--- die erfolgreiche Ausführung
   return(true);
  }
//+------------------------------------------------------------------+
//| Erhalten Sie dem Datum, einen Monat weniger als der übertragenen |
//+------------------------------------------------------------------+
datetime GetStartTime(const datetime stop_time)
  {
//--- konvertieren Sie die Abschlusszeit zu die Variable von die MqlDateTime-Struktur
   MqlDateTime temp;
   TimeToStruct(stop_time,temp);
//--- erhalten Sie dem Datum, einen Monat weniger
   if(temp.mon>1)
      temp.mon-=1;  // der aktuelle Monat ist nicht das erste des Jahres, d.h. die Nummer ist weniger als die vorherige
   else
     {
      temp.mon=12;  // der aktuelle Monat ist das erste des Jahres, d.h. die Nummer der letzten Monat ist 12 gleich
      temp.year-=1; // und die Nummer des Jahres ist einer Nummer weniger
     }
//--- die Nummer des tages wird nicht mehr als 28
   if(temp.day>28)
      temp.day=28;
//--- geben das bekommene Datum zurück
   return(StructToTime(temp));
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Prüfen Sie, ob die Eingabeparameters den Bedingungen zu Zufriedenheit ausfallen
   if(InpSmallVolume<0 || InpSmallVolume>=50 || InpBigVolume<0 || InpBigVolume>=50)
     {
      Print("Inkorrekt Eingabeparameters");
      return(INIT_PARAMETERS_INCORRECT);
     }
//--- Bindung von Array zum Indikator-Puffer
   SetIndexBuffer(0,ExtOpenBuff);
   SetIndexBuffer(1,ExtHighBuff);
   SetIndexBuffer(2,ExtLowBuff);
   SetIndexBuffer(3,ExtCloseBuff);
   SetIndexBuffer(4,ExtColorBuff,INDICATOR_COLOR_INDEX);
//--- erstellen Sie die Wert, die nicht sichtbar sein werden
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);
//--- stellen Sie die Beschriftungen für die Indikator Puffers
   PlotIndexSetString(0,PLOT_LABEL,"Open;High;Low;Close");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- prüfen Sie, ob es noch die unbearbeiteten Bars sind
   if(prev_calculated<rates_total)
     {
      //--- bekommen Sie die neue Werte der linken und rechten Grenzen für Volumen
      if(!GetVolumeBorders())
         return(0);
     }
//---Variable zur Berechnung den Anfang des Bars
   int start=prev_calculated;
//--- wen die Indikatorwerte auf vorhergehend Tick schon berechnet waren, so ist auf der letzten Bar gearbeitet
   if(start>0)
      start--;
//--- stellen Sie die direkte Richtung der Indizierung in Zeitspanne 
   ArraySetAsSeries(time,false);
   ArraySetAsSeries(open,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(low,false);
   ArraySetAsSeries(close,false);
   ArraySetAsSeries(tick_volume,false);
//--- der Zyklus für Berechnung der Indikatorwerte
   for(int i=start;i<rates_total;i++)
     {
      //--- zeichnen Sie die Kerzen seit dem Anfangsdatum
      if(ExtStartTime<=time[i])
        {
         //--- wenn der Wert ist nicht weniger als die rechte Grenze, dann zeichnen Sie die Kerze
         if(tick_volume[i]>=ExtRightBorder)
           {
            //--- bekommen Sie die Daten um die Kerze zu zeichnen
            ExtOpenBuff[i]=open[i];
            ExtHighBuff[i]=high[i];
            ExtLowBuff[i]=low[i];
            ExtCloseBuff[i]=close[i];
            //--- die Farbe DodgerBlue
            ExtColorBuff[i]=0;
            //--- fahren Sie die Zyklus fort weiter
            continue;
           }
         //--- wenn dir Wert ist nicht mehr als die linke Grenze, dann zeichnen Sie die Kerze
         if(tick_volume[i]<=ExtLeftBorder)
           {
            //--- bekommen Sie die Daten um die Kerze zu zeichnen
            ExtOpenBuff[i]=open[i];
            ExtHighBuff[i]=high[i];
            ExtLowBuff[i]=low[i];
            ExtCloseBuff[i]=close[i];
            //--- die Farbe Orange
            ExtColorBuff[i]=1;
            //--- fahren Sie die Zyklus fort weiter
            continue;
           }
        }
      //--- für die Bars, die nicht in die Berechnung gerieten, stellen Sie der leere Wert
      ExtOpenBuff[i]=INDICATOR_EMPTY_VALUE;
      ExtHighBuff[i]=INDICATOR_EMPTY_VALUE;
      ExtLowBuff[i]=INDICATOR_EMPTY_VALUE;
      ExtCloseBuff[i]=INDICATOR_EMPTY_VALUE;
     }
//--- den Wert prev_calculated für den nächsten Anruf zurückgeben
   return(rates_total);
  }

Sehen Sie auch

ArrayBsearch