SagaQuant

[MQL5 – Metatrader 5] Guía de Programación

Guía MQL5 - Programación MT5

Como programar en MQL5 (Metatrader 5)

Introducción

Cuando hablamos de aprender un lenguaje nuevo de programación puede ser todo un reto, especialmente para aquellos menos experimentados, es por eso que en este post, junto a los vídeos que subo en mi canal de Youtube, me gusta guiar desde cero todo contenido didáctico sobre desarrollo de software, por eso ahora es el turno de MQL5 desde cero.

Después de la serie de vídeos «MQL4 desde Cero (Metatrader 4)«, serie que ha servido para poder ayudar a quienes quieran empezar a programar sus algoritmos bursátiles y también me ha servido para perfeccionar un método didáctico que pueda encajar en tener un ratio de tiempo/utilidad ajustado. Sin demasiadas vueltas ni rodeos con detalles, salvo que sean necesarios, algo que también hago en mi formación introductoria sobre Trading Algorítmico.

Además este curso tiene la novedad de enseñar primero como crear Expert Advisors o Sistemas automáticos de Trading en vez de empezar por scripts e indicadores.

Esta es la forma en la que planteo los vídeos de MQL5 desde Cero, y al igual que con Metatrader 4, la idea es poder preparar algoritmos de todo tipo para esta plataforma todoterreno que nos sirve para operar casi cualquier mercado con sistemas de trading algorítmico o creando nuestros propios indicadores y scripts para análisis de mercado.

El artículo de hoy pretende ser un complemento a estos vídeos y una pequeña guía de apoyo, especialmente para aquellos que empiezan desde cero en la programación.

¿Por qué programar en MQL5?

Ya hablé de esto en el artículo MQL4 vs MQL5, pero, resumiré algunos puntos aquí e incluso me voy a permitir añadir alguno nuevo.

Si hablamos de Forex, la decisión entre Metatrader 4 y Metatrader 5 es algo que no tiene demasiada relevancia, ya que ambas plataformas tienen capacidad de sobra para ello, y mientras que optimizar en MT5 será más rápido, en MT4 la curva de aprendizaje es muchísimo más simple.

Tenemos acceso a todos los núcleos del microprocesador del ordenador, por lo que la labor de optimizar, mediante hilos es más rápida, lo cual podríamos decir que es la ventaja principal de esta plataforma.

A esto podemos añadirle la parte que creo yo que es más interesante, es una plataforma todoterreno, y es que usando MQL5 / Metatrader 5 podemos hacer Trading Algorítmico con Futuros, Acciones, Forex, CFDs e incluso opciones.

Es decir, tenemos los CFDs de Metatrader 4 y el resto de mercados, en este caso ya centralizados, tenemos un abanico nuevo de posibilidades.

Soy partidario de que Forex y CFDs son instrumentos estupendos para aprender sobre Trading, pero llegará un punto que, una vez teniendo cierta experiencia sea interesante avanzar hacia otros mercados, sin necesidad de dejar Forex, como método de diversificación de sistemas y activos. Además de beneficiarnos de comisiones más bajas en nominales altos.

Adelanto desde ya, esta plataforma es todoterreno, es decir, abarca demasiado, y nos valdrá como paso intermedio, no obstante para futuros más adelante veremos otras plataformas, para que se pueda elegir la que más os guste.

Artículos relevantes:

Forex o Futuros – Sagaquant

MQL4 vs MQL5 – Sagaquant

Esto lo iré comentando también en los vídeos próximos.

¿Por dónde empiezo? Estructura de un EA con MQL5

Ya hablé de variables en el primer vídeo, y de los conceptos más básicos, si no lo has visto, empieza por aquí:

Ya que este post trata como apoyo a partir del vídeo 2, merece la pena tener visto el primer el vídeo antes.

Tratando así este artículo como una guía didáctica complementaria a los vídeos de MQL5 desde CERO.

¿A qué nos enfrentamos a la hora de realizar un Expert Advisor o Algoritmo de Trading en MQL5? Veamos.

Cabecera de un código MQL5 – Programación en Metatrader 5:

