Funciones para trabajar con el tiempo

El tiempo es un factor fundamental en la mayoría de los procesos y desempeña un importante papel aplicado al trading.

Como sabemos, el principal sistema de coordenadas en trading se basa en dos dimensiones: precio y tiempo. Se muestran en el gráfico a lo largo de los ejes vertical y horizontal, respectivamente. Más adelante abordaremos otro eje importante, que puede representarse como perpendicular a los dos primeros y que se adentra en el gráfico, en el que se marcan los volúmenes de trading. Pero por ahora, centrémonos en el tiempo.

Esta medida es común a todos los gráficos, utiliza las mismas unidades de medida y, por extraño que parezca, se caracteriza por la constancia (el transcurso del tiempo es predecible).

El terminal ofrece una plétora de herramientas integradas relacionadas con el cálculo y el análisis del tiempo. Así pues, nos familiarizaremos con ellos gradualmente, a medida que avancemos por los capítulos del libro, de lo sencillo a lo complejo.

En este capítulo estudiaremos las funciones que permiten controlar el tiempo y pausar la actividad del programa durante un intervalo especificado.

En el capítulo Fecha y hora, en la sección sobre transformación de datos, hemos visto ya un par de funciones relacionadas con el tiempo: TimeToStruct y StructToTime. Estas funciones dividen un valor del tipo datetime en componentes o viceversa, construyen datetime a partir de campos individuales: recuerde que se resumen en la estructura MqlDateTime.

struct MqlDateTime

   int year;        // year (1970 – 3000)
   int mon;         // month (1 – 12) 
   int day;         // day (1 – 31) 
   int hour;        // hours (0 – 23) 
   int min;         // minutes (0 – 59) 
   int sec;         // seconds (0 – 59) 
   int day_of_week// day of the week, numbered from 0 (Sunday) to 6 (Saturday)
                    // according to enum ENUM_DAY_OF_WEEK
   int day_of_year// ordinal number of the day in the year, starting from 0 (January 1)
};

Pero, ¿de dónde puede obtener un programa MQL el valor datetime?

Por ejemplo, los precios y tiempos históricos se reflejan en cotizaciones, mientras que los datos actuales en directo llegan en forma de ticks. Ambos tienen marcas de tiempo, que aprenderemos a obtener en las secciones pertinentes sobre series temporales y eventos terminales. Sin embargo, un programa MQL puede consultar la hora actual por sí mismo (sin precios ni otra información de trading) utilizando varias funciones.

Se necesitaban varias funciones porque el sistema está distribuido: consta de un terminal de cliente y un servidor intermediario situados en partes arbitrarias del mundo que, muy probablemente, pertenezcan a husos horarios diferentes.

Cualquier huso horario se caracteriza por un desfase temporal con respecto al punto de referencia global del tiempo, la hora del meridiano de Greenwich (GMT). Por regla general, el desfase de una zona horaria es un número entero de horas N (aunque también hay zonas exóticas con un paso de media hora) y, por lo tanto, se indica como GMT + N o GMT - N, dependiendo de si la zona está al este o al oeste del meridiano. Por ejemplo, Europa continental, situada al este de Londres, utiliza la Hora Central Europea (CET), igual a GMT + 1, o la Hora de Europa Oriental (EET), igual a GMT + 2, mientras que en América existen zonas «negativas», como la Hora Estándar del Este (EST) o GMT-5.

Hay que tener en cuenta que GMT corresponde al tiempo astronómico (solar), que es ligeramente no lineal, ya que la rotación de la Tierra se está ralentizando poco a poco. A este respecto, en las últimas décadas se ha producido una transición a un sistema de cronometraje más preciso (basado en relojes atómicos), en el que la hora mundial se denomina Hora Universal Coordinada (UTC). En muchas áreas de aplicación, incluido el trading, la diferencia entre GMT y UTC no es significativa, por lo que las designaciones de zonas horarias en el nuevo formato UTC±N y el antiguo GMT±N deben considerarse análogas. Por ejemplo, muchos brokers ya indican las horas de sesión en UTC en sus especificaciones, mientras que la API de MQL5 ha utilizado históricamente la notación GMT.

