Estructuras del calendario económico

En este apartado se describen las estructuras para trabajar con el Calendario Económico, disponible directamente en la plataforma MetaTrader. El calendario económico es una enciclopedia ya preparada que contiene las descripciones de los más importantes indicadores macroeconómicos, sus fechas de salida y su nivel de importancia. Los valores actuales de los indicadores macroeconímicos llegan a la plataforma MetaTrader justo tras su publicación, y se representan en un gráfico en forma de rótulos: esto permitirá monitorear visualmente los índices necesarios en función del país, la divisa y la importancia.

Las funciones del Calendario Económico permiten analizar de forma automática los eventos entrantes según nuestros propios criterios de importancia, y también en función de los países/divisas requeridos.

Las descripciones de los países de indican con la estructura MqlCalendarCountry. Se usa en las funciones CalendarCountryById() y CalendarCountries()

struct MqlCalendarCountry
  {
   ulong                               id;                    // identificador del país según el estándar ISO 3166-1
   string                              name;                  // nombre de texto del país (en la codificación actual del terminal)
   string                              code;                  // nombre en clave del país ISO 3166-1 alpha-2
   string                              currency;              // código de la divisa del país
   string                              currency_symbol;       // símbolo/signo de la divisa del país
   string                              url_name;              // nombre del país usado en la URL en el sitio web mql5.com
  };

 

Las descripciones de los eventos se indican con la estructura MqlCalendarEvent. Se usa en las funciones CalendarEventById(), CalendarEventByCountry() y CalendarEventByCurrency()

struct MqlCalendarEvent
  {
   ulong                               id;                    // identificador del evento
   ENUM_CALENDAR_EVENT_TYPE            name;                  // tipo de evento de la enumeración ENUM_CALENDAR_EVENT_TYPE
   ENUM_CALENDAR_EVENT_SECTOR          sector;                // sector con el que se relaciona el evento
   ENUM_CALENDAR_EVENT_FREQUENCY       frequency;             // frecuencia (periodicidad) del evento
   ENUM_CALENDAR_EVENT_TIMEMODE        sector;                // modo temporal del evento
   ulong                               country_id;            // identificador del país
   ENUM_CALENDAR_EVENT_UNIT            unit;                  // unidad de medición del valor del indicador económico
   ENUM_CALENDAR_EVENT_IMPORTANCE      importance;            // importancia del evento
   ENUM_CALENDAR_EVENT_MULTIPLIER      multiplier;            // multiplicador del valor del indicador económico
   uint                                digits;                // número de decimales tras la coma
   string                              source_url;            // URL de la fuente donde se publica el evento
   string                              event_code;            // código del evento
   string                              name;                  // nombre de texto del evento en el lenguaje del terminal (en la codificación actual del terminal)
  };

 

Los valores de los eventos se indican con la estructura MqlCalendarValue. Se usa en las funciones CalendarValueById(), CalendarValueHistoryByEvent(), CalendarValueHistory(), CalendarValueLastByEvent() y CalendarValueLast()

