CopyTickVolume

Funktion erhaelt im Feld  volume_array historische Daten der minimalen Preisen 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.

CopyTickVolume

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 vetrteilten Puffer, um unnoetige Neuverteilung des Speichers zu vermeiden.

Es ist egal, welche Eigenschaft das Feld-Rezipient 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 Anfangsdatum und Anzahl der angeforderten Elemente

int  CopyTickVolume(
   string           symbol_name,      // Symbolname
   ENUM_TIMEFRAMES  timeframe,        // Periode
   int              start_pos,        // Anfangsposition 
   int              count,            // Anzahl für Kopieren
   long             volume_array[]    // Feld für Kopieren der Tickvolumen  
   );

Aufruf nach Anfangsdatum und Anzahl der angeforderten Elemente

int  CopyTickVolume(
   string           symbol_name,      // Symbolname
   ENUM_TIMEFRAMES  timeframe,        // Periode
   datetime         start_time,       // Anfangsdatum
   int              count,            // Anzahl für Kopieren
   long             volume_array[]    // Feld für Kopieren der Tickvolumen 

Aufruf nach Anfangs- und Beendigungsdatum des angeforderten Zeitintervals

int  CopyTickVolume(
   string           symbol_name,      // Symbolname
   ENUM_TIMEFRAMES  timeframe,        // Periode
   datetime         start_time,       // Anfnagsdatum
   datetime         stop_time,        // Beendigungsdatum
   long             volume_array[]    // Feld für Kopieren der Tickvolumen 
   );

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 entpricht.

volume_array[]

[out]  Feld des Typs long.

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 indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot TickVolume
#property indicator_label1  "TickVolume"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  C'143,188,139'
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      bars=3000;
//--- indicator buffers
double         TickVolumeBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,TickVolumeBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   if(prev_calculated==0)
     {
      long timeseries[];
      ArraySetAsSeries(timeseries,true);
      int prices=CopyTickVolume(Symbol(),0,0,bars,timeseries);
      for(int i=0;i<rates_total-prices;i++) TickVolumeBuffer[i]=0.0; 
      for(int i=0;i<prices;i++) TickVolumeBuffer[rates_total-1-i]=timeseries[prices-1-i]; 
      Print("Wir haben erhalten die folgende Anzahl der historischen Werte TickVolume: "+prices);
     }
   else
     {
      long timeseries[];
      int prices=CopyTickVolume(Symbol(),0,0,1,timeseries);
      TickVolumeBuffer[rates_total-1]=timeseries[0]; 
    ;}  
//--- return value of prev_calculated for next call
   return(rates_total);
  }

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: