CopyHigh

Funktion erhaelt im Feld high_array historische Daten der Eroeffnungszeit der Bars für das angegebene Paar Symbol-Periode in der angegebenen Menge.  Es muss bemerkt werden, dass Abzählen der Elemente von der Startposition von der Gegenwart zur Vergangenheit durchgeführt wird, d.h. die Anfangsposition, 0, bedeutet die laufende Bar.  

CopyHigh

Beim Kopieren der im voraus unbekannten Anzahl der Daten ist es empfehlenswert, als Feld-Rezipient ein dynamisches Feld zu verwenden, denn wenn die Anzahl der Daten weniger (oder mehr) ist, als ein Feld enthalten kann, versucht man das Feld so zu verteilen, dass die angeforderten Daten vollstaendig hineinpassen.

Wenn man die im voraus bekannte Anzahl der Daten kopieren muss, ist es besser dafür einen statisch verteilten Puffer zu verwenden, um unnoetige Neuverteilung des Speichers zu vermeiden.

Es ist egal, welche Eigenschaft das Empfangsfeld hat  - as_series=true oder as_series=false, Daten werden so kopiert, dass das aelteste Element am Anfang des physischen Speichers sein wird, der für das Feld verteilt wurde. Es gibt 3 Varianten der Funktion.

Aufruf nach Anfangsposition und Anzahl der angeforderten Elemente

int  CopyHigh(
   string           symbol_name,      // Symbolname
   ENUM_TIMEFRAMES  timeframe,        // Periode
   int              start_pos,        // Anfangsdatum
   int              count,            // Anzahl für Kopieren
   double           high_array[]      // Feld für Kopieren der maximalen Preise 
   );

Aufruf nach Anfangsdatum und Anzahl der angeforderten Elemente

int  CopyHigh(
   string           symbol_name,      // Symbolname
   ENUM_TIMEFRAMES  timeframe,        // Periode
   datetime         start_time,       // Anfangsdatum
   int              count,            // Anzahl für Kopieren
   double           high_array[]      // Feld für Kopieren der maximalen Preise 
   );

Aufruf nach Anfangs- und Beendigungsdatum des angeforderten Zeitintervals

int  CopyHigh(
   string           symbol_name,      // Symbolname
   ENUM_TIMEFRAMES  timeframe,        // Periode
   datetime         start_time,       // Anfangsdatum
   datetime         stop_time,        // Beendigungsdatum
   double           high_array[]      // Feld für Kopieren der maximalen Preise 
   );

Parameter

symbol_name

[in]  Symbol.

timeframe

[in]  Periode.

start_pos

[in]  Nummer des ersten kopierten Elementes.

count

[in]  Anzahl der kopierten Elemente.

start_time

[in] Barzeit, die dem ersten Element entspricht.

stop_time

[in] Barzeit, die dem letzten Element entspricht.

high_array[]

[out]  Feld des Typs double.

Rückgabewert

Anzahl der kopierten Elemente des Feldes oder  -1 beim Fehler.

Hinweis

Wenn das Interval der angeforderten Daten ausser den zugänglichen Daten auf dem Server ist, kehrt die Funktion -1 zurück. Falls die Daten ausserhalb TERMINAL_MAXBARS angefordert werden (maximale Anzahl der Bars auf dem Chart) gibt die Funktion auch -1 zurück.

Wenn die angeforderten Timeserien noch nicht gebildet sind oder müssen vom Server geladen werden, kehrt die Funktion sofort bei der Anforderung der Daten aus dem Indikator  -1 zurück, aber dabei wird das Prozess der Ladung/Bildung initialisiert.

Bei der Anforderung der Daten aus dem Experten oder Script wird die Ladung vom Server initialisiert, wenn dieses Terminal keine lokale Daten hat oder Bildung der notwendigen Timeserie fängt an, wenn Daten aus der lokalen Geschichte gebildet werden kann, aber sie sind noch nicht fertig.  Funktion kehrt diese Anzahl der Daten, die zum Augenblick des Timeoutsablaufs fertig sind, aber Ladung der Geschichte wird fortsetzen und bei der weiteren analogischen Anforderung kehrt die Funktion schon mehr Daten zurück.

Bei der Anforderung der Daten nach Anfangsdatum und Anzahl der angeforderten Elemente kehren nur die Daten zurück, deren Datum kleiner (früher) oder gleich dem angegebenen Datum ist. Dabei wird das Interval mit Genauigkeit bis zur Sekunde vorgegeben und berücksichtigt. D.h. die Zeit der Öffnung jeder Bar, für die der Wert zurückgegeben wird (Volumen, Spread, Wert im Indikatorpuffer, Preis Open, High, Low, Close oder Zeit der Öffnung Time), ist immer gleich oder kleiner als das angegebene Datum.

Bei der Anforderung der Daten im vorgegebenen Datenbereich kehren nur die Daten zurück, die in das angeforderte Interval kommen, dabei wird das Interval mit Genauigkeit bis zur Sekunde vorgegeben und berücksichtigt. D.h. die Zeit der Öffnung jeder Bar, für die der Wert zurückgegeben wird (Volumen, Spread, Wert im Indikatorpuffer, Preis Open, High, Low, Close oder Zeit der Öffnung Time) befindet sich immer im angeforderten Interval.

So wenn der laufende Wochentag Samstag ist, kehrt die Funktion beim Versuch, Daten in dem wöchentlichen Timeframe mit Andeutung start_time=Letzter_Dienstag und stop_time=Letzter_Freitag zu kopieren,  0 zurück, denn die Eröffnungszeit im wöchentlichen Timeframe ist immer der Sonntag, aber keine angegebene Bar gerät in den angegebenen Bereich.

Wenn man muss, den ersten Wert zu erhalten, der der laufenden nicht beendeten Bar entspricht, kann man die erste Aufrufform mit der Andeutung start_pos=0 und count=1 verwenden.

Beispiel:

#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description "Beispiel der Ausgabe der Werte High[i] und Low[i]"
#property description "für Bars, die zufaellig gewaehlt wurden"
 
double High[],Low[];
//+------------------------------------------------------------------+
//| Bekommen wir Low für die angegebene Nummer der Bar               |
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| Bekommen wir High für die angegebene Nummer der Bar              |
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- geben wir für jeden Tick die Werte High und Low für Bar mit Index aus, 
//--- der einer Ticksekunde gleich ist
   datetime t=TimeCurrent();
   int sec=t%60;
   printf("High[%d] = %G  Low[%d] = %G",
          sec,iHigh(Symbol(),0,sec),
          sec,iLow(Symbol(),0,sec));
  }

Sehen Sie ein umfassenderes Beispiel von Anfrage der historischen Daten in Methode der Objektbindung. Der Skript zeigt, wie Daten von Indikator iFractals an den letztem 1000 Balken zu erhalten und wie dann die letzten 10 Fraktale nach oben und 10 Fraktale nach unten auf dem Chart anzuzeigen. Sie können eine ähnliche Technik für alle Indikatoren, die fehlende Werte haben und typischerweise unter Verwendung der folgenden Stil hergestellt werden, verwenden: