CopySeries

Obtiene en el conjunto especificado de arrays las series temporales sincronizadas de la estructura MqlRates para símbolo-periodo indicado en el número especificado. Los elementos se contarán partiendo de la posición inicial desde el presente hasta el pasado, es decir, si la posición inicial es igual a 0, esto indicará la barra actual.

copyseries

Al copiar una cantidad de datos previamente desconocida, se recomienda usar como array receptor un array dinámico, ya que si hay más datos de los que puede contener el array, se intentará redistribuir el array de tal forma que los datos solicitados se ajusten por completo.

Si necesitamos copiar una cantidad conocida de datos, será mejor hacerlo en un búfer asignado estáticamente para evitar reasignaciones de memoria innecesarias.

No importa qué propiedad tenga el array receptor: as_series=true o as_series=false, los datos se copiarán de tal forma que el elemento de serie temporal más antiguo se copie al inicio de la memoria física asignada para el array.

int  CopySeries(
   string           symbol_name,       // nombre del símbolo
   ENUM_TIMEFRAMES  timeframe,         // periodo
   int              start_pos,         // desde dónde comenzaremos 
   int              count,             // cuánto copiaremos
   ulong            rates_mask,        // combinación de banderas para indicar las series solicitadas
   void&            array1[],          // array al que se copiarán los datos de la primera serie temporal
   void&            array2[]           // array al que se copiarán los datos de la segunda serie temporal
   ...
   );

Parámetros

symbol_name

[in]  Símbolo.

timeframe

[in]  Periodo.

start_pos

[in]  Número del primer elemento copiado.

count

[in]  Número de elementos copiados.

rates_mask

[in]  Combinación de banderas de la enumeración ENUM_COPY_RATES .

array1, array2,...

[out]  Array del tipo correspondiente para obtener la serie temporal de la estructura MqlRates. Orden de los arrays transmitidos a la función, debe corresponderse con el orden de los campos en la estructura MqlRates.

Valor retornado

Número de elementos copiados del array, o bien -1 en caso de error.

Observación

Si el intervalo de las series temporales se encuentra totalmente fuera de los datos en el servidor, la función retornará -1. Si los datos solicitados se encuentran fuera de TERMINAL_MAXBARS (número máximo de barras en el gráfico), la función también retornará -1.

Al solicitar los datos desde el indicador, si las series temporales solicitadas aún no han sido construidas o deben ser cargadas desde el servidor, la función retornará de inmediato -1, pero, en este caso, el propio proceso de carga/construcción será iniciado.

Al solicitar los datos desde un experto o script, se inicializará la carga desde el servidor, si el terminal no dispone de estos datos a nivel local; o bien comenzará la construcción de la serie temporal necesaria, si los datos se pueden construir a partir de la historia local, pero aún no están preparados. La función retornará la cantidad de datos que estén preparados al momento de finalización del timeout, pero la carga de la historia continuará, y con la siguiente solicitud análoga, la función retornará ya más datos.

Diferencia entre CopySeries y CopyRates

La función CopySeries permite obtener de una sola vez solo las series temporales necesarias en diferentes arrays especificados; en este caso, además, todas estarán sincronizadas entre sí. Esto significa que todos los valores en los arrays resultantes en un índice N específico pertenecerán a la misma barra en el par Símbolo/Marco temporal especificado.  En este caso, el programador no necesitará asegurarse de que todas las series temporales obtenidas estén sincronizadas según la hora de apertura de la barra.

A diferencia de CopyRates, que retorna el conjunto completo de series temporales como una matriz MqlRates, la función CopySeries permite al programador obtener solo las series temporales requeridas como arrays aparte; para ello, deberemos especificar una combinación de banderas para indicar el tipo de series temporales solicitadas. En este caso, el orden de los arrays transmitidos a la función deberá corresponderse con el orden de los campos en la estructura MqlRates:

struct MqlRates
  {
   datetime time;         // hora de inicio del periodo
   double   open;         // precio de apertura
   double   high;         // precio mayor del periodo
   double   low;          // precio menor del periodo
   double   close;        // precio de cierre
   long     tick_volume;  // volumen de ticks
   int      spread;       // spread
   long     real_volume;  // volumen bursátil
  }

De esta forma, si resulta necesario obtener los valores de las series temporales time, close y real_volume para las últimas 100 barras del Símbolo/Marco temporal actual, la llamada deberá ser la siguiente:

datetime time[];
double   close[];
long     volume[];
CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);

En este caso, será importante el orde de los arrays "time, close, volume", este deberá corresponderse con el orden de los campos en la estructura MqlRates. Por otro lado, el orden de los valores en la máscara rates_mask carece de importancia, la máscara podría ser la siguiente:

COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE

Ejemplo:

//--- input parameters
input datetime InpDateFrom=D'2022.01.01 00:00:00';
input datetime InpDateTo  =D'2023.01.01 00:00:00';
input uint     InpCount   =20;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
//--- arrays para obtener las series temporales de la estructura MqlRates
   double   open[];
   double   close[];
   float    closef[];
   datetime time1[], time2[];
//---solicitamos los precios de cierre en un array de tipo double
   ResetLastError();
   int res1=CopySeries(NULLPERIOD_CURRENT0InpCount,
                       COPY_RATES_TIME|COPY_RATES_CLOSEtime1close);
   PrintFormat("1. CopySeries  returns %d values. Error code=%d"res1GetLastError());
   ArrayPrint(close);
  
//--- ahora solicitamos más precios de apertura, y los precios de cierre los solicitamos en un array de tipo float
   ResetLastError();
   int res2=CopySeries(NULLPERIOD_CURRENT0InpCount,
                       COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPENtime2openclosef);
   PrintFormat("2. CopySeries  returns %d values. Error code=%d"res2GetLastError());
   ArrayPrint(closef);
//--- comparamos los datos obtenidos
   if((res1==res2) && (time1[0]==time2[0]))
     {
      Print("  | Time             |    Open      | Close double | Close float |");
      for(int i=0i<10i++)
        {
         PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                     iTimeToString(time1[i]), open[i], close[i], closef[i]);
        }
     }
//--- Resultado
 1. CopySeries  returns 20 values. Error code=0
 [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
 [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
 2. CopySeries  returns 20 values. Error code=0
 [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
 [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
   | Time             |    Open      | Close double | Close float |
 0 | 2023.03.01 17:00 |   1.06660    |   1.06722    |   1.06722   |
 1 | 2023.03.01 18:00 |   1.06722    |   1.06733    |   1.06733   |
 2 | 2023.03.01 19:00 |   1.06734    |   1.06653    |   1.06653   |
 3 | 2023.03.01 20:00 |   1.06654    |   1.06520    |   1.06520   |
 4 | 2023.03.01 21:00 |   1.06520    |   1.06573    |   1.06573   |
 5 | 2023.03.01 22:00 |   1.06572    |   1.06649    |   1.06649   |
 6 | 2023.03.01 23:00 |   1.06649    |   1.06694    |   1.06694   |
 7 | 2023.03.02 00:00 |   1.06683    |   1.06675    |   1.06675   |
 8 | 2023.03.02 01:00 |   1.06675    |   1.06684    |   1.06684   |
 9 | 2023.03.02 02:00 |   1.06687    |   1.06604    |   1.06604   |
//---
  }

Ver también

Estructuras y clases, CopyRates