Comercio algorítmico de Forex: un cuento práctico para ingenieros

Publicado: 2022-03-11

Como sabrá, el mercado de divisas (Forex o FX) se utiliza para negociar entre pares de divisas. Pero es posible que no sepa que es el mercado más líquido del mundo.

Hace unos años, impulsado por mi curiosidad, di mis primeros pasos en el mundo del comercio algorítmico de Forex al crear una cuenta demo y realizar simulaciones (con dinero falso) en la plataforma comercial Meta Trader 4.

Ilustración de portada de divisas

Después de una semana de 'trading', casi dupliqué mi dinero. Estimulado por mi propio comercio algorítmico exitoso, profundicé más y finalmente me inscribí en varios foros de FX. Pronto, pasaba horas leyendo sobre sistemas de comercio algorítmicos (conjuntos de reglas que determinan si debe comprar o vender), indicadores personalizados, estados de ánimo del mercado y más.

mi primer cliente

Por esta época, casualmente, escuché que alguien estaba tratando de encontrar un desarrollador de software para automatizar un sistema comercial simple. Esto fue en mis días de universidad cuando estaba aprendiendo sobre programación concurrente en Java (hilos, semáforos y toda esa basura). Pensé que este sistema automatizado no podía ser mucho más complicado que mi curso avanzado de ciencia de datos, así que pregunté sobre el trabajo y me uní.

El cliente quería un software de comercio algorítmico creado con MQL4, un lenguaje de programación funcional utilizado por la plataforma Meta Trader 4 para realizar acciones relacionadas con acciones.

Desde entonces, se ha lanzado MQL5. Como era de esperar, soluciona algunos de los problemas de MQL4 y viene con más funciones integradas, lo que facilita la vida.

El papel de la plataforma de negociación (Meta Trader 4, en este caso) es proporcionar una conexión con un corredor de Forex. Luego, el corredor proporciona una plataforma con información en tiempo real sobre el mercado y ejecuta sus órdenes de compra/venta. Para los lectores que no están familiarizados con el comercio de divisas, aquí está la información proporcionada por la fuente de datos:

Este diagrama demuestra los datos involucrados en el comercio algorítmico de Forex.

A través de Meta Trader 4, puede acceder a todos estos datos con funciones internas, accesibles en varios intervalos de tiempo: cada minuto (M1), cada cinco minutos (M5), M15, M30, cada hora (H1), H4, D1, W1, MN .

El movimiento del Precio Actual se llama tick . En otras palabras, un tick es un cambio en el precio de oferta o demanda de un par de divisas. Durante los mercados activos, puede haber numerosos ticks por segundo. Durante los mercados lentos, puede haber minutos sin marcar. El tick es el latido del corazón de un robot del mercado de divisas.

Cuando realiza un pedido a través de dicha plataforma, compra o vende un cierto volumen de una determinada moneda. También establece límites de stop-loss y take-profit. El límite de stop-loss es la cantidad máxima de pips (variaciones de precio) que puede permitirse perder antes de abandonar una operación. El límite de toma de ganancias es la cantidad de pips que acumulará a su favor antes de cobrar.

Si desea obtener más información sobre los conceptos básicos del comercio (p. ej., pips, tipos de órdenes, spread, slippage, órdenes de mercado y más), consulte aquí.

Las especificaciones comerciales algorítmicas del cliente eran simples: querían un robot de Forex basado en dos indicadores. Como antecedentes, los indicadores son muy útiles cuando se trata de definir un estado de mercado y tomar decisiones comerciales, ya que se basan en datos anteriores (por ejemplo, el valor de precio más alto en los últimos n días). Muchos vienen integrados en Meta Trader 4. Sin embargo, los indicadores que le interesaban a mi cliente procedían de un sistema de comercio personalizado.

Querían intercambiar cada vez que dos de estos indicadores personalizados se cruzaban, y solo en un cierto ángulo.

Este ejemplo de algoritmo comercial demuestra los requisitos de mi cliente.

Las manos en

Mientras me ensuciaba las manos, aprendí que los programas MQL4 tienen la siguiente estructura:

  • [Directivas del pre procesador]
  • [Parámetros externos]
  • [Variables globales]
  • [Función inicial]
  • [Función de definición]
  • [Función de inicio]
  • [Funciones personalizadas]

La función de inicio es el corazón de cada programa MQL4 ya que se ejecuta cada vez que el mercado se mueve (es decir, esta función se ejecutará una vez por tick). Este es el caso independientemente del período de tiempo que esté utilizando. Por ejemplo, podría estar operando en el marco de tiempo H1 (una hora), pero la función de inicio se ejecutaría miles de veces por marco de tiempo.