struct MqlCalendarValue
  {
   ulong                               id;                    // ID del valor
   ulong                               event_id;              // ID del evento
   datetime                            time;                  // hora y fecha evento
   datetime                            period;                // período de informe del evento
   int                                 revision;              // revisión del indicador publicado en relación con el período del informe
   long                                actual_value;          // valor real en ppm o LONG_MIN si no se ha especificado ningún valor
   long                                prev_value;            // valor anterior en ppm o LONG_MIN si no ha sido definido
   long                                revised_prev_value;    // valor anterior revisado en ppm o LONG_MIN si no se ha definido
   long                                forecast_value;        // valor previsto en ppm o LONG_MIN si no se ha definido
   ENUM_CALENDAR_EVENT_IMPACT          impact_type;           // impacto potencial en el tipo de cambio
  //--- funciones para comprobar valores
   bool                         HasActualValue(voidconst;   // devuelve true si en el campo está definido el valor actual_value
   bool                         HasPreviousValue(voidconst; // devuelve true si en el campo está definido el valor prev_value
   bool                         HasRevisedValue(voidconst;  // devuelve true si en el campo está definido el valor revised_prev_value
   bool                         HasForecastValue(voidconst; // devuelve true si en el campo está definido el valor forecast_value
  //--- funciones para obtener valores
   double                       GetActualValue(voidconst;   // devuelve actual_value ou nan, si no se ha definido el valor
   double                       GetPreviousValue(voidconst; // devuelve prev_value ou nan, si no se ha definido el valor
   double                       GetRevisedValue(voidconst;  // devuelve revised_prev_value ou nan, si no se ha definido el valor
   double                       GetForecastValue(voidconst; // devuelve forecast_value ou nan, si no se ha definido el valor
  };

La estructura MqlCalendarValue proporciona un método para obtener e comprobar valores a partir de los campos actual_value, forecast_value, prev_value y revised_prev_value. Si el valor del campo no está definido, éste almacenará el valor LONG_MIN (-9223372036854775808).

Es necesario tener en cuenta que los valores de estos campos se almacenan multiplicados por un factor de un millón. Eso quiere decir que cuando las funciones CalendarValueById, CalendarValueHistoryByEvent, CalendarValueHistory, CalendarValueLastByEvent y CalendarValueLast reciben valores en MqlCalendarValue, es necesario comprobar que los valores LONG_MIN de esos campos son idénticos; y si el valor está definido en el campo, para obtener el valor, el valor del campo debe dividirse entre 1000 000 (un millón). Otra forma de obtener valores es verificar y obtener valores mediante funciones de la propia estructura MqlCalendarValue.

Ejemplo de procesamiento de eventos de calendario:

//--- creamos nuestra propia estructura para almacenar eventos de calendario con valores reales en lugar de valores enteros
struct AdjustedCalendarValue
  {
   ulong                               id;                    // ID del valor
   ulong                               event_id;              // ID del evento
   datetime                            time;                  // hora y fecha evento
   datetime                            period;                // período de informe del evento
   int                                 revision;              // revisión del indicador publicado en relación con el período del informe
   double                              actual_value;          // valor actual do indicador
   double                              prev_value;            // valor anterior del indicador
   double                              revised_prev_value;    // valor anterior revisado del indicador
   double                              forecast_value;        // valor previsto del indicador
   ENUM_CALENDAR_EVENT_IMPACT          impact_type;           // impacto potencial en el tipo de cambio
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
//--- código de país aplicado a la Unión Europea según la norma ISO 3166-1 Alpha-2
   string EU_code="EU";
//--- obtenemos todos los valores de eventos para la Unión Europea
   MqlCalendarValue values[];
//--- definimos los límites del rango del que tomamos los eventos
   datetime date_from=D'01.01.2021';  // tomamos todos os eventos a partir de 2021
   datetime date_to=0;                // 0 representa todos los eventos conocidos, incluso aquellos que aún no han ocurrido
//--- solicitamos el historial de eventos de la Unión Europea a partir de 2021
   if(!CalendarValueHistory(valuesdate_fromdate_toEU_code))
     {
      PrintFormat("Erro! No se pudieron obtener los eventos por país país country_code=%s"EU_code);
      PrintFormat("Código de error: %d"GetLastError());
      return;
     }
   else
      PrintFormat("Se recibieron valores de eventos para el país country_code=%s: %d",
                  EU_codeArraySize(values));
//--- reducimos el tamaño de la matriz para mostrarla en el Log
   if(ArraySize(values)>5)
      ArrayResize(values5);
//--- mostramos los valores de los eventos en el Log tal como están, sin verificaciones y con los valores reales
   Print("Mostramos los valores del calendario tal cual");
   ArrayPrint(values);
 
//--- comprobamos los valores del campo y los actualizamos a los valores actuales
//--- primera opción para comprobar y obtener valores
   AdjustedCalendarValue values_adjusted_1[];
   int total=ArraySize(values);
   ArrayResize(values_adjusted_1total);
//--- copiamos los valores verificados y corregidos
   for(int i=0i<totali++)
     {
      values_adjusted_1[i].id=values[i].id;
      values_adjusted_1[i].event_id=values[i].event_id;
      values_adjusted_1[i].time=values[i].time;
      values_adjusted_1[i].period=values[i].period;
      values_adjusted_1[i].revision=values[i].revision;
      values_adjusted_1[i].impact_type=values[i].impact_type;
      //--- realizamos la verificación de valores y dividimos por 1000 000
      if(values[i].actual_value==LONG_MIN)
         values_adjusted_1[i].actual_value=double("nan");
      else
         values_adjusted_1[i].actual_value=values[i].actual_value/1000000.;
 
      if(values[i].prev_value==LONG_MIN)
         values_adjusted_1[i].prev_value=double("nan");
      else
         values_adjusted_1[i].prev_value=values[i].prev_value/1000000.;
 
      if(values[i].revised_prev_value==LONG_MIN)
         values_adjusted_1[i].revised_prev_value=double("nan");
      else
         values_adjusted_1[i].revised_prev_value=values[i].revised_prev_value/1000000.;
 
      if(values[i].forecast_value==LONG_MIN)
         values_adjusted_1[i].forecast_value=double("nan");
      else
         values_adjusted_1[i].forecast_value=values[i].forecast_value/1000000.;
     }
   Print("Primera forma de comprobar y obtener valores de calendario");
   ArrayPrint(values_adjusted_1);
 
//--- segunda opción para comprobar y obtener valores
   AdjustedCalendarValue values_adjusted_2[];
   ArrayResize(values_adjusted_2total);
//--- copiamos los valores verificados y corregidos
   for(int i=0i<totali++)
     {
      values_adjusted_2[i].id=values[i].id;
      values_adjusted_2[i].event_id=values[i].event_id;
      values_adjusted_2[i].time=values[i].time;
      values_adjusted_2[i].period=values[i].period;
      values_adjusted_2[i].revision=values[i].revision;
      values_adjusted_2[i].impact_type=values[i].impact_type;
      //--- realizamos las comprobaciones y obtenemos valores
      if(values[i].HasActualValue())
         values_adjusted_2[i].actual_value=values[i].GetActualValue();
      else
         values_adjusted_2[i].actual_value=double("nan");
 
      if(values[i].HasPreviousValue())
         values_adjusted_2[i].prev_value=values[i].GetPreviousValue();
      else
         values_adjusted_2[i].prev_value=double("nan");
 
      if(values[i].HasRevisedValue())
         values_adjusted_2[i].revised_prev_value=values[i].GetRevisedValue();
      else
         values_adjusted_2[i].revised_prev_value=double("nan");
 
      if(values[i].HasForecastValue())
         values_adjusted_2[i].forecast_value=values[i].GetForecastValue();
      else
         values_adjusted_2[i].forecast_value=double("nan");
     }
   Print("Segunda forma de comprobar y obtener valores de calendario");
   ArrayPrint(values_adjusted_2);
 
//--- tercera opción para verificar y obtener valores
   AdjustedCalendarValue values_adjusted_3[];
   ArrayResize(values_adjusted_3total);
//--- copiamos los valores verificados y corregidos
   for(int i=0i<totali++)
     {
      values_adjusted_3[i].id=values[i].id;
      values_adjusted_3[i].event_id=values[i].event_id;
      values_adjusted_3[i].time=values[i].time;
      values_adjusted_3[i].period=values[i].period;
      values_adjusted_3[i].revision=values[i].revision;
      values_adjusted_3[i].impact_type=values[i].impact_type;
      //--- obtenemos valores sin verificaciones
      values_adjusted_3[i].actual_value=values[i].GetActualValue();
      values_adjusted_3[i].prev_value=values[i].GetPreviousValue();
      values_adjusted_3[i].revised_prev_value=values[i].GetRevisedValue();
      values_adjusted_3[i].forecast_value=values[i].GetForecastValue();
     }
   Print("Tercera forma de obtener valores de calendario, sin verificaciones");
   ArrayPrint(values_adjusted_3);
  }
/*
   Se reciben los valores de eventos según country_code=EU1051
  Mostramos los valores del calendario como son
         [id] [event_id]              [time]            [period] [revision]       [actual_value]         [prev_value] [revised_prev_value]     [forecast_value] [impact_type] [reserved]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3             55200000             55500000 -9223372036854775808             55500000             2        ...
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0            143100000            143900000 -9223372036854775808 -9223372036854775808             0        ...
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808             0        ...
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0             11000000             10500000 -9223372036854775808             11000000             0        ...
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0              3100000              3100000              3200000              3100000             0        ...
  Primera forma de verificar y obtener valores de calendario
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
  Segunda forma de comprobar y obtener valores de calendario
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
  Tercera forma de obtener valores de calendario, sin verificaciones
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
*/

 

La frecuencia (periodicidad) del evento se muestra en la estructura MqlCalendarEvent. Los posibles valores se indican en la numeración ENUM_CALENDAR_EVENT_FREQUENCY

Identificador

Descripción

CALENDAR_FREQUENCY_NONE

La frecuencia de la publicación no ha sido indicada

CALENDAR_FREQUENCY_WEEK

Publicación semanal

CALENDAR_FREQUENCY_MONTH

Publicación mensual

CALENDAR_FREQUENCY_QUARTER

Publicación trimestral

CALENDAR_FREQUENCY_YEAR

Publicación anual

CALENDAR_FREQUENCY_DAY

Publicación diaria

 

El tipo de evento se indica en la estructura MqlCalendarEvent. Los posibles valores se indican en la numeración ENUM_CALENDAR_EVENT_TYPE

Identificador

Descripción

CALENDAR_TYPE_EVENT

Evento (reunión, discurso, etcétera)

CALENDAR_TYPE_INDICATOR

Indicador

CALENDAR_TYPE_HOLIDAY

Festivo

 

El sector de la economía con el que se relaciona el evento se indica en la estructura MqlCalendarEvent. Los posibles valores se indican en la numeración ENUM_CALENDAR_EVENT_SECTOR

Identificador

Descripción

CALENDAR_SECTOR_NONE

El sector no ha sido indicado

CALENDAR_SECTOR_MARKET

Mercado, bolsa

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

Negocios

CALENDAR_SECTOR_CONSUMER

Consumo

CALENDAR_SECTOR_HOUSING

Vivienda

CALENDAR_SECTOR_TAXES

Impuestos

CALENDAR_SECTOR_HOLIDAYS

Festivos

 

La importancia del evento se indica en la estructura MqlCalendarEvent. Los posibles valores se indican en la numeración ENUM_CALENDAR_EVENT_IMPORTANCE

Identificador

Descripción

CALENDAR_IMPORTANCE_NONE

El nivel de importancia no ha sido indicado

CALENDAR_IMPORTANCE_LOW

Baja importancia

CALENDAR_IMPORTANCE_MODERATE

Media importancia

CALENDAR_IMPORTANCE_HIGH

Alta importancia

 

El tipo de la unidad de medición en el que se dan los valores del evento se indica en la estructura MqlCalendarEvent. Los posibles valores se indican en la numeración ENUM_CALENDAR_EVENT_UNIT

Identificador

Descripción

CALENDAR_UNIT_NONE

La unidad de medición no ha sido indicada

CALENDAR_UNIT_PERCENT

Porcentaje

CALENDAR_UNIT_CURRENCY

Divisa nacional

CALENDAR_UNIT_HOUR

Número de horas

CALENDAR_UNIT_JOB

Número de puestos de trabajo

CALENDAR_UNIT_RIG

Plataformas petrolíferas

CALENDAR_UNIT_USD

Dólares USA

CALENDAR_UNIT_PEOPLE

Número de personas

CALENDAR_UNIT_MORTGAGE

Número de créditos hipotecarios

CALENDAR_UNIT_VOTE

Número de votos

CALENDAR_UNIT_BARREL

Número de barriles

CALENDAR_UNIT_CUBICFEET

Número de pies cúbicos

CALENDAR_UNIT_POSITION

Número de puestos de trabajo

CALENDAR_UNIT_BUILDING

Número de construcciones

 

En ciertos casos, los valores del indicador económico necesitan que se indique el multiplicador especificado en la estructura MqlCalendarEvent. Los posibles valores se indican en la numeración ENUM_CALENDAR_EVENT_MULTIPLIER

Identificador

Descripción

CALENDAR_MULTIPLIER_NONE

El multiplicador no ha sido indicado

CALENDAR_MULTIPLIER_THOUSANDS

Miles

CALENDAR_MULTIPLIER_MILLIONS

Millones

CALENDAR_MULTIPLIER_BILLIONS

Miles de millones

CALENDAR_MULTIPLIER_TRILLIONS

Billones

 

La influencia potencial de un evento en el curso de la divisa nacional se indica en la estructura MqlCalendarValue. Los posibles valores se indican en la numeración ENUM_CALENDAR_EVENT_IMPACT

Identificador

Descripción

CALENDAR_IMPACT_NA

La influencia no ha sido indicada

CALENDAR_IMPACT_POSITIVE

Influencia positiva

CALENDAR_IMPACT_NEGATIVE

Influencia negativa

 

La hora del evento se indica en la estructura MqlCalendarEvent. Los posibles valores se indican en la numeración ENUM_CALENDAR_EVENT_TIMEMODE

Identificador

Descripción

CALENDAR_TIMEMODE_DATETIME

La fuente publica la hora exacta del evento

CALENDAR_TIMEMODE_DATE

El evento ocupa el día completo

CALENDAR_TIMEMODE_NOTIME

La fuente no publica la hora del evento

CALENDAR_TIMEMODE_TENTATIVE

La fuente no publica de antemano la hora exacta del evento, solo el día. La hora se concreta cuando tiene lugar el evento

 

Ver también

Calendario económico