CopyBuffer

Recibe en el array búfer los datos del búfer especificado del indicador indicado en cantidad especificada.

CopyBuffer

La cuenta de elementos a copiar (búfer de indicadores con el índice buffer_num) desde la posición de inicio se realiza del presente al pasado, es decir, la posición de inicio igual a 0 significa la  barra corriente (valor del indicador para la barra corriente).

Cuando copiamos los datos sin conocer todavía el volumen a copiar, se recomienda usar un array dinámico como array de destino buffer[], puesto que la función CopyBuffer() trata de ajustar el tamaño del array-receptor en función del espacio que ocupan los datos que se copian. Si un búfer de indicador (array preasignado por la función SetIndexBufer() para almacenar los valores del indicador) se usa como el array-receptor buffer[], entonces se admite el copiado parcial. Podemos ver su ejemplo en el indicador personalizado Awesome_Oscillator.mq5 que entra en el pack estándar del terminal.

Si tenemos que copiar parcialmente los valores del indicador a otro array (que no sea un búfer de indicador), para eso hay que usar un array intermedio donde se copia la cantidad necesaria, y luego de este array-intermediario copiar la cantidad necesaria elemento por elemento a lugares correspondientes del array de destino.

Si sabemos la cantidad de datos que tenemos que copiar, con el fin de evitar la asignación excesiva de memoria es mejor hacerlo a un buffer asignado estáticamente.

La propiedad del array de destino no importa, sea as_series=true o sea as_series=false. Los datos van a ser copiados de tal manera que el elemento más antiguo estará al principio de la memoria física que ha sido destinada para el array. Existen 3 variantes de la función.

Llamada según la posición de inicio y el número de elementos requeridos

int  CopyBuffer(
   int       indicator_handle,     // manejador del indicador
   int       buffer_num,           // número del buffer del indicador
   int       start_pos,            // posición de inicio 
   int       count,                // cantidad de datos a copiar
   double    buffer[]              // array de destino en el que se copian los datos
   );

Llamada según la fecha de inicio y el número de elementos requeridos

int  CopyBuffer(
   int       indicator_handle,     // manejador del indicador
   int       buffer_num,           // número del buffer del indicador
   datetime  start_time,           // fecha y hora de inicio
   int       count,                // cantidad de datos a copiar
   double    buffer[]              // array de destino en el que se copian los datos
   );

Llamada según la fecha de inicio y finalización del intervalo de tiempo requerido

int  CopyBuffer(
   int       indicator_handle,     // manejador del indicador
   int       buffer_num,           // número del buffer del indicador
   datetime  start_time,           // fecha y hora de inicio
   datetime  stop_time,            // fecha y hora de finalización
   double    buffer[]              // array de destino en el que se copian los datos
   );

Parámetros

indicator_handle

[in]  Manejador del indicador recibido por la función de indicador correspondiente.

buffer_num

[in]  Número del búfer de indicadores.

start_pos

[in]  Posición del primer elemento a copiar.

count

[in]  Cantidad de elementos a copiar.

start_time

[in]  Hora de la barra correspondiente al primer elemento.

stop_time

[in]  Hora de la barra correspondiente al último elemento.

buffer[]

[out]  Array del tipo double.

Valor devuelto

Cantidad de elementos copiados del array, o -1 en caso del error.

Nota

Al solicitar los datos del indicador, si las series temporales solicitadas todavía no están construidas o hay que bajarlas del servidor, la función devolverá inmediatamente -1. Aunque en este caso, se iniciará el proceso de descarga/construcción.

Cuando se solicitan los datos a un Asesor Experto o un script, se iniciará la descarga desde el servidor si el terminal no dispone de estos datos a nivel local, o se empezará la construcción de la serie temporal necesaria si se puede construir los datos usando el historial local y ellos todavía no están listos. La función devolverá aquella cantidad de datos que estarán listos para el momento de vencimiento de timeout.

Ejemplo:

//+------------------------------------------------------------------+
//|                                              TestCopyBuffer3.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                              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("Parámetro AsSeries = ",AsSeries);
   Print("Búfer de indicadores después de SetIndexBuffer() es una serie temporal = ",
         ArrayGetAsSeries(MABuffer));
//--- set short indicator name
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//--- set AsSeries(dependes from input parameter)
   ArraySetAsSeries(MABuffer,AsSeries);
   Print("Búfer de indicadores después de ArraySetAsSeries(MABuffer,true); es una serie temporal = ",
         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);
  }
//+------------------------------------------------------------------+

En el ejemplo de arriba se nos muestra que el búfer de indicadores se rellena con valores de otro búfer de indicadores perteneciente a indicador del mismo símbolo/período.

Puede encontrar un ejemplo más detallado de la solicitud de datos históricos en la sección Modos de enlace de objetos. En el script de aquella sección se muestra cómo se puede obtener los valores del indicador iFractals sobre las últimas 1000 barras, y cómo luego se puede visualizar en el gráfico los diez últimos fractales arriba y los diez último fractales abajo. Esta técnica puede ser utilizada para todos los indicadores que tienen omisiones de valores y suelen realizarse utilizando los siguientes estilos de construcción:

 

Véase también

Propiedades de indicadores personalizados, SetIndexBuffer