CopyBuffer

Ottiene dati di un buffer specificato di un certo indicatore nella quantità necessaria.

copyBuffer

Il conteggio degli elementi di dati copiati (buffer indicatore con l'indice buffer_num) dalla posizione iniziale viene eseguito dal presente al passato, cioè, la posizione iniziale di 0 significa la barra di corrente (valore indicatore per la barra corrente).

Quando si copia una quantità ancora sconosciuta di dati, si raccomanda di utilizzare un array dinamico come un buffer[] recipient buffer, poiché la funzione CopyBuffer() tenta di allocare la dimensione dell'array di ricezione per la dimensione dei dati copiati. Se un buffer di indicatore (array che è pre-assegnato per memorizzare i valori degli indicatori dalla funzione SetIndexBufer()) viene usato come buffer[] recipient array, la copia parziale è consentita. Un esempio può essere trovato nell' indicatore personalizzato Awesome_Oscillator.mql5 nel pacchetto standard del terminale .

Se avete bisogno di fare una copia parziale dei valori degli indicatori in un altro array (buffer non-indicatore), è necessario utilizzare un array intermedio, al quale il numero desiderato viene copiato. Dopo ciò, condurre la copia dell'elemento del numero richiesto di valori nel posto richiesto se un gruppo ricevente da questo intermedia.

Se si conosce la quantità necessaria di dati da copiare, dovrebbe essere meglio fatto in un buffer allocato in modo statico, al fine di evitare un' allocazione eccessiva di memoria.

Non importa ciò che è di proprietà dell'array di destinazione - as_series=true o as_series=false. I dati verranno copiati in modo che l'elemento più vecchio sarà situato all'inizio della memoria fisica allocata per l'array. Ci sono 3 varianti di chiamate di funzione.

Chiamate dalla prima posizione ed il numero di elementi richiesti

int  CopyBuffer(
   int       indicator_handle,     // handle indicatore
   int       buffer_num,           // numero del buffer indicatore
   int       start_pos,            // posizione di inizio
   int       count,                // quantità da copiare
   double    buffer[]              // array target in cui copiare
   );

Chiamata dalla data di inizio e il numero di elementi richiesti

int  CopyBuffer(
   int       indicator_handle,     // handle indicatore
   int       buffer_num,           // numero del buffer indicatore
   datetime  start_time,           // ora e data di inizio
   int       count,                // quantità da copiare
   double    buffer[]              // array destinazione da copiare
   );

Chiamata per le date di inizio e di fine di un intervallo di tempo richiesto

int  CopyBuffer(
   int       indicator_handle,     // handle indicatore
   int       buffer_num,           // numero del buffer indicatore
   datetime  start_time,           // ora e data di inizio
   datetime  stop_time,            // ora e data di fine
   double    buffer[]              // array target in cui copiare
   );

Parametri

indicator_handle

[in] L' handle indicatore, restituito dalla funzione indicatore corrispondente.

buffer_num

[in] In numero di buffer indicatore.

start_pos

[in] La posizione del primo elemento da copiare.

count

[in] Conteggio dati da copiare.

start_time

[in] Tempo Barra, corrispondente al primo elemento.

stop_time

[in] Tempo Barra, corrispondente all'ultimo elemento.

buffer[]

[out]  Array of double type.

Valore restituito

Restituisce il numero di dati copiati o -1 in caso di errore.

Nota

Quando si richiedono dati dall'indicatore, se le timeseries richieste non sono ancora costruite o hanno bisogno di essere scaricati dal server, la funzione restituisce immediatamente -1, ma il processo di download/costruzione verrà avviato.

Quando si richiedono dati da un Expert Advisor o uno script, verrà avviato il download dal server, se il terminale non dispone di questi dati a livello locale, o la costruzione delle timeserie richieste avrà inizio, se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione restituisce la quantità di dati che sarà pronta dal momento dell'espirazione del timeout.

Esempio:

//+--------------------------------------------------------------------------------+
//|                                                            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
//--- parametri di input
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;
//--- buffers indicatore
double                   MABuffer[];
int                      ma_handle;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato                         |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//--- mappatura buffers indicatore
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   Print("Parameter AsSeries = ",AsSeries);
   Print("Buffer Indicatore dopo SetIndexBuffer() è una = ",
         ArrayGetAsSeries(MABuffer));
//--- Imposta il nome breve indicatore
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//--- imposta AsSeries (dependes dal parametro di input)
   ArraySetAsSeries(MABuffer,AsSeries);
   Print("Buffer indicatore dopo ArraySetAsSeries(MABuffer,true); è una timeseries = ",
         ArrayGetAsSeries(MABuffer));
//---
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
   return(INIT_SUCCEEDED);
  }
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato                                |
//+--------------------------------------------------------------------------------+
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[])
  {
//--- controllare se tutti i dati calcolati
   if(BarsCalculated(ma_handle)<rates_total) return(0);
//--- non possiamo copiarli tutti
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      //--- l'ultimo valore viene sempre copiato
      to_copy++;
     }
//--- prova a copiare
   if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
//--- restituisce il valore di prev_calculated per la prossima chiamata
   return(rates_total);
  }
//+--------------------------------------------------------------------------------+

L'esempio precedente illustra come un buffer indicatore viene riempito con i valori di un altro buffer indicatore, dall'indicatore sullo stesso simbolo/periodo.

Vedere l' esempio dettagliato della richiesta dati dello storico di cui al punto Metodi di Binding Oggetti. Lo script disponibile in questa sezione mostra come ottenere i valori degli indicatori iFractals delle ultime 1000 barre e come visualizzare gli ultimi 10 su e 10 giù frattali sul grafico. Una tecnica simile può essere utilizzata per tutti gli indicatori che hanno dati mancanti e che sono solitamente elaborati utilizzando i seguenti stili:

 

Vedi anche

Proprietà degli Indicatori Personalizzati, SetIndexBuffer