Conceptos básicos del calendario

Al trabajar con el calendario, operaremos con varios conceptos, para cuya descripción formal MQL5 define tipos especiales de estructuras.

En primer lugar, los eventos están relacionados con países concretos, y cada país se describe utilizando la estructura MqlCalendarCountry.

struct MqlCalendarCountry

   ulong  id;              //country identifier according to ISO 3166-1 
   string name;            // text name of the country (in the current terminal encoding) 
   string code;            // two-letter country designation according to ISO 3166-1 alpha-2 
   string currency;        // international country currency code 
   string currency_symbol// symbol/sign of the country's currency 
   string url_name;        // country name used in the URL on the mql5.com website 
};

En la siguiente sección descubriremos cómo obtener una lista de países disponibles en el calendario y sus atributos como un array de estructuras MqlCalendarCountry.

Por ahora, solo prestaremos atención al campo id. Es importante porque esta es la clave para determinar si los eventos del calendario pertenecen a un país concreto. En cada país (o en una asociación registrada de países, como la Unión Europea) existe una lista específica, conocida internacionalmente, de tipos de indicadores económicos y eventos informativos que afectan al mercado y que, por tanto, se incluyen en el calendario.

Cada tipo de evento se define mediante la estructura MqlCalendarEvent, en la que el campo country_id vincula de forma exclusiva el evento con el país. A continuación examinaremos los tipos de enumeraciones utilizados.

struct MqlCalendarEvent

   ulong                          id;         // event ID 
   ENUM_CALENDAR_EVENT_TYPE       type;       // event type 
   ENUM_CALENDAR_EVENT_SECTOR     sector;     // sector to which the event belongs 
   ENUM_CALENDAR_EVENT_FREQUENCY  frequency;  // frequency (periodicity) of the event 
   ENUM_CALENDAR_EVENT_TIMEMODE   time_mode;  // event time mode 
   ulong                          country_id// country identifier 
   ENUM_CALENDAR_EVENT_UNIT       unit;       // indicator unit 
   ENUM_CALENDAR_EVENT_IMPORTANCE importance// importance of the event 
   ENUM_CALENDAR_EVENT_MULTIPLIER multiplier// indicator multiplier 
   uint                           digits;     // number of decimal places
   string                         source_url// URL of the event publication source 
   string                         event_code// event code
   string                         name;       // text name of the event in the terminal language 
};

Es importante comprender que la estructura MqlCalendarEvent describe exactamente el tipo de evento (por ejemplo, la publicación del Índice de Precios al Consumo, IPC), pero no un evento concreto que puede producirse una vez al trimestre, una vez al mes o según otro calendario. Contiene las características generales del evento, como importancia, frecuencia, relación con el sector de la economía, unidades de medida, nombre y fuente de información. En cuanto a los indicadores reales y previstos, se proporcionarán en las entradas del calendario para cada evento específico de este tipo: estas entradas se almacenan como estructuras MqlCalendarValue, que se tratarán más adelante. Las funciones para consultar los tipos de eventos admitidos se presentarán en secciones posteriores.

El tipo de evento del campo type se especifica como uno de los valores de la enumeración ENUM_CALENDAR_EVENT_TYPE.

Identificador

Descripción

CALENDAR_TYPE_EVENT

Evento (reunión, discurso, etc.)

CALENDAR_TYPE_INDICATOR

Indicador económico

CALENDAR_TYPE_HOLIDAY

Vacaciones (fin de semana)

El sector de la economía al que pertenece el evento se selecciona de la enumeración ENUM_CALENDAR_EVENT_SECTOR.

Identificador

Descripción

CALENDAR_SECTOR_NONE

Sector no establecido

CALENDAR_SECTOR_MARKET

Mercado, intercambio

CALENDAR_SECTOR_GDP

Producto Interior Bruto (PIB)

CALENDAR_SECTOR_JOBS

Mercado laboral

CALENDAR_SECTOR_PRICES

Precios

CALENDAR_SECTOR_MONEY

Dinero

CALENDAR_SECTOR_TRADE

Comercio

CALENDAR_SECTOR_GOVERNMENT

Gobierno

CALENDAR_SECTOR_BUSINESS

Empresas

CALENDAR_SECTOR_CONSUMER

Consumo

CALENDAR_SECTOR_HOUSING

Vivienda

CALENDAR_SECTOR_TAXES

Impuestos

CALENDAR_SECTOR_HOLIDAYS

Vacaciones

La frecuencia del evento se indica en el campo frequency utilizando la enumeración ENUM_CALENDAR_EVENT_FREQUENCY.

Identificador

Descripción

CALENDAR_FREQUENCY_NONE

La frecuencia de publicación no está establecida.

CALENDAR_FREQUENCY_WEEK

Semanal

CALENDAR_FREQUENCY_MONTH

Mensual

CALENDAR_FREQUENCY_QUARTER

Trimestral

CALENDAR_FREQUENCY_YEAR

Anual

CALENDAR_FREQUENCY_DAY

Diario

La duración del evento (time_mode) puede describirse mediante uno de los elementos de la enumeración ENUM_CALENDAR_EVENT_TIMEMODE.

Identificador

Descripción

CALENDAR_TIMEMODE_DATETIME

Se conoce la hora exacta del acontecimiento

CALENDAR_TIMEMODE_DATE

El evento dura todo el día

CALENDAR_TIMEMODE_NOTIME

La hora no se publica

CALENDAR_TIMEMODE_TENTATIVE

Solo se conoce de antemano el día, pero no la hora exacta del evento (la hora se especifica a posteriori).

La importancia del evento se especifica en el campo importance utilizando la enumeración ENUM_CALENDAR_EVENT_IMPORTANCE.

Identificador

Descripción

CALENDAR_IMPORTANCE_NONE

No establecida

CALENDAR_IMPORTANCE_LOW

Baja

CALENDAR_IMPORTANCE_MODERATE

Moderada

CALENDAR_IMPORTANCE_HIGH

Alta

Las unidades de medida en las que se dan los valores de los eventos se definen en el campo unit como miembro de la enumeración ENUM_CALENDAR_EVENT_UNIT.

Identificador

Descripción

CALENDAR_UNIT_NONE

La unidad no está establecida.

CALENDAR_UNIT_PERCENT

Interés (%)

CALENDAR_UNIT_CURRENCY

Divisa nacional

CALENDAR_UNIT_HOUR

Número de horas

CALENDAR_UNIT_JOB

Número de centros de trabajo

CALENDAR_UNIT_RIG

Plataformas de perforación

CALENDAR_UNIT_USD

Dólares estadounidenses

CALENDAR_UNIT_PEOPLE

Número de personas

CALENDAR_UNIT_MORTGAGE

Número de préstamos hipotecarios

CALENDAR_UNIT_VOTE

Número de votos

CALENDAR_UNIT_BARREL

Cantidad en barriles

CALENDAR_UNIT_CUBICFEET

Volumen en pies cúbicos

CALENDAR_UNIT_POSITION

Volumen neto de posiciones especulativas en contratos

CALENDAR_UNIT_BUILDING

Número de edificios

En algunos casos, los valores de un indicador económico requieren un multiplier según uno de los elementos de la enumeración ENUM_CALENDAR_EVENT_MULTIPLIER.

Identificador

Descripción

CALENDAR_MULTIPLIER_NONE

El multiplicador no está establecido.

CALENDAR_MULTIPLIER_THOUSANDS

Miles

CALENDAR_MULTIPLIER_MILLIONS

Millones

CALENDAR_MULTIPLIER_BILLIONS

Miles de millones

CALENDAR_MULTIPLIER_TRILLIONS

Billones

Así pues, hemos considerado todos los tipos de datos especiales utilizados para describir los tipos de eventos en la estructura MqlCalendarEvent.

