Cómo construir un EA que opere automáticamente (Parte 01): Conceptos y estructuras
Introducción
Desde hace algún tiempo, varias personas que han leído mis artículos sobre cómo construir un EA desde cero me han estado pidiendo que cree un EA para ellos o que les dé algún tipo de consejo para que puedan hacerlo. Sin embargo, he repetido en todas estas peticiones que programar un EA que funcione por sí solo no es, ni de lejos, una de las tareas más complicadas de la programación. Siempre he motivado y dado la orientación adecuada a aquellos que realmente quieren aprender, buscando estudiar sobre el tema, ya sean entusiastas o incluso personas que realmente quieren crear un EA que siga un determinado proceso operativo y pueda operar solo de forma automática.
Me he dado cuenta de que muchas de estas personas tienen, en general, el mismo tipo recurrente de duda sobre cómo proceder con la parte de programación. Pero lo que más me llama la atención es el hecho de que muchos de ellos tienen, por una razón u otra, una idea totalmente equivocada de cómo hacer este tipo de EA, y otros no tienen la noción adecuada de los riesgos que conlleva el proceso de creación y uso de un sistema automático, entendiéndose, en este caso, un sistema EA automático como aquel que opera sin ningún tipo de supervisión, comprando y vendiendo sin ningún tipo de intervención del operador, de forma directa o indirecta.
Así surgió la idea de explicar estos puntos para que todo el mundo pueda entenderlos e incluso debatir sobre el tema. Les mostraré paso a paso como usted, aficionado o incluso alguien que quiera estudiar el tema, puede programar un EA de autotrading desde cero de una forma sencilla pero a la vez segura, principalmente usando sólo y únicamente MQL5 puro y nativo, sin soluciones milagrosas ni similares.
No voy, en este primer momento, a entrar en detalles complicados y llenos de gráficos bonitos y vistosos, intentando engañarlo a usted, que puede no tener los conocimientos adecuados en matemática estadística, diciéndole que los EAs que le voy a presentar son y serán su sustento, como si fueran operadores esclavos. Lejos de esto, crear un EA automatizado es una tarea muy larga, que requiere mucho tiempo de estudio y dedicación, para poder crear algo que realmente pueda ser rentable, esto no por la programación, pero, sí, por la forma de operar y otras cuestiones que abordaré.
El gran problema no es la parte de programación en sí, como muchos piensan erróneamente que es el problema grande y real cuando se quiere crear un EA automático. En muchos casos, tendremos más pérdidas que beneficios reales. Y vuelvo a repetir, el problema no está en la programación, está en la falta de experiencia de la persona que diseña el tipo de sistema operativo que va a ejecutar el EA. El defecto nunca está en el programador, aunque si éste cree que es un gran programador y la gente confía ciegamente en él, sin duda tendrán grandes problemas. Pero si la persona sabe realmente lo que está haciendo, estará completamente tranquila con su trabajo, dado que el problema no estará en la programación, sino en el sistema operativo deseado por la persona que pidió desarrollar el EA automático.
¿Cómo se divide un EA automático? ¿Cómo funciona realmente?
Antes de empezar cualquier cosa relacionada con la parte del código en sí, necesito nivelar un poco a todos los que leerán esta corta secuencia de artículos. Así que si usted ya sabe cómo funciona realmente un EA automático, lo más probable es que esta secuencia no añada nada a su conocimiento. Pero si no tiene ni idea de cómo funciona ni de lo que hace falta para que funcione, venga conmigo, en esta breve secuencia, a aprender al menos lo básico de la cosa, porque sin este conocimiento estará completamente perdido sin saber siquiera dar los primeros pasos ni saber qué es lo que debe estudiar y analizar de hecho.
Para empezar la explicación debe entender la figura 01, que se ve justo debajo:
Figura 01 - Diagrama esquemático del funcionamiento de un EA automático.
En esta imagen tenemos de forma muy resumida y sencilla como funciona realmente un EA automatizado. Observe que básicamente tenemos 2 estructuras internas en el EA, un sistema de órdenes, que siempre y en todo momento será idéntico a todos y cada uno de los EAs, y otra estructura, el sistema disparador, que es el responsable de que el EA realmente funcione de forma automática.
El sistema de órdenes siempre será el mismo, como ya se ha comentado, y se puede imaginar -sólo hay que pensar un poco- el hecho de que una vez creado este sistema y funcionando de forma estable, y confiando plenamente en él, ya que es lo que realmente formará parte de todos los EA que se creen, se puede pasar al sistema disparador, que es donde radican gran parte de los problemas.
Pero antes de empezar a ver realmente cómo deben y tienen que construirse estos sistemas, hay que entender cómo separarlos, y le ruego que preste atención a esto, porque mucha gente confunde las cosas y se pierde completamente al intentar crear un EA automático, sobre todo los que se inician en la programación, precisamente porque no entienden algunos conceptos básicos de la cosa.
Cómo debemos crear el sistema de órdenes...
Aquí me gustaría que hicieran lo siguiente, lean la serie de artículos Desarrollo de un EA comercial desde cero, porque allí muestro cada uno de los pasos necesarios para que ustedes desarrollen este sistema de órdenes, es muy cierto que en esta serie no expliqué algunos detalles que pueden, pero no necesariamente van, a existir dentro de un sistema de órdenes.
Dos de estos detalles son el break even, que sería el responsable de que el EA colocara automáticamente el valor del stop loss en una posición en la que usted no tendrá pérdidas, y el trailling stop, que es un mecanismo que, en el primer movimiento, generará ese break even para, en los siguientes disparos, hacer que su posición sea aún más ganadora en comparación con lo que de hecho ya se ha movido el activo...
Este mecanismo de trailing stop, a pesar de que muchos no lo sepan, existe por defecto en la plataforma MetaTrader 5, pero para que funcione es necesario habilitarlo en cada una de las posiciones, una a una, ajustando el valor de forma adecuada.... ...sé que no parece muy prometedor o incluso un poco compensador hacer esto, pero a falta de un sistema de órdenes cuyo mecanismo de trailing stop no haya sido realmente construido y probado, el uso del mecanismo presente en la plataforma MetaTrader 5 sería la mejor opción, ya que es muy estable y sobre todo fiable.
Así que todo y absolutamente todo lo que forma parte del sistema de órdenes, desde las líneas que aparecen en los gráficos que nos permiten analizar lo que está ocurriendo, hasta el mecanismo de trailing stop, todo ello forma parte del sistema de órdenes, que usted deberá crear totalmente aparte y probar, de forma manual, utilizándolo durante un periodo de tiempo que le parezca adecuado.
Durante este periodo, ustedes deben ajustar, corregir y probar todos los posibles fallos y errores que puedan producirse. Créanme, ustedes no quieren que el sistema de órdenes se cuelgue o genere una información en el gráfico que no represente en realidad lo que el EA está haciendo, ustedes quieren que todo y absolutamente todo lo que el EA haga pueda ser deshecho o modificado por ustedes, en el momento en que el sistema se pone a trabajar
Estas pruebas deben y tienen que hacerse durante un largo periodo de tiempo en una cuenta demo, donde no haya riesgo de pérdidas, o ganancias, pero es de vital importancia que estas pruebas se hagan de la forma más intensiva posible.
Pruebe TODO y absolutamente TODO mientras el sistema de órdenes no sea realmente como usted crea fiable, cómodo y sencillo de utilizar, no sólo por el EA, sino por USTED. No pase al siguiente paso, quédese ahí retocando y probando el sistema de órdenes. Y de nuevo, si no tiene ni idea de cómo crear un sistema de órdenes mínimamente decente, lea la serie de artículos que mostré al principio de este tema, estudie los códigos allí presentes, entienda cómo funciona cada uno de esos puntos y qué hay que modificar o ajustar para que se sienta cómodo para poder realmente dejar el sistema automatizado.
Tómese su tiempo. Créame, no querrá que el sistema de órdenes se rompa en medio de una operación real, porque si lo hace, no será nada pero absolutamente nada divertido. Y de nada sirve culpar a la plataforma o al mercado, porque el único responsable real del problema será única y exclusivamente usted.
Bueno, una vez que tenga un sistema de órdenes configurado y funcionando de la forma que desea y espera que funcione, podemos pasar al siguiente paso. Éste es bastante más sencillo, sin embargo, no hay que descuidar los cuidados necesarios cuando se trabaja en él. Me refiero al sistema disparador.
Entendamos el sistema disparador
El sistema disparador es una parte del mercado financiero que mucha gente, que no tiene conocimientos de programación ni de matemáticas, se anima a estudiar y seguir para intentar ganar dinero. Funciona conectado a un sistema de órdenes y crea la "magia" de un EA parecido a un tráder humano que puede trabajar ininterrumpidamente, 24 horas al día, 7 días a la semana, 52 semanas al año, sin cansarse ni sufrir estrés, sin tener miedo de entrar o salir de una operación.
El sistema disparador es realmente interesante, tanto por su programación como por su potencial matemático. Los que siguen el mercado ya deben haber oído hablar de operadores que tienen sistemas operativos muy eficaces y altamente rentables, como el ejemplo de Larry Richard Williams. ¿Quién no conoce esta historia y desea convertirse también en operador del mercado?
Por desgracia, hoy en día el mercado cuenta con una gran variedad de algoritmos que son más eficaces que el algoritmo utilizado por Larry Williams para ganar dinero y reconocimiento. Esto no significa, sin embargo, que el sistema disparador utilizado por él haya perdido viabilidad. Por el contrario, sigue siendo muy rentable y, con un control adecuado del riesgo, es posible obtener beneficios considerables con este mismo algoritmo. Recuerde que el sistema de activación debe ser sencillo para que el EA pueda aprovecharlo y para que usted pueda probarlo adecuadamente.
De nada sirve crear un sistema de activación, o una configuración, con reglas complejas y análisis extravagantes si no se puede traducir esto en una fórmula matemática sencilla y factible de programar. Así que olvídese de ideas como fijarse en un indicador Z relativo al activo X para negociar el activo Y en el momento K, seguir el nivel de agresión P, analizar la profundidad del mercado y buscar la incidencia de la intención W para decidir si comprar o vender. Olvídelo. Esto no funcionará o, al menos, complicará tanto el algoritmo que no podrá probarlo de forma eficaz.
Recuerde: opte siempre por la sencillez. Tratar de hacer las cosas lo más sencillas posible ayuda a reducir el número de fallos que pueden producirse, lo que evita que el sistema disparador envíe una enorme serie de solicitudes de compra o venta al sistema de órdenes, lo que puede acabar quebrando su cuenta y destruyendo su capital.
Hay una precaución que merece ser mencionada en este punto. Evite, en la medida de lo posible, generar un sistema disparador en el que el EA comience a comprar o vender aumentando la posición, es decir, promediando el precio, ya sea al alza o a la baja, este tipo de disparador suele dar muchos problemas. Lo ideal es que el EA entre y salga de una posición antes de intentar abrir una nueva, ya sea de compra o de venta.
Además, hay varias formas de impedir el envío de órdenes durante un determinado periodo de tiempo o de impedir que el EA envíe una orden si ya hay una posición abierta. Tenga esto en cuenta a la hora de crear y diseñar su sistema de activación, ya que muchos EA pueden entrar en modo bucle y empezar a destruir completamente su capital en cuestión de minutos, o incluso segundos.
Otra cosa importante que hay que mencionar sobre el sistema disparador es la importancia de estudiar. ¿Ha oído hablar del crack de 1987, también conocido como lunes negro? ¿No?
Si no es así, le recomiendo que estudie sobre ese tema. Antes de aventurarse a crear un EA automático, es importante conocer el crash de 1987, causado precisamente por el sistema disparador. Por eso, es fundamental estudiar antes de lanzarse a este tipo de actividad, porque uno no es mejor que nadie que haya venido antes y puede estar mal informado o no tener todos los conocimientos sobre cómo y por qué las cosas son como son. No se deje engañar por la gente que habla maravillas del comercio cuantitativo y que los EA dominarán el mercado en el futuro. Es importante ser prudente y sensato antes de confiar en cualquier información u opinión.
Deténgase a pensar un poco: ¿será que, si el comercio cuantitativo fuera realmente tan sencillo y eficiente como muchos dicen, las grandes instituciones, con todo su poder económico y su interés en ser aún más rentables, no utilizarían esos mecanismos? ¿Por qué iban a contratar a los mejores programadores, matemáticos y estadísticos si podían pagar por un sistema disparador que no perdiera nunca y poner una cláusula contractual que impidiera a cualquiera replicarlo? Investigue seriamente antes de creer que ha descubierto la solución mágica, porque todos los que realizan estudios en profundidad saben que ese mecanismo sencillamente no existe.
Muy bien, ahora que te he dado estas advertencias y te he mostrado cómo y qué se necesita para generar un EA automatizado, pasemos a la parte interesante: EL CÓDIGO.
Planificación inicial
Ahora que ya se le han presentado ideas y conceptos que debería llevar consigo a lo largo de su vida, tanto como programador como aficionado o incluso como operador profesional, pasemos a la fase en la que los conocimientos de programación realmente empiezan a importar y en la que mucha gente comete errores al pensar que programar es simplemente escribir una serie de comandos sin sentido lógico y que las cosas funcionarán simplemente porque ellos quieren.
En realidad, programar no es tan complicado ni místico. No hace falta ser un "PHD" en informática con una amplia formación académica para ser capaz de crear algo. Eso no es más que una excusa de personas con un bajo nivel de conocimientos que quieren parecer más listos que los demás.
Para programar, especialmente en un lenguaje como MQL5, que es muy similar a C y C++, no se necesitan muchos conocimientos. De hecho, sólo necesita saber 4 cosas básicas y tener 2 cualidades esenciales. Las 4 cosas que debe saber son:
- No hay programa que no se pueda hacer con comandos sencillos, así que aprenda y domine los comandos sencillos antes de utilizar los más avanzados.
- Aprenda a utilizar bien los siguientes comandos: IF, FOR y los operadores básicos: igualdad (=), suma (+), resta (-), división (/), multiplicación (*) y módulo (%).
- Comprenda la diferencia entre trabajar con bits y bytes y lo que hacen los operadores booleanos, como Not (!), Or (|), And (&) y Xor (^).
- Entienda la diferencia entre función y procedimiento, variable global y variable local, manejo de eventos y llamada procedimental.
Todo en programación se reduce a estas 4 cosas. No importa lo complejo que sea o pueda llegar a ser un programa, si usted no puede reducir su código a estas 4 cosas es porque está tratando de crearlo de la manera equivocada. Las dos cualidades esenciales son:
- No tenga vergüenza de leer la documentación del lenguaje (en este caso, la documentación de MQL5). Está ahí para ayudarlo.
- Sepa dividir las tareas, sea organizado, comente en su código las partes que aún no entiende y pruebe siempre, independientemente del resultado. Anote los resultados de las pruebas.
Partiendo de estas premisas, seguro que con el tiempo usted se convertirá en un excelente programador, pero debe dedicarse a ello y estudiar. No espere a que alguien le diga simplemente cómo hacer algo, busque siempre el conocimiento y el aprendizaje, porque con el tiempo las cosas le resultarán más claras. Pero lo principal es:
Sea humilde, no lo sabe todo y nunca lo sabrá todo. Acepte que siempre habrá alguien que sepa más que usted.
Ahora que ya sabe lo que tiene que hacer para crear su primer EA automático, empecemos a codificarlo. Recuerde lo que he dicho antes: primero tenemos que crear un sistema de órdenes que se adapte lo mejor posible a sus necesidades y que sea seguro, estable y robusto. No se preocupe por adornar las cosas, hay que crear algo que funcione y no algo lleno de extravagancias sin sentido.
Inicio de la planificación
Ahora empecemos a programar de verdad. ¡¿Cierto?! No. Todavía no. Tranquilícese. En primer lugar, abra el editor de código (MetaEditor). Lo primero que debe hacer es crear un EA desde cero. Es importante empezar con un código limpio, sin copiar el código de otras personas ni descargarlo de fuentes desconocidas sin saber lo que hacen. Empecemos de cero y escribamos un código original.
Para los que no sepan como hacerlo, una vez que tengan abierto el MetaEditor, en la esquina izquierda aparecerá una ventana llamada navegador, allí tendrán una estructura de directorios, todos ellos comenzarán en MQL5. Entienda esta ventana como si fuera el explorador de archivos, así le será más fácil seguir la explicación.
En esta misma ventana hay una carpeta llamada Experts. Aquí es donde vamos a poner los códigos para todos y cada uno de los EAs que estamos creando, hay otras carpetas, cada una con un propósito diferente, pero nuestro enfoque aquí y ahora es sólo la carpeta de Experts. Haciendo clic en esta carpeta, podrás abrirla y ver los códigos allí presentes, lo más probable es que estén organizados en función de otras carpetas, cada una representando un EA diferente, acostúmbrese a esta estructura, es importante mantener una cierta organización, de lo contrario se perderá totalmente entre todos los archivos allí presentes y no podrá encontrar el suyo cuando lo necesite.
Vamos entonces a realizar los primeros pasos, son bastante simples, a continuación, sólo tiene que seguir la secuencia de imágenes que se muestra a continuación:
Figura 02 - Elegimos qué crear
Figura 03 - Indicamos el directorio donde se ubicará nuestro código
Figura 04 - Damos un nombre a nuestro EA (no es necesario especificar la extensión)
Figura 05 - Hacemos clic en Siguiente
Figura 06 - Hacemos clic en Finalizar
Realizados estos pasos entre la figura 02 y la figura 06, el MetaEditor creará un código totalmente limpio y seguro para nosotros, usted debería ver algo como lo que se muestra a continuación:
#property copyright "Daniel Jose" #property link "https://www.mql5.com/pt/articles/11216" #property version "1.00" //+------------------------------------------------------------------+ int OnInit() { return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ void OnTick() { } //+------------------------------------------------------------------+
No se preocupe por las directivas de compilación #property. No afectarán en nada a lo que vamos a hacer, están ahí sólo para configurar la ventana, que se abrirá cuando ponga el EA en el gráfico, así que no se preocupe por ellos, pero debe preocuparse por las otras cosas aquí.
Vea que MetaEditor ha creado 3 procedimientos, estos son OnInit, OnDeInit y OnTick. Estos procedimientos son en realidad funciones de gestión de eventos. Sí, es cierto, no programamos de la misma manera en MQL5 que en otros lenguajes, MQL5 es un lenguaje basado en eventos, a diferencia de otros lenguajes donde trabajamos de manera procedimental. Los lenguajes basados en eventos pueden resultar confusos al principio, pero con el tiempo acabas entendiendo cómo hacer las cosas en ellos.
En este caso, y sin entrar en demasiados detalles, usted trabajará de hecho de la siguiente manera: La plataforma MetaTrader 5 genera un evento y usted responde a este evento, es decir cuando usted pone el EA en el gráfico, MetaTrader 5 disparará un evento, el evento Init que hará que la plataforma busque en su código la función OnInit, para que el EA (en este caso) se cargue e inicialice, una vez hecho esto, esta función no volverá a ser llamada. Esto de forma general, ya que sí, ella será llamada cada vez que la plataforma MetaTrader 5 ponga el EA en el gráfico, recuerde este hecho.
Pues aquí también tenemos la función OnDeInit, esta será llamada por la plataforma MetaTrader 5 cuando se genere un evento DeInit, el cual le indica a todas las cosas, EAs o Indicadores, que algo ha sucedido y que será eliminado del gráfico, ya sea momentánea o permanentemente, para saber la razón basta con mirar el valor de la razón que es reportado por la plataforma MetaTrader 5, así sabremos la razón de la eliminación del programa.
Y por último tenemos la función OnTick, que será llamada por la plataforma MetaTrader 5 cada vez que se produzca un evento Tick, y este evento se produce cada vez que se produce un nuevo ticket, es decir, cuando se ha producido una nueva operación, no importa cual, en el servidor de trading, se genera un evento Tick, por lo que se dispara la función OnTick, y el código va a ella.
La función OnTick es esencial para nuestro sistema, pero también puede ser el punto débil de muchos EAs. Esto se debe a que muchos programadores, por falta de experiencia o negligencia, acaban poniendo todo el código dentro de esta función, lo que puede sobrecargarla y hacer que el EA sea menos estable y propenso a fallos y errores críticos. Uno de los errores más complicados de solucionar es el error RUN TIME, que puede deberse a interacciones complejas y difíciles de reproducir. Pero esto se tratará con más detalle en otro artículo más adelante.
Para evitar estos problemas, la plataforma MetaTrader 5 y su lenguaje de programación MQL5 ofrecen otras formas de trabajar con las funciones, garantizando un nivel mínimo de seguridad y fiabilidad. Además, hay otros tipos de eventos que pueden utilizarse para mejorar el rendimiento global del sistema. Sin embargo, esto se discutirá más adelante, ya que no quiero crear confusión para aquellos que están viendo esto por primera vez y no tenían idea de que en MQL5 trabajamos con eventos desencadenados por la plataforma MetaTrader 5, en lugar de tratar de crear un código de procedimiento en el que tenemos un punto de entrada y un punto de salida, y todo lo que sucede entre estos dos puntos debe ser gestionado y manejado por el programa y el programador.
Aquí, en MQL5, sólo manejaremos los eventos que necesitemos. Para ser considerado EA, un programa debe tener necesariamente dos eventos: OnInit, que maneja la inicialización del EA, y OnTick, que maneja un evento de tick. El evento OnDeInit puede existir o no, pero a veces es útil en algunos casos especiales.
Para empezar a aprender a leer la documentación e interesarnos por entender lo que explica, echemos un vistazo a lo que dice sobre los eventos que se pueden generar, especialmente los tres eventos que crea automáticamente el MetaEditor cuando empezamos a construir un EA: OnInit, OnDeInit y OnTick. No olvide echar un vistazo también a la directiva de compilación property.
Es muy importante que usted entienda este primer paso, descrito en este artículo, de lo contrario estará completamente perdido en la explicación de los otros artículos de esta serie.
En el próximo artículo, le mostraré cómo crear un sistema de órdenes simple y directo que le permita enviar órdenes de compra y venta directamente desde el gráfico. Así que no se olvide de seguir el próximo artículo, porque el tema será muy interesante para aquellos que quieren construir un EA que opera de forma automatizada.
Traducción del portugués realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/pt/articles/11216
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso