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()
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(void) const; // devuelve true si en el campo está definido el valor actual_value
bool HasPreviousValue(void) const; // devuelve true si en el campo está definido el valor prev_value
bool HasRevisedValue(void) const; // devuelve true si en el campo está definido el valor revised_prev_value
bool HasForecastValue(void) const; // devuelve true si en el campo está definido el valor forecast_value
//--- funciones para obtener valores
double GetActualValue(void) const; // devuelve actual_value ou nan, si no se ha definido el valor
double GetPreviousValue(void) const; // devuelve prev_value ou nan, si no se ha definido el valor
double GetRevisedValue(void) const; // devuelve revised_prev_value ou nan, si no se ha definido el valor
double GetForecastValue(void) const; // 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(values, date_from, date_to, EU_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_code, ArraySize(values));
//--- reducimos el tamaño de la matriz para mostrarla en el Log
if(ArraySize(values)>5)
ArrayResize(values, 5);
//--- 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_1, total);
//--- copiamos los valores verificados y corregidos
for(int i=0; i<total; i++)
{
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_2, total);
//--- copiamos los valores verificados y corregidos
for(int i=0; i<total; i++)
{
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_3, total);
//--- copiamos los valores verificados y corregidos
for(int i=0; i<total; i++)
{
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=EU: 1051
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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55200000 55500000 -9223372036854775808 55500000 2 ...
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143100000 143900000 -9223372036854775808 -9223372036854775808 0 ...
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0 ...
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11000000 10500000 -9223372036854775808 11000000 0 ...
[4] 111619 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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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