Descargar MetaTrader 5
Manual de referencia de MQL5Acceso a las series temporales y a los datos de indicadores 

Acceso a las series temporales y a los datos de indicadores

Estas son las funciones para trabajar con las series temporales e indicadores. Una serie temporal se diferencia de una matriz usual en que la indexación de los elementos de una serie temporal se realiza del final de la matriz al principio (de los datos más recientes a los más antiguos). Se recomienda usar sólo los arrays dinámicos para copiar los valores de series temporales e indicadores, porque las funciones de copiado están diseñadas para asignar de una manera independiente el tamaño necesario de los arrays que reciben los valores.

Hay una importante excepción de esta regla: si necesitamos copiar las series temporales y valores de indicadores con mucha frecuencia, por ejemplo, con cada nueva llamada a OnTick() en los Asesores Expertos o con cada nueva invocación de OnCalculate() en  los indicadores, entonces sería mejor usar los arrays distribuidos estáticamente porque las operaciones de asignación de memoria para las matrices dinámicas requieren su tiempo adicional y eso tendrá su efecto durante los procesos de prueba y optimización.

Cuando usamos las funciones de acceso a las series temporales y a los valores de indicadores, hay que tener en cuenta la dirección de la indexación. Esto está descrito con detalles en la sección llamada Dirección de indexación en los arrays y series temporales.

El acceso a los datos de los indicadores y series temporales se realiza independientemente del hecho de disposición de estos datos solicitados (llamado el acceso asíncrono). Es sumamente importante para la calculación de los indicadores personalizados, por eso si los datos solicitados no están disponibles, las funciones como Copy...() inmediatamente devuelven el error. Sin embargo, si accedemos desde los Asesores Expertos o scripts, se hacen varios intentos de obtener los datos con una pequeña pausa que se necesita para proporcionar el tiempo necesario para cargar las series temporales que faltan o para calcular los valores de indicadores.

En el apartado Organización de acceso a los datos se explican minuciosamente los detalles de la obtención, almacenamiento y solicitud de los datos de precios en el terminal de cliente MetaTrader 5.

Dirección de indexación en una serie temporal y en un array común

Históricamente se ha constituido que el acceso a los datos en un array de precios se realiza desde el final de los datos. Físicamente los datos nuevos siempre se añaden al final del array, pero el índice de este array siempre es igual a cero. El índice 0 en una matriz-serie temporal significa los datos de la barra en curso, es decir, de la barra que corresponde al intervalo de tiempo no finalizado en dicho período de tiempo (timeframe).

Un período de tiempo (timeframe) es un plazo de tiempo durante el cual se forma una barra de precio. En total están predefinidos 21 períodos de tiempo estándares.

Función

Acción

SeriesInfoInteger

Devuelve la información sobre el estado de datos históricos

Bars

Devuelve la cantidad de barras en el historial por símbolo y período correspondientes

BarsCalculated

Devuelve la cantidad de datos calculados en el búfer de indicadores o -1 en caso del error (los datos aún no están calculados)

IndicatorCreate

Devuelve el manejador (handle) del indicador técnico especificado que ha sido creado a base del array de parámetros del tipo MqlParam

IndicatorParameters

Devuelve para el manejador especificado el número de los parámetros de entrada del indicador, así como los propios valores y el tipo de parámetros

IndicatorRelease

Elimina el manejador (handle) del indicador y libera la parte calculadora del indicador si nadie la está usando

CopyBuffer

Recibe en el array los datos de un búfer especificado desde un indicador especificado

CopyRates

Recibe en un array los datos históricos de la estructura Rates para un símbolo y período especificados

CopyTime

Recibe en un array los datos históricos sobre el tiempo de apertura de barras para un símbolo y período especificados

CopyOpen

Recibe en un array los datos históricos sobre el precio de apertura de barras para un símbolo y período especificados

CopyHigh

Recibe en un array los datos históricos sobre el precio máximo de barras para un símbolo y período especificados

CopyLow

Recibe en un array los datos históricos sobre el precio mínimo de barras para un símbolo y período especificados