Una entrada de calendario independiente se forma como una estructura MqlCalendarValue. Su descripción detallada figura a continuación, pero por ahora es importante prestar atención al siguiente matiz: MqlCalendarValue tiene el campo event_id que apunta al identificador del tipo de evento, es decir, contiene una de las estructuras id existentes en MqlCalendarEvent.

Como vimos anteriormente, la estructura MqlCalendarEvent está a su vez relacionada con MqlCalendarCountry a través del campo country_id. Así, una vez introducida la información sobre un país o un tipo de evento concreto en la base de datos del calendario, es posible registrar un número arbitrario de eventos similares para ellos. Por supuesto, el responsable de rellenar la base de datos es el proveedor de información, no los desarrolladores.

Resumamos el subtotal; el sistema almacena tres tablas internas por separado:

  • La tabla de estructura MqlCalendarCountry para describir los países;
  • La tabla de estructura MqlCalendarEvent con descripciones de los tipos de eventos;
  • La tabla de estructura MqlCalendarValue con indicadores de eventos específicos de varios tipos.

Al hacer referencia a los identificadores de tipo de evento, se elimina la duplicación de información de los registros de eventos específicos. Por ejemplo, las publicaciones mensuales de los valores del IPC sólo se refieren a la misma estructura MqlCalendarEvent con las características generales de este tipo de evento. Si no fuera por las diferentes tablas, sería necesario repetir las mismas propiedades en cada entrada del calendario del IPC. Este enfoque para establecer relaciones entre tablas con datos que utilizan campos identificadores se denomina relational, y volveremos a él en el capítulo sobre SQLite. Esto se ilustra en el siguiente diagrama:

Esquema de enlaces entre estructuras por campos con identificadores

Diagrama de enlaces entre estructuras por campos con identificadores

Todas las tablas se almacenan en la base de datos interna del calendario, que se mantiene constantemente actualizada mientras el terminal está conectado al servidor.

Las entradas del calendario (eventos específicos) son estructuras de MqlCalendarValue. También se identifican por su propio número único en el campo id (cada una de las tres tablas tiene su propio campo id).

struct MqlCalendarValue 

   ulong      id;                 // entry ID 
   ulong      event_id;           // event type ID 
   datetime   time;               // time and date of the event 
   datetime   period;             // reporting period of the event 
   int        revision;           // revision of the published indicator in relation to the reporting period 
   long       actual_value;       // actual value in ppm or LONG_MIN 
   long       prev_value;         // previous value in ppm or LONG_MIN 
   long       revised_prev_value// revised previous value in ppm or LONG_MIN 
   long       forecast_value;     // forecast value in ppm or LONG_MIN 
   ENUM_CALENDAR_EVENT_IMPACT impact_type;  // potential impact on the exchange rate
    
 // functions for checking values
   bool HasActualValue(voidconst;     // true if the actual_value field is filled 
   bool HasPreviousValue(voidconst;   // true if the prev_value field is filled 
   bool HasRevisedValue(voidconst;    // true if the revised_prev_value field is filled 
   bool HasForecastValue(voidconst;   // true if the forecast_value field is filled
    
   // functions for getting values 
   double GetActualValue(voidconst;   // actual_value or nan if value is not set 
   double GetPreviousValue(voidconst// prev_value or nan if value is not set 
   double GetRevisedValue(voidconst;  // revised_prev_value or nan if value is not set 
   double GetForecastValue(voidconst// forecast_value or nan if value is not set 
};

Para cada evento, además de la hora de su publicación (time), también se almacenan los cuatro valores siguientes:

  • Valor real (actual_value), que se conoce inmediatamente después de la publicación de la noticia;
  • Valor anterior (prev_value), que se conoció en la última publicación de la misma noticia;
  • Valor revisado del indicador anterior, revised_prev_value (si se ha modificado desde la última publicación);
  • Valor previsto (forecast_value).

Obviamente, no todos los campos deben rellenarse necesariamente. Así, el valor actual está ausente (aún no se conoce) para los eventos futuros, y la revisión de los valores pasados tampoco se produce siempre. Además, los cuatro campos solo tienen sentido para los indicadores cuantitativos, mientras que el calendario también refleja los discursos, las reuniones y los días festivos de los reguladores.

Un campo vacío (sin valor) se indica mediante la constante LONG_MIN (-9223372036854775808). Si se especifica el valor del campo (no igual a LONG_MIN), entonces corresponde al valor real del indicador multiplicado por un millón de veces, es decir, para obtener el indicador en la forma (real) habitual, es necesario dividir el valor del campo por 1 000 000.

Para comodidad del programador, la estructura define 4 métodos Has para comprobar que el campo está lleno, así como 4 métodos Get que devuelven el valor del campo correspondiente ya convertido en un número real, y en el caso de que no esté lleno, el método devolverá NaN (no es un número -Not A Number-).

A veces, para obtener valores absolutos (si son necesarios para el algoritmo), es importante analizar adicionalmente la propiedad multiplier en la estructura MqlCalendarEvent, ya que algunos valores se especifican en múltiples unidades según la enumeración ENUM_CALENDAR_EVENT_MULTIPLIER. Además, MqlCalendarEvent dispone del campo digits, que especifica el número de dígitos significativos de los valores recibidos para su correcto formateo posterior (por ejemplo, en una llamada a NormalizeDouble).

El periodo de referencia (para el que se calcula el indicador publicado) se establece en el campo period como su primer día. Por ejemplo, si el indicador se calcula mensualmente, la fecha '2022.05.01 00:00:00' significa el mes de mayo. La duración del periodo (por ejemplo, mes, trimestre, año) se define en el campo frequency de la estructura relacionada MqlCalendarEvent: el tipo de este campo es la enumeración especial ENUM_CALENDAR_EVENT_FREQUENCY descrita anteriormente, junto con otras enumeraciones.

Especialmente interesante es el campo impact_type, en el que, tras la publicación de la noticia, la dirección de influencia de la divisa correspondiente en el tipo de cambio se establece automáticamente comparando los valores actuales y previstos. Esta influencia puede ser positiva (se espera que la divisa se aprecie) o negativa (se espera que la divisa se deprecie). Por ejemplo, un descenso de las ventas mayor de lo previsto se calificaría de negativo, y un descenso del desempleo mayor, de positivo. Pero esta característica no se interpreta inequívoca para todos los eventos (algunos indicadores económicos se consideran contradictorios) y, además, hay que prestar atención a las cifras relativas de los cambios.

El impacto potencial de un evento sobre el tipo de cambio de la divisa nacional se indica utilizando la enumeración ENUM_CALENDAR_EVENT_IMPACT.

Identificador

Descripción

CALENDAR_IMPACT_NA

No se establece la influencia.

CALENDAR_IMPACT_POSITIVE

Influencia positiva

CALENDAR_IMPACT_NEGATIVE

Influencia negativa

Otro concepto importante del calendario es el hecho de su cambio. Por desgracia, no existe una estructura especial para el cambio. La única propiedad que tiene un cambio es su ID único, que es un número entero asignado por el sistema cada vez que se modifica la base del calendario interno.

Como sabe, el calendario es modificado constantemente por los proveedores de información: se le añaden nuevos eventos próximos y se corrigen los indicadores y previsiones ya publicados. Por lo tanto, es muy importante realizar un seguimiento de las ediciones, cuya aparición permite detectar el aumento periódico del número de cambios.

El tiempo de edición con un identificador específico y su esencia no están disponibles en MQL5. Si es necesario, los programas MQL deben implementar ellos mismos las consultas periódicas del estado del calendario y el análisis de los registros.

Un conjunto de funciones MQL5 permite obtener información sobre países, tipos de eventos y entradas concretas del calendario, así como sobre sus cambios. Lo estudiaremos en las secciones siguientes.

¡Atención! Al acceder al calendario por primera vez (si no se ha abierto antes la pestaña Calendario de la barra de herramientas del terminal), la sincronización de la base de datos interna del calendario con el servidor puede tardar varios segundos.