- 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
Trading con calendario económico
Existen muchas estrategias de trading de noticias: con órdenes de mercado o pendientes, con análisis de indicadores financieros (la dirección del movimiento de los precios) y sin él (captura de la volatilidad). Además, es útil insertar un filtro antinoticias en muchos otros sistemas de trading. Es difícil optimizar y depurar todos estos programas, ya que el calendario de MQL5 no está disponible en el probador. Sin embargo, con la ayuda de la caché desarrollada en la sección anterior, podemos corregir la situación.
Intentemos crear un Asesor Experto que entre en el mercado cuando se publiquen noticias, de acuerdo con la evaluación de su impacto en el precio. El archivo de caché «xyz.cal» acaba de crearse con el indicador CalendarMonitorCached.mq5.
Recordemos que la imagen del calendario en la caché corresponde siempre al momento en que se guarda y requiere precaución a la hora de leerlo: para los eventos posteriores, los indicadores reales son desconocidos, y los eventos más lejanos pueden no existir en absoluto. Debe actualizar regularmente el archivo de caché del calendario antes de la siguiente optimización o simulación.
Si es necesario, tenga también en cuenta los ajustes de la hora DST durante el año: si el modo DST de los eventos es diferente del DST en el momento en que se guardó el archivo de calendario, tendrá que retrasar o adelantar la hora en 1 hora. Puede evitar estas dificultades eligiendo un bróker sin DST o construyendo una estrategia en marcos temporales superiores a H1.
El Asesor Experto CalendarTrading.mq5 solo negociará los eventos de noticias que:
- hagan referencia al símbolo de trabajo del gráfico;
- tengan el tipo de indicador financiero (es decir, cuantitativo);
- sean de gran importancia;
- acaben de recibir el valor actual del indicador.
Esto último es importante porque para los indicadores que tienen valores previstos y reales, el sistema establece el valor del campo impact_type en consecuencia: servirá como señal de trading (indicará la dirección de entrada en el mercado).
La hora exacta de la publicación de la noticia, por regla general, no coincide con la hora prevista introducida en el campo MqlCalendarValue::time. El calendario no registra esta hora, y no está disponible en la caché. En este sentido, la precisión de la simulación de estrategias de noticias puede verse afectada. Si desea acercar el análisis y la toma de decisiones a un proceso en línea, acumule estadísticas de publicación de noticias mediante un servicio como CalendarChangeSaver.mq5 e incrustarlo en la caché.
De manera predeterminada, el trading se realiza con un lote mínimo, con niveles de Take Profit y Stop Loss fijados a una distancia determinada en puntos. Todo esto se refleja en los parámetros de entrada.
input double Volume; // Volume (0 = minimal lot)
|
Para las cuentas de cobertura, permitimos la existencia simultánea de varias posiciones, el valor predeterminado es 25. Este es el entorno de simulación recomendado porque le permite evaluar de forma independiente la rentabilidad del trading paralelo en noticias de distintos tipos (cada posición se crea de forma independiente y no conlleva el cierre de posiciones en otras noticias). Por otra parte, mantener una sola posición nivela automáticamente las señales contradictorias de noticias diferentes.
Opcionalmente, el Asesor Experto admite filtros para el identificador del tipo de noticia y texto para la búsqueda por título.
sinput ulong EventID;
|
Esto puede ser útil para futuras investigaciones sobre noticias concretas.
A nivel global, los punteros de los objetos se describen mediante el tratamiento analítico de las noticias y el seguimiento de la posición.
AutoPtr<CalendarFilter> fptr;
|
El modo de funcionamiento y el par de divisas del símbolo de trabajo actual se almacenan en las variables correspondientes. Para simplificar el ejemplo, se supone que se utiliza en Forex (en otros mercados, el trading se realizará en una sola divisa: la divisa de cotización del ticker).
const bool Hedging =
|
En el manejador OnInit, cargamos la caché del calendario y configuramos los filtros como se ha descrito anteriormente. La ausencia de caché está permitida en el gráfico en línea: entonces el Asesor Experto trabaja en modo de combate, directamente con el calendario. En el probador, la ausencia de un archivo de caché impedirá que se inicie el Asesor Experto.
int OnInit()
|
En el manejador OnTimer solicitamos cambios en las noticias según los filtros configurados.
void OnTimer()
|
Cuando se detectan los cambios adecuados, se registran de la siguiente manera (a continuación se muestra un fragmento del registro real), indicando la hora, la divisa, el país, el nombre, los valores actual y previsto, el valor anterior y la interpretación teórica de la señal:
... Filtering 5 records 2021.02.16 13:00 | EUR | EU | Employment Change q/q | HIGH | +0.3 | -0.4 | +1.0 | POSITIVE 2021.02.16 13:00 | EUR | EU | GDP q/q | HIGH | -0.6 | -0.7 | -0.7 | POSITIVE instant buy 0.01 EURUSD at 1.21638 sl: 1.21138 tp: 1.22138 (1.21637 / 1.21638 / 1.21637) deal #64 buy 0.01 EURUSD at 1.21638 done (based on order #64) ... Filtering 3 records 2021.07.06 12:05 | EUR | DE | ZEW Economic Sentiment Indicator | HIGH | +63.3 | +84.1 | +79.8 | NEGATIVE instant sell 0.01 EURUSD at 1.18473 sl: 1.18973 tp: 1.17973 (1.18473 / 1.18474 / 1.18473) deal #265 sell 0.01 EURUSD at 1.18473 done (based on order #265) ... |
El impacto potencial de la noticia sobre el precio debe calcularse basándose en la evaluación sobre el terreno impact_type. Es importante señalar aquí que tenemos dos divisas: base y cotización. Cuando la noticia tiene un efecto positivo sobre la divisa base, se espera que el tipo suba, y si es negativo, el tipo bajará. Para la divisa cotizada, ocurre lo contrario: un efecto positivo debería aumentar el precio de la segunda divisa del par, lo que significa una disminución del tipo de cambio, mientras que uno negativo conduce a su aumento. Esta dirección normalizada del movimiento del precio se calcula en el siguiente fragmento utilizando la variable sign.
static const int impacts[3] = {0, +1, -1};
|
A menudo las noticias aparecen publicadas al mismo tiempo, por lo que es necesario acumular las valoraciones de todas ellas. Esto se hace en la variable impact. Dado que nuestra estrategia solo filtra las noticias de mayor importancia, simplemente se suman todas las señales individuales de las mismas, sin coeficientes de ponderación. La variable de cadena about se utiliza para preparar el texto del comentario sobre el próximo acuerdo: en él se mencionarán los identificadores de los eventos que han dado lugar a la transacción.
Si el robot se lanza en una cuenta de compensación o se ha alcanzado el número máximo de posiciones permitido, cerraremos una.
PositionFilter positions;
|
Ahora puede abrir una nueva posición en una señal. Se establece un identificador de evento como número «mágico», que nos permitirá analizar posteriormente el rendimiento financiero del trading en el contexto de distintos tipos de noticias.
MqlTradeRequestSync request;
|
Movemos los Stop Loss de todas las posiciones a la llegada de los ticks.
void OnTick()
|
Ahora viene el punto más interesante. Gracias al probador es posible analizar el éxito de la estrategia de noticias no solo en general, sino también desglosado por noticias concretas. El bloque correspondiente se implementa en nuestro manejador OnTester. La recogida de datos se realiza mediante el filtro de transacciones. Tras recibir de él el array de tuplas trades, que informa sobre el beneficio, el swap, la comisión y el número mágico de cada operación, acumulamos los resultados en tres objetos de MapArray: calculan por separado los beneficios, las pérdidas y el número de operaciones para cada número de magic.
double OnTester()
|
Como resultado, obtenemos una tabla que muestra las estadísticas de cada tipo de evento línea por línea: su identificador, país, divisa, beneficio o pérdida total, número de operaciones (número de noticias), factor de beneficio y nombre del evento.
for(int i = 0; i < profits.getSize(); ++i)
|
Para probar la idea, vamos a ejecutar el Asesor Experto para el período comprendido entre principios de 2021 (hasta mediados de 2022) en el par EURUSD. A continuación se muestra un fragmento de un registro con una impresión de OnTester:
Trade profits by calendar events:
|
Los resultados no son muy impresionantes. Aun así, el trading de noticias está lleno de subjetividad. En primer lugar, las evaluaciones teóricas del impacto del valor real de la noticia en el curso pueden diferir de las expectativas emocionales de la multitud o de los antecedentes informativos adicionales (que quedan fuera del calendario y no son cuantificables). En segundo lugar, ya hemos mencionado la inexactitud del tiempo de publicación del valor real. En tercer lugar, nuestra estrategia se aplica de la forma más simple, sin analizar el movimiento preliminar de los precios (cuando probablemente hubo una filtración y la noticia se «agotó» antes).
En general, esta prueba reveló que los informes de nóminas no agrícolas o PIB favoritos de los operadores no garantizan el éxito, al menos no con nuestra configuración predeterminada. Además, es necesario, de la forma habitual, analizar las transacciones individuales, averiguar qué ha fallado, seleccionar parámetros y mejorar el algoritmo, en concreto, añadir un módulo de ajuste horario para cambiar el horario de verano en la zona horaria del servidor.
Al mismo tiempo, la técnica en sí funciona bien, y podemos simplemente intentar elegir las noticias más exitosas para empezar. Por ejemplo, tomemos la noticia 276030003 (Clima de Negocios de Ifo). Al configurarlo en EventID, recibiremos el siguiente informe, coincidente con nuestros indicadores calculados.
Informe sobre trading en el probador basado en noticias Clima de Negocios de Ifo
También puede intentar operar en un grupo de eventos similares. En concreto, para responder solo a las noticias sobre el PIB (de distintos países), introduzca la cadena «*PIB*» en la variable Text. Los asteriscos se añaden porque, sin ellos, una cadena de 3 caracteres será tratada como divisa por la clase de filtro. Las cadenas de cualquier longitud que no sean 2 (código de país) o 3 (código de divisa) pueden especificarse tal cual, por ejemplo, «granja», «no agrícola», «ventas»: el filtro las buscará como subcadenas de nombres, teniendo en cuenta mayúsculas y minúsculas.