Voy a usar como ejemplo un código sobre imbalances de mercado que compartí en otro vídeo previo a esta serie de vídeos como ejemplo de lo que se puede hacer, y sobretodo, la tan ansiada estructura.

Este es el vídeo del algoritmo de imbalances, considero que es imprescindible ya que es poner en práctica todo el conocimiento de este artículo y más.

Una vez visto, podemos ir a por la estructura:

Cabecera de un Expert Advisor en MQL5 – Metatrader 5

Estas son las primeras líneas de código que podemos encontrar en cualquier Expert Advisor, EA, o Algoritmo de Trading creado con MQL5.

Como podemos ver, no difiere mucho de su antecesor, MQL4, pero tiene ciertas peculiaridades.

En el primer renglón podemos ver los clásicos, las propiedades de copyright que no han cambiado: Autor, Web, Versión.

El segundo si es algo nuevo, y aunque lo traté en aquel vídeo, el relacionado a este código, tocará volverlo a tratar:

MQL5 está orientado a objetos, lo cual, la teoría dicta que es un ahorro de tiempo al poder reutilizar código, ya que estamos llamando a fuentes externas con códigos ya escritos, en este caso la gestión de operaciones y posiciones.

La realidad es un poco distinta, y es un parche, para no tener que lidiar con la sintaxis absurdamente larga de este lenguaje. Donde mandar una orden sin llamar a estos objetos puede alargarse un par de decenas de líneas más.

Este parche, como digo, consiste en llamar a código escrito previamente e instanciarlo en nuestro código sin tener que escribirlo nosotros.

Para eso, mediante un #include, localizamos el fichero de código. Carpeta Trade, fichero Trade.mqh

Este fichero contiene una clase llamada CTrade, la cual traemos como nombre trade.

Es complicado explicar, sin tocar la teoría de aquellos libros confusos de programación orientada a objetos qué es una clase, por lo que quiero simplificarlo mucho.

Un objeto se compone de clases, cada clase es un grupo de código que agrupa varias funciones relacionadas.

Ok, ¿Recordáis las funciones bool compra() y bool venta() de nuestros códigos en MQL4?

Imaginad que ahora tenemos un fichero que agrupa decenas de patrones de compra y venta en funciones, eso sería una librería, y dentro de esa librería existiría una clase patrones donde se agruparían esas funciones.

Entonces:

Fichero Trade -> Clase CTrade -> Funciones relacionadas con Trading (Órdenes).

Lo dije en el video y lo repito, la teoría es complicada, la práctica no.

Vamos a quedarnos con esto, llamo a un código ya escrito para no repetirlo, y este está agrupado en funciones.

La siguiente clase no es relevante, al menos ahora, que sería el position_info, raramente se utiliza y aunque tiendo a colocarlo, no lo haré hasta que no sea necesario en los vídeos.

El siguiente renglón cambia también, ¿Sorpresa? No, ya he comentado que MQL5 tiene sus cosillas, no obstante es acostumbrarse.

Declaramos ARRAYS, en mayúsculas, quedaros con este nombre, o si sois defensores a ultranza del Castellano, serían vectores, una variable, que tiene varias posiciones.

Recordamos, una variable es un espacio en la memoria del PC donde guardamos un dato, un array es una variable donde almacenamos múltiples datos con posiciones, piensa en una estantería, posición 1, posición 2, 3, 4…

Esto ya lo hacíamos al llamar en MQL4 a Close[1], High[2]… etc, con una diferencia:

MQL5 tiene la peculiaridad de que, en vez de cargar todo por defecto en memoria, como MQL4, llamamos solo a lo que necesitamos, como no, en el espíritu de seguir con la programación orientada a objetos. Ahorrar recursos del PC, luego ya emitiré el jucio de qué pienso sobre todo esto, continuemos.

¿¡Handle, qué es eso, de Handle!?

Necesitamos llamar a un controlador, y no, no va ahí, lo he puesto para que os acostumbréis a verlo YA, porque tiene una amplia relación con lo anterior, si llamo a un indicador no solo debo declarar el array (SMA en este caso), si no que también debo instanciar el indicicador con un «controlador», donde declararía qué indicador quiero llamar. Normalmente se pone en OnTick, pero he querido «subirlo» porque va de la mano con esta explicación.

