- Conceptos básicos del calendario
- Obtener la lista y las descripciones de los países disponibles
- Consultar tipos de eventos por país y moneda
- Obtener descripciones de eventos por ID
- Obtener registros de eventos por país o moneda
- Obtener registros de eventos de un tipo específico
- Leer registros de sucesos por ID
- Seguimiento de los cambios de eventos por país o moneda
- Seguimiento de los cambios de eventos por tipo
- Filtrar eventos por múltiples condiciones
- Transferir la base de datos de calendarios al probador
- Operar con el calendario
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
|
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
|
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:
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
|
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.