CopyClose

Recibe en un array los datos históricos sobre el precio de cierre de barras para un símbolo y período especificados

CopyTickVolume

Recibe en un array los datos históricos sobre volúmenes de tick para un símbolo y período especificados

CopyRealVolume

Recibe en un array los datos históricos sobre volúmenes comerciales para un símbolo y período especificados

CopySpread

Recibe en un array los datos históricos sobre los spreads para un símbolo y período especificados

CopyTicks

Recibe en un array los ticks acumulados por el terminal durante la sesión actual

A pesar de que mediante la función ArraySetAsSeries() para los arrays se pueda establecer un modo de acceso a los elementos igual que para las series temporales, hay que recordar que físicamente los elementos de un array siempre se almacenan en el mismo orden, sólo se cambia la dirección de la indexación. Para demostrarlo vamos a realizar el siguiente ejemplo:

   datetime TimeAsSeries[];
//--- Establecemos el acceso al array como a una serie temporal
   ArraySetAsSeries(TimeAsSeries,true);
   ResetLastError();
   int copied=CopyTime(NULL,0,0,10,TimeAsSeries);
   if(copied<=0)
     {
      Print("No se ha podido copiar la hora de apertura de las últimas 10 barras");
      return;
     }
   Print("TimeCurrent = ",TimeCurrent());
   Print("ArraySize(Time) = ",ArraySize(TimeAsSeries));
   int size=ArraySize(TimeAsSeries);
   for(int i=0;i<size;i++)
     {
      Print("TimeAsSeries["+i+"] = ",TimeAsSeries[i]);
     }
 
   datetime ArrayNotSeries[];
   ArraySetAsSeries(ArrayNotSeries,false);
   ResetLastError();
   copied=CopyTime(NULL,0,0,10,ArrayNotSeries);
   if(copied<=0)
     {
      Print("No se ha podido copiar la hora de apertura de las últimas 10 barras");
      return;
     }   
   size=ArraySize(ArrayNotSeries);
   for(int i=size-1;i>=0;i--)
     {
      Print("ArrayNotSeries["+i+"] = ",ArrayNotSeries[i]);
     }

Por lo tanto se mostrará algo parecido a lo siguiente:

TimeCurrent = 2009.06.11 14:16:23
ArraySize(Time) = 10
TimeAsSeries[0] = 2009.06.11 14:00:00
TimeAsSeries[1] = 2009.06.11 13:00:00
TimeAsSeries[2] = 2009.06.11 12:00:00
TimeAsSeries[3] = 2009.06.11 11:00:00
TimeAsSeries[4] = 2009.06.11 10:00:00
TimeAsSeries[5] = 2009.06.11 09:00:00
TimeAsSeries[6] = 2009.06.11 08:00:00
TimeAsSeries[7] = 2009.06.11 07:00:00
TimeAsSeries[8] = 2009.06.11 06:00:00
TimeAsSeries[9] = 2009.06.11 05:00:00
 
ArrayNotSeries[9] = 2009.06.11 14:00:00
ArrayNotSeries[8] = 2009.06.11 13:00:00
ArrayNotSeries[7] = 2009.06.11 12:00:00
ArrayNotSeries[6] = 2009.06.11 11:00:00
ArrayNotSeries[5] = 2009.06.11 10:00:00
ArrayNotSeries[4] = 2009.06.11 09:00:00
ArrayNotSeries[3] = 2009.06.11 08:00:00
ArrayNotSeries[2] = 2009.06.11 07:00:00
ArrayNotSeries[1] = 2009.06.11 06:00:00
ArrayNotSeries[0] = 2009.06.11 05:00:00

Como vemos, para el array TimeAsSeries con el aumento del índice el valor de tiempo con este índice se disminuye, es decir, nos movemos del presente al pasado. Para un array estándar ArrayNotSeries ocurre todo lo contrario; con el aumento del índice nos movemos del pasado al presente.

Véase también

ArrayIsDynamic, ArrayGetAsSeries, ArraySetAsSeries, ArrayIsSeries