Y ya lo que queda… Inputs, variables que quiero poder modificar desde fuera de forma gráfica, esto ya lo vimos en Metatrader 4.

Un input es una variable que luego podré modificar al correr el EA u optimizarlo.

Inputs en MQL4

¿Recordáis esto en MQL4? En MQL5 no cambia, y es que muchos términos en la programación de Metatrader 5 permanecen.

Recordad también que cada variable tiene un tipo, string para texto, integer para números enteros, double para decimales… etc

Funciones de compra y venta en el código MQL5

En el código presentado no hay ninguna determinada, ya que el código en sí, lo que serían las condiciones de compra serían muy cortas, no es problema, vamos a crear una rápido. Dado que compra y venta tienen los mismos componentes y solo cambian las reglas, crearé solo una, función de compra.

Funciones de compra MQL5 – Metatrader 5

Importante, pues esto ha sido error de novatos durante mucho tiempo, y hasta que no se fija uno, no cae en el por qué.

Todas las funciones externas deben ir en el conjunto «global», esto es, fuera de otras funciones. Normalmente con ponerlo entre OnDeinit y OnTick está bien, ya que son funciones también.

Recordemos que una función es un cálculo realizado, o un conjunto de operaciones que nos devuelve una variable.

¿Os suena de algo? ¡Efectivamente! Cuando llamo a una clase obtengo sus funciones, esto es parecido, por no decir igual.

Funciones bool, las cuales nos devolverán un estado verdadero o falso.

El objetivo es simple y podemos leerlo línea por línea, función bool de compra, dos paréntesis vacíos, abrimos llaves y colocamos un if:

Si mi condición es cierta, devuelve verdadero, y si no lo es, devuelve falso.

Una vez llamado a este código, sabremos si existen las condiciones de compra o no.

Esto será explicado con más detenimiento en los vídeos, pero como veis, existe poco misterio en torno a esto. Separamos las funciones de entrada-salida del mercado, e incluso si queremos de algún análisis o filtro complejo para dejar limpio el código. Práctica muy importante en MQL5 ya que tiende a ser el código más largo.

Estructura OnTick

Llegamos al corazón de un EA, dentro de esta estructura nuestro código estará siendo repetido por cada tick recibido del mercado, lo cual, estamos hablando, que según volatilidad e instrumento, nuestro código puede ser ejecutado más de 2000 veces por minuto, o solamente 5 veces. Depende de la velocidad de negociación del activo.

Dentro de esta estructura, la cual es el pilar de un sistema automático de trading tanto en MQL4 como MQL5, es donde se desarrollan los componentes principales a la hora de operar.

Voy a utilizar un código más simple que el EA de Imbalances, aunque no puedo evitar recalcar una y otra vez, que es un vídeo que merece la pena ver. Bastante instructivo a la hora de programar en MQL5 y una buena introducción a las capacidades de trading con Futuros de Metatrader 5, pero no vamos a complicarnos ahora mismo.

Inicio OnTick MQL5 Metatrader 5

Entramos ya en OnTick, y la primera parte es nueva, valores declarados, como ya he dicho, llamamos sólo a lo que necesitamos, y en base a esto necesitaremos:

El famoso Handle si es indicador, que en teoría debería ir aquí, está puesta una media móvil, pero podría ser un ATR, RSI, Momentum… etc

Copiaremos el buffer, es decir, los datos del Handle o de Precio mediante CopyBuffer( Y llamamos desde aquí al Handle y al Array ya creado) o CopyClose( Array de Cierre).

Una vez hecho esto deberemos llamar a la función ArraySetAsSeries para que nos ordene las series temporales de la misma forma que MQL4, es decir, posición cero la actual y de ahí «hacia atrás», ya que por defecto lo hará al revés.

Continuamos, detectar órdenes.

¿Veis algún cambio? Vale, hay tres, pero uno importante, ahora mismo, no voy a usar detección por Magic Number, y me explico.

En futuros no suele existir el hedging, todas las posiciones son netas.