La API de MQL5 permite conocer la hora actual del terminal (de hecho, la hora local del ordenador) y la hora del servidor, que son devueltas por las funciones TimeLocal y TimeCurrent, respectivamente. Además, un programa MQL puede obtener la hora GMT actual (función TimeGMT) basándose en la configuración de la zona horaria de Windows. Así, un operador de trading y un programador obtienen una vinculación de la hora local con la global, y por la diferencia entre la hora local y la del servidor, se puede determinar la «zona horaria» del servidor y de las cotizaciones. Aquí hay no obstante un par de puntos interesantes.

En primer lugar, en muchos países existe la práctica de cambiar al horario de verano (DST). Normalmente, esto significa añadir 1 hora al horario estándar (invierno) desde marzo/abril hasta octubre/noviembre (en el hemisferio norte; en el sur es al revés). Al mismo tiempo, la hora GMT/UTC permanece siempre constante, es decir, no está sujeta a la corrección DST, por lo que son potencialmente posibles varias opciones de convergencia o discrepancia entre la hora del cliente y la del servidor:

  • las fechas de transición pueden variar de un país a otro;
  • algunos países no aplican el horario de verano.

Debido a esto, algunos programas MQL necesitan realizar un seguimiento de dichos cambios de zona horaria si los algoritmos se basan en la referencia a la hora intradía (por ejemplo, comunicados de prensa) y no a los movimientos de precios o concentraciones de volumen.

Y si la traducción de la hora en el ordenador del usuario es bastante fácil de determinar, gracias a la función TimeDaylightSavings, entonces no hay ningún análogo listo para la hora del servidor.

En segundo lugar, el probador regular de MetaTrader 5, en el que podemos depurar o evaluar programas MQL de tipos tales como Asesores Expertos e indicadores, no emula, por desgracia, el tiempo del servidor de trading. En lugar de ello, las tres funciones anteriores TimeLocal, TimeGMT y TimeCurrent devolverán la misma hora, es decir, la zona horaria será siempre virtualmente GMT.

Hora absoluta y relativa
 
La contabilización del tiempo en los algoritmos, como en la vida, puede realizarse en coordenadas absolutas o relativas. Cada momento del pasado, del presente y del futuro se describe mediante un valor absoluto al que podemos referirnos para indicar el inicio de un periodo contable o el momento en que se publica una noticia económica. Es esta hora la que almacenamos en MQL5 utilizando el tipo datetime. Al mismo tiempo, a menudo es necesario mirar al futuro o retroceder al pasado durante un número determinado de unidades de tiempo desde el momento actual. En este caso, no nos interesa el valor absoluto, sino el intervalo de tiempo.
 
En concreto, los algoritmos tienen el concepto de timeout, que es un periodo de tiempo durante el cual se debe realizar una determinada acción, y si no se realiza por cualquier motivo, la cancelamos y dejamos de esperar el resultado (porque, al parecer, algo ha ido mal). Puede medir el intervalo en distintas unidades: horas, segundos, milisegundos o incluso microsegundos (al fin y al cabo, ahora los ordenadores son rápidos).
 
En MQL5, algunas funciones relacionadas con el tiempo trabajan con valores absolutos (por ejemplo, TimeLocal, TimeCurrent) y la parte, con intervalos (por ejemplo, GetTickCount, GetMicrosecondCount).
 
Sin embargo, la medición de intervalos o la activación del programa a intervalos especificados se puede implementar no sólo a través de las funciones de esta sección, sino también utilizando temporizadores integrados que funcionan según el conocido principio de un reloj despertador. Cuando están activados, utilizan eventos especiales para notificar a los programas MQL y a las funciones que implementamos que manejen estos eventos, OnTimer (son similares a OnStart). Trataremos este aspecto de la gestión del tiempo en una sección aparte, después de estudiar el concepto general de eventos en MQL5 (véase Visión general de las funciones de gestión de eventos).