- 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
Obtener registros de eventos por país o divisa
En el calendario se consultan eventos específicos de diversa índole para un intervalo de fechas determinado y se filtran por país o divisa.
int CalendarValueHistory(MqlCalendarValue &values[], datetime from, datetime to = 0,
const string country = NULL, const string currency = NULL)
La función CalendarValueHistory rellena el array values pasado por referencia con entradas de calendario en el intervalo de tiempo comprendido entre from y to. Ambos parámetros pueden incluir fecha y hora. El valor from se incluye en el intervalo, pero el valor to no. En otras palabras: la función selecciona las entradas del calendario (estructurasMqlCalendarValue), en las que se cumple la siguiente condición compuesta para la propiedad time: from <= time < to.
La hora de inicio from debe especificarse, mientras que la hora de finalización to es opcional: si se omite o es igual a 0, todos los eventos futuros se copian en el array.
El tiempo to allí debe ser mayor que from, excepto cuando es 0. Una combinación especial para consultar todos los eventos disponibles (tanto pasados como futuros) es cuando from y to son ambos 0.
Si el array receptor es dinámico, se le asignará memoria automáticamente. Si el array tiene un tamaño fijo, el número de entradas copiadas no será mayor que el tamaño del array.
Los parámetros country y currency permiten establecer un filtrado adicional de los registros por país o divisa. El parámetro country acepta un código de país de dos letras ISO 3166-1 alfa-2 (por ejemplo, «DE», «FR», «EU»), y el parámetro currency acepta una designación de divisa de tres letras (por ejemplo, «EUR», «CNY»).
El valor por defecto NULL o una cadena vacía «» en cualquiera de los parámetros equivale a la ausencia del filtro correspondiente.
Si se especifican ambos filtros, solo se seleccionan los valores de aquellos eventos para los que se cumplen simultáneamente ambas condiciones: país y divisa. Esto puede resultar útil si el calendario incluye países con varias divisas, cada una de las cuales circula también en varios países. Por el momento no hay eventos de este tipo en el calendario. Para obtener los eventos en los países de la Eurozona, basta con especificar el código de un país concreto o «EU», y se asumirá la moneda «EUR».
La función devuelve el número de elementos copiados y puede establecer un código de error. En concreto, si se supera el tiempo de espera de la solicitud del servidor, en _LastError obtenemos el error 5401 (ERR_CALENDAR_TIMEOUT). Si en el array fijo no caben todos los registros, el código será igual a 5400 (ERR_CALENDAR_MORE_DATA), pero el array se llenará. Al asignar memoria a un array dinámico es posible que se produzca el error 4004 (ERR_NOT_ENOUGH_MEMORY).
¡Atención! El orden de los elementos de un array puede ser distinto del cronológico. Tiene que ordenar los registros por tiempo.
Utilizando la función CalendarValueHistory podríamos consultar los próximos eventos de la siguiente manera:
MqlCalendarValue values[];
|
Sin embargo, con este código obtendremos una tabla con información insuficiente, en la que los nombres de los eventos, la importancia y los códigos de divisa quedarán ocultos tras el identificador del evento en el campo MqlCalendarValue::event_id e, indirectamente, tras el identificador del país en el campo MqlCalendarEvent::country_id. Para que la salida de información sea más fácil de usar, debe solicitar una descripción del evento mediante el código de evento, tomar el código de país de esta descripción y obtener sus atributos. Veámoslo en el script de ejemplo CalendarForDates.mq5.
En los parámetros de entrada ofreceremos la posibilidad de introducir el código de país y la divisa para el filtrado. Por defecto, se solicitan eventos para la Unión Europea.
input string CountryCode = "EU";
|
El intervalo de fechas de los eventos contará automáticamente con un tiempo de ida y otro de vuelta. Este «algún tiempo» también se dejará a elección del usuario entre tres opciones: un día, una semana o un mes.
#define DAY_LONG 60 * 60 * 24
|
Definamos nuestra estructura MqlCalendarRecord, derivada de MqlCalendarValue, y añadámosle campos para una presentación conveniente de los atributos que serán rellenados por enlaces (identificadores) de estructuras dependientes.
struct MqlCalendarRecord: public MqlCalendarValue
|
Entre los campos añadidos hay líneas con importancia (uno de los valores del array estático importances), el nombre del evento, el país y la divisa, así como cuatro valores con el formato double. En realidad, esto significa duplicar la información en aras de la presentación visual al imprimirla. Más adelante prepararemos un «envoltorio» más avanzado para el calendario.
Para rellenar el objeto necesitaremos un constructor paramétrico que tome la estructura original MqlCalendarValue. Después de copiar implícitamente todos los campos heredados en el nuevo objeto mediante el operador '=', llamamos al método especialmente preparado extend.
MqlCalendarRecord() { }
|
En el método extend obtenemos la descripción del evento por su identificador. A continuación, basándonos en el identificador de país de la descripción del evento, obtenemos una estructura con atributos de país. Después, podemos rellenar la primera mitad de los campos añadidos a partir de las estructuras recibidas MqlCalendarEvent y MqlCalendarCountry.
void extend()
|
A continuación, llamamos a los métodos integrados en Get para rellenar cuatro campos de tipo double con indicadores financieros.
Ahora podemos utilizar la nueva estructura en el manejador OnStart principal.
void OnStart()
|
Aquí el array de estructuras estándar MqlCalendarValue se rellena llamando a CalendarValueHistory para las condiciones actuales establecidas en los parámetros de entrada. A continuación, todos los elementos se transfieren al array MqlCalendarRecord. Además, mientras se crean los objetos, se amplían con información adicional. Por último, el array de eventos se envía al registro.
Las entradas del registro vienen bastante largas. En primer lugar, vamos a mostrar la mitad izquierda, que es exactamente lo que veríamos si imprimiéramos un array de estructuras estándar MqlCalendarValue.
CalendarValueHistory(values,from,to,CountryCode,Currency)=6 / ok Near past and future calendar records (extended): [id] [event_id] [time] [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [0] 162723 999020003 2022.06.23 03:00:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0 [1] 162724 999020003 2022.06.24 03:00:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0 [2] 168518 999010034 2022.06.24 11:00:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0 [3] 168515 999010031 2022.06.24 13:10:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0 [4] 168509 999010014 2022.06.24 14:30:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0 [5] 161014 999520001 2022.06.24 22:30:00 2022.06.21 00:00:00 0 -9223372036854775808 -6000000 -9223372036854775808 -9223372036854775808 0
|
Aquí está la segunda mitad con la «descodificación» de nombres, importancia y significados.
CalendarValueHistory(values,from,to,CountryCode,Currency)=6 / ok Near past and future calendar records (extended): [importance] [name] [currency] [code] [actual] [previous] [revised] [forecast] [0] "High" "EU Leaders Summit" "EUR" "EU" nan nan nan nan [1] "High" "EU Leaders Summit" "EUR" "EU" nan nan nan nan [2] "Medium" "ECB Supervisory Board Member McCaul Speech" "EUR" "EU" nan nan nan nan [3] "Medium" "ECB Supervisory Board Member Fernandez-Bollo Speech" "EUR" "EU" nan nan nan nan [4] "Medium" "ECB Vice President de Guindos Speech" "EUR" "EU" nan nan nan nan [5] "Low" "CFTC EUR Non-Commercial Net Positions" "EUR" "EU" nan -6.00000 nan nan
|