CopyBuffer

Bekommt  Daten des angegebenen Puffers in der angegebenen Zahl. Es gibt 3 Varianten der Funktion.

CopyBuffer

Abzählen der Elemente der kopierten Daten (Indikatorpuffer mit dem Index buffer_num) von der Startposition wird von der Gegenwart zur Vergangenheit durchgeführt, d. h. die Startposition, 0. bedeutet die laufende Bar (Indikatorwert für die laufende Bar).

Als Feld-Rezipient buffer[] ist es wünschenswert, ein dynamisches Feld zu verwenden, denn die Funktion CopyBuffer() versucht, die Größe des Feld-Rezipienten für Größe der kopierten Daten zu verteilen. Wenn als Feld-Rezipient buffer[] ein Indikatorpuffer auftritt (Feld, das für Aufbewahren der Indikatorwerte durch die Funktion SetIndexBufer() verteilt wurde), ist partielles Kopieren zugelassen. Beispiel kann man im Benutzerindikator Awesome_Oscillator.mq5 in der Standardlieferung des Terminals sehen.

Wenn es erforderlich ist, Indikatorwerte in ein anderes Feld (nicht Indikatorpuffer)partiell zu kopieren, muss man dazu ein Zwischenfeld verwenden, in das die erforderliche Anzahl kopiert wird. Und von diesen Zwischenfeld wird die erforderliche Anzahl der Werte in die notwendigen Stellen des Feld-Rezipienten elementenweise kopiert.  

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  CopyBuffer(
   int       indicator_handle,     // handle des Indikators
   int       buffer_num,           // Nummer des Puffers des Indikators 
   int       start_pos,            // Anfangsposition 
   int       count,                // Anzahl für Kopieren 
   double    buffer[]              // Feld, wohin Daten kopiert werden 
   );

Aufruf nach Anfangsdatum und Anzahl der angeforderten Elemente

int  CopyBuffer(
   int       indicator_handle,     // handle des Indikators
   int       buffer_num,           // Nummer des Puffers des Indikators 
   datetime  start_time,           // Anfangsdatum
   int       count,                // Anzahl für Kopieren
   double    buffer[]              // Feld, wohin Daten kopiert werden 
   );

Aufruf nach Anfangs- und Beendigungsdatum des angeforderten Zeitintervals

int  CopyBuffer(
   int       indicator_handle,     // handle des Indikators
   int       buffer_num,           // Nummer des Puffers des Indikators 
   datetime  start_time,           // Anfangsdatum
   datetime  stop_time,            // Beendigungsdatum
   double    buffer[]              // Feld, wohin Daten kopiert werden 
   );

Parameter

indicator_handle

[in]  Handle des Indikators, das durch die Indikatorfunktion zurückgegeben wird.

buffer_num

[in]  Nummer des Puffers des Indikators.

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.

buffer[]

[out]  Feld des Typs double.

Rückgabewert

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

Hinweis

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.

Beispiel:

//+------------------------------------------------------------------+
//|                                              TestCopyBuffer3.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot MA
#property indicator_label1  "MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input bool               AsSeries=true;
input int                period=15;
input ENUM_MA_METHOD     smootMode=MODE_EMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int                shift=0;
//--- indicator buffers
double                   MABuffer[];
int                      ma_handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   Print("Prameter AsSeries =",AsSeries);
   Print("Indikatorpuffer nach SetIndexBuffer() ist eine Zeitreihe = ",
         ArrayGetAsSeries(MABuffer));
//--- set short indicator name
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//--- set AsSeries(dependes from input parameter)
   ArraySetAsSeries(MABuffer,AsSeries);
   Print("Indikatorpuffer nach ArraySetAsSeries(MABuffer,true); ist eine Zeitreihe = ",
         ArrayGetAsSeries(MABuffer));
//---
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
   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[])
  {
//--- check if all data calculated
   if(BarsCalculated(ma_handle)<rates_total) return(0);
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      //--- last value is always copied
      to_copy++;
    ;}
//--- try to copy
   if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Im oben angeführten Beispiel ist die Ausfüllung des Indikatorpuffers durch Werte eines anderen Indikatorpuffers vom Indikator in demselben Symbol/Periode dargestellt.

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:

 

Sehen Sie auch

Eigenschaften der Benutzerindikatoren, SetIndexBuffer