Malas noticias para aquellos que hacen coberturas, pero al ser la mayoría de brokers que trabajan con Futuros regulados en USA todas las posiciones son netas, además de que Metatrader 5 raramente lo permite, en la mayoría de brokers es «Netting» y solo en algunos de CFDs es «Hedging», si yo tengo un contrato comprado en el micro futuro del S&P 500 y meto un corto, automáticamente mi exposición pasará a cero.

Por lo que, al tener sistemas que no van a «cruzarse» unos con otros no lo veo interesante, igualmente lo trataré más adelante.

bool trade = true; Pero en vez de trade, que ya está ocupado por el objeto CTrade, ponemos tradea.

Seleccionamos todas las posiciones a mercado, posiciones que no órdenes y buscamos, si existe una posición, si estamos operando ya ese símbolo lo obviamos.

Como ya digo, se pueden hacer «apaños», pero no merece la pena, al menos en Futuros o Acciones.

Continuamos con MQL5, hora de mandar órdenes y gestionarlas:

Gestión Órdenes MQL5 Metatrader 5

Entonces, debajo del código añadimos un:

Si podemos operar entonces comprobamos las condiciones, si es cierto que puedo comprar, mando una compra. Si es cierto que puedo vender, mando una venta.

En vez de utilizar OrderSend es aquí donde llamamos a la clase trade, trade. y seleccionamos la función.

Notas importantes

Repito, esto debe ser tomado como guía didáctica junto a los vídeos de MQL5 desde Cero donde se explica con más detalle el funcionamiento con detalle para montar EAs, junto a varias sorpresas que están preparadas para más adelante.

El enfoque de programación orientado a objetos de MQL5, es decir, para la programación en Metatrader 5 no me parece el más adecuado y para mí es una de las mayores pegas de esta plataforma, pese a que a cambio obtengamos datos directamente del broker.

Respecto a estos datos, son útiles en Futuros, pero es muy difícil encontrarlos de buena calidad, ya hablaré de eso. En principio para Forex no hay mucha diferencia entre los extraídos de Metaquotes (Metatrader 4) y los del broker (Metatrader 5), ya que al ser un mercado descentralizado las estructuras más pequeñas del mercado cambian, es decir, timeframes por debajo de 15 minutos siguen siendo no recomendables.

No os preocupeis si ahora no entendeis todo, es normal, hay gente que leerá esto sin conocer programación e incluso, gente que leerá esto siendo expertos programadores pero sin conocer conceptos bursátiles. Todo lo que está aquí se va explicando en vídeos, y mucho está ya en mi canal de Youtube.

Conclusión – Sobre programar en MQL5

Cualquier programador que quiera considerarse medianamente experimentado, y cualquier trader algorítmico también, debe conocer varios lenguajes de programación, esto queda a disposición de cada cual elegir cuales son más útiles.

Pero no puedo evitar recalcar que MQL5 es posiblemente uno de los lenguajes de «transición» más interesantes, ya que combina sintaxis de MQL4 con conceptos similares a C# que se ven en Ninjatrader, añadiendo también el aprendizaje sobre Futuros y Acciones (Opciones también, pero esto lo dejaré para mucho más adelante), que nos permiten seguir avanzando en el Trading Algorítmico.

La teoría parece difícil y lo es, es otra cosa que debo recalcar varias veces, os vais a sentir abrumados al principio, MQL4 es un lenguaje procedural muy simple, ProRealCode es una mezcla de Basic y Easylanguage aún más simple.

La práctica, una vez interiorizados los conceptos más básicos, veremos que es extremadamente fácil.

Para ello dejo algunos recursos externos interesantes:

Curso de Programación – Programación orientada a Objetos

Programación orientada a Objetos explicada

Espero que este artículo pueda servir de utilidad como guía didáctica a la hora de enfocar un lenguaje nuevo.

Un abrazo, Víctor – Sagaquant.

Recuerda que si no quieres perderte ningún artículo puedes seguirme por diversas redes sociales:

Twitter 

Canal Telegram

Grupo Telegram de Trading Algorítmico

Salir de la versión móvil