Para evitar esto, obligué a la función a ejecutarse una vez por unidad de período:

 int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...

Obteniendo los valores de los indicadores:

 // Loading the custom indicator extern string indName = "SonicR Solid Dragon-Trend (White)"; double dragon_min; double dragon_max; double dragon; double trend; int start() { … // Updating the variables that hold indicator values actInfoIndicadores(); …. string actInfoIndicadores() { dragon_max=iCustom(NULL, 0, indName, 0, 1); dragon_min=iCustom(NULL, 0, indName, 1, 1); dragon=iCustom(NULL, 0, indName, 4, 1); trend=iCustom(NULL, 0, indName, 5, 1); }

La lógica de decisión, incluida la intersección de los indicadores y sus ángulos:

 int start() { … if(ticket==0) { if (dragon_min > trend && (ordAbierta== "OP_SELL" || primeraOP == true) && anguloCorrecto("BUY") == true && DiffPrecioActual("BUY")== true ) { primeraOP = false; abrirOrden("OP_BUY", false); } if (dragon_max < trend && (ordAbierta== "OP_BUY" || primeraOP == true) && anguloCorrecto("SELL") == true && DiffPrecioActual("SELL")== true ) { primeraOP = false; abrirOrden("OP_SELL", false); } } else { if(OrderSelect(ticket,SELECT_BY_TICKET)==true) { datetime ctm=OrderCloseTime(); if (ctm>0) { ticket=0; return(0); } } else Print("OrderSelect failed error code is",GetLastError()); if (ordAbierta == "OP_BUY" && dragon_min <= trend ) cerrarOrden(false); else if (ordAbierta == "OP_SELL" && dragon_max >= trend ) cerrarOrden(false); } }

Envío de los pedidos:

 void abrirOrden(string tipoOrden, bool log) { RefreshRates(); double volumen = AccountBalance() * point; double pip = point * pipAPer; double ticket = 0; while( ticket <= 0) { if (tipoOrden == "OP_BUY") ticket=OrderSend(simbolo, OP_BUY, volumen, Ask, 3, 0/*Bid - (point * 100)*/, Ask + (point * 50), "Orden Buy" , 16384, 0, Green); if (tipoOrden == "OP_SELL") ticket=OrderSend(simbolo, OP_SELL, volumen, Bid, 3, 0/*Ask + (point * 100)*/, Bid - (point * 50), "Orden Sell", 16385, 0, Red); if (ticket<=0) Print("Error abriendo orden de ", tipoOrden , " : ", ErrorDescription( GetLastError() ) ); } ordAbierta = tipoOrden; if (log==true) mostrarOrden(); }

Si está interesado, puede encontrar el código ejecutable completo en GitHub.

Prueba retrospectiva

Una vez que construí mi sistema de operaciones algorítmicas, quería saber: 1) si se estaba comportando adecuadamente y 2) si la estrategia de operaciones de Forex que utilizaba era buena.

Backtesting (a veces escrito "back-testing") es el proceso de probar un sistema particular (automatizado o no) bajo los eventos del pasado. En otras palabras, prueba su sistema usando el pasado como un proxy para el presente.

MT4 viene con una herramienta aceptable para realizar una prueba retrospectiva de una estrategia comercial de Forex (hoy en día, hay herramientas más profesionales que ofrecen una mayor funcionalidad). Para comenzar, configura sus marcos de tiempo y ejecuta su programa bajo una simulación; la herramienta simulará cada tick sabiendo que para cada unidad debe abrirse a un precio determinado, cerrarse a un precio determinado y alcanzar máximos y mínimos específicos.

Después de comparar las acciones del programa con los precios históricos, tendrá una buena idea de si se está ejecutando correctamente o no.

Los indicadores que había elegido, junto con la lógica de decisión, no eran rentables.

A partir del backtesting, verifiqué la tasa de retorno del robot FX en algunos intervalos de tiempo aleatorios; No hace falta decir que sabía que mi cliente no se iba a enriquecer con eso: los indicadores que había elegido, junto con la lógica de decisión, no eran rentables . Como muestra, estos son los resultados de ejecutar el programa en la ventana M15 para 164 operaciones:

Estos son los resultados de ejecutar el programa de software de algoritmo comercial que desarrollé.

Tenga en cuenta que nuestro saldo (la línea azul) termina por debajo de su punto de partida.

Una advertencia: decir que un sistema es "rentable" o "no rentable" no siempre es genuino. A menudo, los sistemas son (no) rentables por períodos de tiempo en función del "estado de ánimo" del mercado, que puede seguir una serie de patrones gráficos:

