Zugang zu Zeitreihen und Daten der Indikatoren

Funktionen für Arbeit mit Zeitreihen und Indikatoren. Zeitreihe unterscheidet sich vom Feld dadurch, dass Indizieren der Elemente einer Zeitreihe vom Ende des Feldes zum Anfang des Feldes durchgeführt wird (von den neuesten Daten zu den aeltesten). Für Kopieren der Werte der Zeitreihe ist es empfehlenswert nur dynamische Felder zu verwenden, denn die Kopierfunktionen verteilen die erforderliche Größe der Felder, die die Werte empfangen.

Es gibt eine wichtige Ausnahme von dieser Regel: wenn Kopieren der Zeitreihen und Indikatorwerte oft durchgeführt werden muss, ZB bei jedem Aufruf OnTick() in Experten oder bei jedem Aufruf OnCalculate() in Indikatoren, ist es besser statisch verteilte Felder zu verwenden, denn Operationen der Speicherverteilung für dynamische Felder erfordert zusaetzliche Zeit und das wird beim Testen oder Optimierung der Experte bedeutend sein.

Bei der Verwendung der Funktionen des Zugangs zu Zeitreihen und Werten des Indikators muss man Richtung des Indizierens beachten, das wird ausführlich im Abschnit Richtung des Indizierens in Feldern und Zeitreihen beschrieben.

Zugang zu Werten der Indikatoren und Zeitreihen wird unabhängig davon durchgeführt, ob die angeforderten Daten fertig sind (der sogenannte asynchroner Zugang). Das ist kritisch bedeutsam für Berechnung der Benutzerindikatoren, darum geben die Funktionen des Typs Copy...() beim Fehlen der angeforderten Daten sofort den Fehler zurück. Aber beim Zugang von Experten und Scripts versucht man mehrmals Daten zu erhalten und dabei mit einer Pause, die die Zeit für Ladung fehlender Zeitreihen oder für Berechnung der Indikatorwerte bereitzustellen is.

Im Abschnitt Datenzugang organisieren beschreibt man die Erhaltung, Aufbewahren und Anforderung der Preisdaten im Client-Terminal MetaTrader 5.

Richtung des Indizierens in einer Zeitreihe und in einem normalen Feld

Es ist historisch bedingt, dass Zugang zu Daten im Preisfeld vom Ende der Daten durchgeführt wurde. Physikalisch werden neue Daten an Ende des Feldes geschrieben, aber Index dieses Feldes ist immer 0. Index 0 im Feld-Zeitreihe bedeutet Daten der laufenden Bar, d. h. der Bar, die dem unbeendeten Zeitinterval auf dem Timeframe entspricht.    

Timeframe ist  Zeitperiode, während der die einzelne Preisbar gebildet wird; insgesamt werden 21 Standardtimeframes vorbestimmt.

Funktion

Massnahme

SeriesInfoInteger

Gibt die Information über den Zustand der historischen Daten zurück

Bars

Gibt die die entsprechende PeriodeAnzahl der Bars in der Geschichte für das entsprechende Symbol und die entsprechende Periode

BarsCalculated

Gibt die Anzahl der berechneten Daten im Anzeigerpuffer oder -1 beim Fehler (Daten sind noch nicht berechnet)

IndicatorCreate

Gibt handle des angegebenen technischen Anzeigers zurück, das vom Feld des Typs Parameter MqlParam erzeugt wurde

IndicatorParameters

Basierend auf das angegebenen Handle gibt Anzahl von Eingabeparametern des Indikators, sowie die Werte und Type der Parameter zurück

IndicatorRelease

Entfernt handle des Anzeigers und befreit den Berechnungsteol des Anzeigers, wenn niemand den verwendet

CopyBuffer

Bekommt Daten des angegebenen Puffers vom angegebenen Anzeiger im Feld

CopyRates

Bekommt historische Daten der Struktur Rates für das angegebene Symbol und Periode

CopySeries

Ruft die synchronisierten Zeitreihen ab aus der Struktur MqlRates für den angegebene Zeitrahmen des Symbols und der angegebenen Anzahl

CopyTime

Bekommt im Feld historische Daten über die Eroeffnungszeit der Bars für das angegebene Symbol und Periode

CopyOpen

Bekommt im Feld historische Daten über die Eroeffnungszeit der Bars für das angegebene Symbol und Periode

CopyHigh

Bekommt im Feld historische Daten über den maximalen Preis der Bars für das angegebene Symbol und Periode

CopyLow

Bekommt im Feld historische Daten über den minimalen Preis der Bars für das angegebene Symbol und Periode

CopyClose

Bekommt im Feld historische Daten über den Schlusspreis der Bars für das angegebene Symbol und Periode

CopyTickVolume

Bekommt im Feld historische Daten über Tickvolumen der Bars für das angegebene Symbol und Periode

CopyRealVolume

Bekommt im Feld historische Daten über Handelsvolumen der Bars für das angegebene Symbol und Periode

CopySpread

Bekommt im Feld historische Daten über Spreads für das angegebene Symbol und Periode

CopyTicks

Erhält für die aktuelle Arbeitssitzung angesammelten Ticks ins Array ticks_array

