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

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.

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

iBars

Retorna el número de barras en la historia según el símbolo y el periodo correspondientes

iBarShift

Busca la barra según la hora y fecha. La función retorna el índice de la barra en el que entra la hora y fecha especificada

iClose

Retorna el valor del precio de cierre de la barra (indicada por el parámetro shift) del gráfico correspondiente

iHigh

Retorna el valor del precio mínimo de la barra (indicada por el parámetro shift) del gráfico correspondiente

iHighest

Retorna el índice del mayor valor encontrado (desplazamiento relativo a la barra actual) del gráfico correspondiente

iLow

Retorna el valor del precio mínimo de la barra (indicada por el parámetro shift) del gráfico correspondiente

iLowest

Retorna el índice del menor valor encontrado (desplazamiento relativo a la barra actual) del gráfico correspondiente

iOpen

Retorna el valor del precio de apertura de la barra (indicada por el parámetro shift) del gráfico correspondiente

iTime

Retorna el valor del tiempo de apertura de la barra (indicada por el parámetro shift) del gráfico correspondiente

iTickVolume

Retorna el valor del volumen de ticks de la barra (indicada por el parámetro shift) del gráfico correspondiente

iRealVolume

Retorna el valor del volumen real de la barra (indicada por el parámetro shift) del gráfico correspondiente

iVolume

Retorna el valor del volumen de ticks de la barra (indicada por el parámetro shift) del gráfico correspondiente

iSpread

Retorna el valor del spread de la barra (indicada por el parámetro shift) del gráfico correspondiente

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