Algunas tendencias en nuestro ejemplo de comercio algorítmico.

Optimización de parámetros y sus mentiras

Aunque las pruebas retroactivas me habían hecho desconfiar de la utilidad de este robot FX, me intrigó cuando comencé a jugar con sus parámetros externos y noté grandes diferencias en la relación de retorno general. Esta ciencia particular se conoce como Optimización de Parámetros .

Hice algunas pruebas aproximadas para tratar de inferir la importancia de los parámetros externos en la relación de retorno y obtuve algo como esto:

Un aspecto de un algoritmo de Forex es la relación de retorno.

O, limpiado:

La relación de retorno del comercio algorítmico podría verse así cuando se limpia.

Puede pensar (como lo hice yo) que debería usar el Parámetro A. Pero la decisión no es tan sencilla como parece. Específicamente, tenga en cuenta la imprevisibilidad del Parámetro A: para valores de error pequeños, su retorno cambia drásticamente. En otras palabras, es muy probable que el Parámetro A sobrediga los resultados futuros, ya que cualquier incertidumbre, cualquier cambio, resultará en un peor desempeño.

Pero de hecho, ¡el futuro es incierto! Y así, el retorno del Parámetro A también es incierto. La mejor opción, de hecho, es confiar en la imprevisibilidad. A menudo, un parámetro con un rendimiento máximo más bajo pero una previsibilidad superior (menos fluctuación) será preferible a un parámetro con un rendimiento alto pero poca previsibilidad.

Lo único de lo que puede estar seguro es que no conoce el futuro del mercado, y pensar que sabe cómo se comportará el mercado basándose en datos anteriores es un error. A su vez, debe reconocer esta imprevisibilidad en sus predicciones de Forex.

Pensar que sabe cómo se comportará el mercado basándose en datos anteriores es un error.

Esto no significa necesariamente que debamos usar el Parámetro B, porque incluso los rendimientos más bajos del Parámetro A funcionan mejor que el Parámetro B; esto es solo para mostrarle que la optimización de parámetros puede resultar en pruebas que exageran los posibles resultados futuros, y tal forma de pensar no es obvia.

Consideraciones generales de negociación algorítmica de Forex

Desde esa primera experiencia de negociación algorítmica de Forex, he creado varios sistemas de negociación automatizados para clientes, y puedo decirle que siempre hay espacio para explorar y realizar más análisis de Forex. Por ejemplo, recientemente construí un sistema basado en encontrar los llamados movimientos "Big Fish"; es decir, enormes variaciones de pips en minúsculas unidades de tiempo. Este es un tema que me fascina.

Construir su propio sistema de simulación de FX es una excelente opción para aprender más sobre el comercio en el mercado Forex, y las posibilidades son infinitas. Por ejemplo, podría intentar descifrar la distribución de probabilidad de las variaciones de precios en función de la volatilidad en un mercado (EUR/USD, por ejemplo), y tal vez hacer un modelo de simulación de Monte Carlo usando la distribución por estado de volatilidad, usando cualquier grado de precisión que desea. Dejo esto como ejercicio para el lector ávido .

El mundo de Forex puede ser abrumador a veces, pero espero que este artículo le haya dado algunos puntos sobre cómo comenzar con su propia estrategia de negociación de Forex.

Otras lecturas

Hoy en día, existe una gran cantidad de herramientas para crear, probar y mejorar las automatizaciones de sistemas comerciales: Trading Blox para pruebas, NinjaTrader para operaciones, OCaml para programación, por nombrar algunas.

He leído mucho sobre el mundo misterioso que es el mercado de divisas. Aquí hay algunos artículos que recomiendo para programadores y lectores entusiastas:

  • BabyPips: este es el punto de partida si no sabe mucho sobre el comercio de divisas.
  • The Way of the Turtle, de Curtis Faith: Esta, en mi opinión, es la Biblia Forex . Léalo una vez que tenga experiencia en el comercio y conozca algunas estrategias de Forex.
  • Análisis técnico para el profesional del trading: estrategias y técnicas para los turbulentos mercados financieros mundiales actuales, por Constance M. Brown
  • Programación de asesores expertos: creación de sistemas de negociación automatizados en MQL para Meta Trader 4, por Andrew R. Young
  • Trading Systems: un nuevo enfoque para el desarrollo de sistemas y la optimización de carteras, por Urban Jeckle y Emilio Tomasini: Muy técnico, muy centrado en las pruebas de FX.
  • Una implementación paso a paso de un sistema de negociación de divisas con múltiples agentes, por Rui Pedro Barbosa y Orlando Belo: Este es muy profesional y describe cómo puede crear un sistema de negociación y una plataforma de prueba.