CopyTicksRange

Die Funktion erhält Ticks vom Typ MqlTick aus einem bestimmten Zeitbereich ins Array ticks_array

iBars

Gibt die Anzahl der Balken in der Historie nach dem entsprechenden Symbol und Zeitrahmen zurück

iBarShift

Gibt den Index des Balkens zurück, der der angegebenen Zeit entspricht

iClose

Gibt den Close-Preis des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück

iHigh

Gibt den High-Preis des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück

iHighest

Gibt den Index des größten gefundenen Wertes (Verschiebung relativ zum aktuellen Balken) des entsprechenden Charts zurück

iLow

Gibt den Low-Preis des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück

iLowest

Gibt den Index des kleinsten gefundenen Wertes (Verschiebung relativ zum aktuellen Balken) des entsprechenden Charts zurück

iOpen

Gibt den Open-Preis des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück

iTime

Gibt den Zeitpunkt der Eröffnung eines Balkens (der mithilfe des Parameters shift vorgegeben wurde) des entsprechenden Charts zurück

iTickVolume

Gibt den Wert des Tick-Volumens des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück

iRealVolume

Gibt den Wert des echten Volumens des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück

iVolume

Gibt den Wert des Tick-Volumens des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück

iSpread

Gibt den Wert des Spreads des Balkens (der durch den Parameter shift vorgegeben wurde) des entsprechenden Charts zurück

Abgesehen davon, dass durch die Funktion ArraySetAsSeries() der Zugang zu Elementen in Feldern wie in Zeitreihen vorgegeben werden kann, muss man sich daran erinnern, dass Elemente des Feldes in derselben Reihenfolge aufbewahren werden, verändert wird nur Richtung des Indizierens. Diese Tatsache kann am folgenden Beispiel demonstriert werden:

   datetime TimeAsSeries[];
//--- stellen wir Zugang zum Feld wie zur Timeserie ein 
   ArraySetAsSeries(TimeAsSeries,true);
   ResetLastError();
   int copied=CopyTime(NULL,0,0,10,TimeAsSeries);
   if(copied<=0)
     {
      Print("Nicht gelungen, die Eroeffnungszeit für die letzten 10 Bars zu kopieren");
      return;
     }
   Print("TimeCurrent = ",TimeCurrent());
   Print("ArraySize(Time) = ",ArraySize(TimeAsSeries));
   int size=ArraySize(TimeAsSeries);
   for(int i=0;i<size;i++)
     {
      Print("TimeAsSeries["+i+"] = ",TimeAsSeries[i]);
     }
 
   datetime ArrayNotSeries[];
   ArraySetAsSeries(ArrayNotSeries,false);
   ResetLastError();
   copied=CopyTime(NULL,0,0,10,ArrayNotSeries);
   if(copied<=0)
     {
      Print("Nicht gelungen, die Eroeffnungszeit für die letzten 10 Bars zu kopieren");
      return;
     }  
   size=ArraySize(ArrayNotSeries);
   for(int i=size-1;i>=0;i--)
     {
      Print("ArrayNotSeries["+i+"] = ",ArrayNotSeries[i]);
     }

Im Ergebnis haben wir die Ausgabe, wie diese:

TimeCurrent = 2009.06.11 14:16:23
ArraySize(Time) = 10
TimeAsSeries[0] = 2009.06.11 14:00:00
TimeAsSeries[1] = 2009.06.11 13:00:00
TimeAsSeries[2] = 2009.06.11 12:00:00
TimeAsSeries[3] = 2009.06.11 11:00:00
TimeAsSeries[4] = 2009.06.11 10:00:00
TimeAsSeries[5] = 2009.06.11 09:00:00
TimeAsSeries[6] = 2009.06.11 08:00:00
TimeAsSeries[7] = 2009.06.11 07:00:00
TimeAsSeries[8] = 2009.06.11 06:00:00
TimeAsSeries[9] = 2009.06.11 05:00:00
 
ArrayNotSeries[9] = 2009.06.11 14:00:00
ArrayNotSeries[8] = 2009.06.11 13:00:00
ArrayNotSeries[7] = 2009.06.11 12:00:00
ArrayNotSeries[6] = 2009.06.11 11:00:00
ArrayNotSeries[5] = 2009.06.11 10:00:00
ArrayNotSeries[4] = 2009.06.11 09:00:00
ArrayNotSeries[3] = 2009.06.11 08:00:00
ArrayNotSeries[2] = 2009.06.11 07:00:00
ArrayNotSeries[1] = 2009.06.11 06:00:00
ArrayNotSeries[0] = 2009.06.11 05:00:00

Wie es aus der Ausgabe ersichtlich ist, vermindert sich der Wert der Zeit für das Feld TimeAsSeries, d.h. wir bewegen uns von der Gegenwart zur Vergangenheit. Für das normale Feld ArrayNotSeries ist es umgekehrt - mit dem Anstieg des Indexes bewegen wir uns von der Vergangenheit zur Gegenwart.

Sehen Sie auch

ArrayIsDynamic, ArrayGetAsSeries, ArraySetAsSeries, ArrayIsSeries