English Русский 中文 Deutsch 日本語 Português
Vídeo: Comercio automatizado simple: cómo crear un asesor comercial sencillo usando MQL5

Vídeo: Comercio automatizado simple: cómo crear un asesor comercial sencillo usando MQL5

MetaTrader 5Asesores Expertos | 15 julio 2022, 16:22
415 0
Raimund Bauer
Raimund Bauer

Parte 1. Creando un asesor comercial simple


El vídeo muestra la creación de una plantilla de asesor comercial. Un asesor comercial es una aplicación automatizada que puede funcionar en MetaTrader y puede abrir y cerrar posiciones por sí misma.

El vídeo presentado muestra la creación de un asesor experto simple. Clicamos en el icono "Editor MetaQuotes Language" o presionamos F4 en MetaTrader para abrir el MetaEditor. Clicamos en "Archivo" > "Nuevo archivo" > "Asesor (plantilla)" > "Siguiente". Yo he puesto a mi asesor el nombre SimpleExpertAdvisor. Luego clicamos en "Siguiente" > "Siguiente" > "Finalizar".

Esta versión es cómodamente legible por humanos. Cuando lo compilamos, creamos una versión legible para MetaTrader. Como el nuevo asesor experto ya ha sido creado, abriremos una nueva ventana del gráfico y arrastraremos el archivo recién creado a ella. Por ahora, el asesor no tiene lógica. La añadiremos en los próximos videos.


Parte 2. Funciones


MQL5 usa funciones para automatizar procesos. Nuestra plantilla de asesor ya tiene varias funciones. La función OnInit es la función de inicialización del asesor experto. Solo se ejecuta una vez cuando arrastramos el asesor al gráfico. El valor retornado indicará si la función ha sido exitosa.

La función OnDeinit se inicia antes de cerrar el asesor experto. No retorna nada (void).

La razón es simple: OnDeinit es lo último que se ejecutará en nuestro programa, y no podemos retornar nada, porque después de eso el programa se cerrará. La función OnTick se inicia cada vez que el precio en el gráfico cambia. La función OnTick activará la mayor parte de la lógica del código. Cada vez que el precio cambie en uno de sus gráficos, se activará todo lo que se encuentre entre esos dos paréntesis. Ahora podemos deshacernos del resto de elementos de la plantilla.

Para nuestro ejemplo sencillo, solo necesitaremos la función OnTick, que se usará para llamar a otra función y mostrar la hora local. Cuando queramos ver algo en nuestro gráfico, usaremos la función Comment (comentario). En nuestro caso, la función mostrará el valor personalizado en la esquina superior izquierda del gráfico. Los parámetros se indican entre paréntesis. Puede ser un texto, por ejemplo, "Hello".

Nuestro asesor ya está completamente listo. Ya podemos proceder a compilarlo. Ahora, volvamos a MetaTrader y arrastremos SimpleExpertAdvisor al gráfico. Al clicar en Aceptar, se mostrará el texto "Hello". Las posibilidades de la función Comment no se limitan a esto.

Queremos que se muestre la hora local, por lo que indicaremos: "The local time is" (la hora local es:). Podemos transmitir otro parámetro separado por comas. En nuestro caso, se trata de TimeLocal. Vamos a recompilar el código. Ahora el asesor muestra el texto "The local time is" y la hora local directamente en el gráfico.

En este vídeo, hemos aprendido sobre las funciones integradas, como la función OnTick, que se llama cada vez que cambia el precio. También hemos aprendido a usar la función Comment para mostrar texto seguido de un valor calculado. En particular, con solo unas pocas líneas de código, hemos mostrado el texto y la hora local.


Parte 3. Simulador de estrategias

En este vídeo, aprenderemos a usar el simulador de estrategias. El simulador de estrategias se ocupa del backtesting. El asesor experto se ejecuta según los datos históricos para evaluar su rentabilidad. La última vez creamos una plantilla simple que muestra el texto "Hello MQL5". Vamos a ponerla a prueba con la historia.

Entre en "Ver" > "Simulador de estrategias" o presione CTRL+R. Aparecerá el panel "Simulador de estrategias". Podemos seleccionar un archivo. Comenzaremos con el asesor experto simple (SimpleExpertAdvisor) que hicimos la última vez.

Usaremos para ello la pareja dólar australiano/dólar canadiense (AUDCAD) en el gráfico de minutos. También seleccionaremos 2017 como el periodo de prueba. Uno de los beneficios de MetaTrader 5 es que no tenemos que descargar datos históricos. Si seleccionamos un periodo para el que no tenemos datos históricos, se descargará automáticamente en segundo plano. La configuración de OHLC en M1 (apertura, máximo, mínimo, cierre) determina la calidad de la prueba. Si pasa el ratón sobre una vela, verá sus precios de apertura, máximo, mínimo y cierre.

No todo el mundo sabe que se simula cada tick de una vela con más de un cambio de precio. Incluso si seleccionamos el modo "Todos los ticks" para una vela diaria (24 horas), cada cambio de precio durante estas 24 horas, salvo los precios de apertura, máximo, mínimo y cierre, se calculará aleatoriamente.

Podrá encontrar los detalles en el manual del usuario. Yo no uso pruebas forward. Casi nadie puede predecir el futuro. La opción "Retrasos" permite simular retrasos en la red. Yo tampoco los uso.

El parámetro "Depósito inicial" permite especificar cuánto dinero tenemos en nuestra cuenta de prueba. La cantidad se puede especificar en dólares estadounidenses, euros o en cualquier otra divisa. También está la opción de "apalancamiento". Cuanto mayor sea, con más dinero (en relación con su cuenta) podrá comerciar.

De la "Optimización" hablaremos más abajo. Clicamos en el botón "Inicio" y vemos el texto "Hello MQL5" en el gráfico. No resulta muy interesante. Vamos a reemplazarlo utilizando la función TimeLocal.

Recompilamos el código y reiniciamos la prueba. Ahora podemos ver la hora local, que se calcula cada vez que cambia el precio. En este vídeo, hemos aprendido cómo usar el simulador de estrategias y a mostrar la hora local con solo unas pocas líneas de código MQL5.

 

Parte 4. Tipos de datos


En este vídeo hablaremos sobre los tipos de datos. Al poner una estrategia a prueba, vemos que la hora local se indica en un formato determinado. Cuando estamos calculando algo, es importante usar el tipo de datos correcto. Vamos a averiguar cómo lograr esto.

Clique en el icono "Editor MetaQuotes Language" o presione F4. En el MetaEditor abierto, clique en "Archivo" > "Nuevo archivo" > "Asesor (plantilla)" > "Siguiente". He puesto a mi asesor el nombre SimpleDataTypes. Luego clicamos en "Siguiente" > "Siguiente" > "Finalizar". Cualquier cosa que se encuentre por encima de la función OnTick se puede eliminar. También eliminaremos dos líneas con comentarios.

Comenzaremos con el tipo de datos más obvio, el texto. Usaremos el tipo de datos de cadena para asignar este texto a una variable de cadena llamada Text, pero no podremos usar variables de cadena para los cálculos.

Para obtener el balance de una cuenta, deberemos usar un tipo que sea de punto flotante, junto con la función AccountInfoDouble y una expresión en mayúsculas. Por lo tanto, deberemos obtener el valor correcto. Vamos a utilizar la función Comment para mostrar Text seguido del valor calculado. Clique en el botón "Compilar" o presione F7.

La compilación debería realizarse sin problemas. Presione F4 para regresar a MetaTrader. En el último vídeo, aprendimos a usar el simulador de estrategias, así que clicamos en "Ver" > "Simulador de estrategias", seleccionamos el archivo SimpleDataTypes que aparecerá y comenzamos una nueva prueba. En la esquina superior izquierda, veremos el valor 100000.0.

Vamos a cambiar el valor del depósito añadiendo números después del punto. Esta es la razón por la que utilizamos el tipo double al tratar con valores de punto flotante. Desde el último vídeo, ya conocemos la función TimeLocal. Esta retorna una variable de tipo datetime.

Para generarla, recompilaremos el código, detendremos la prueba anterior y comenzaremos una nueva. Los datos se mostrarán en un formato especial. Por consiguiente, si estamos tratando con fechas y horas, deberemos usar el tipo datetime. Para números enteros, podemos usar el tipo integer.

En este caso, obtendremos el número de la cuenta usando AccountInfoInteger. Usaremos esta constante para iniciar sesión en la cuenta (ACCOUNT LOGIN). Veamos qué apariencia tiene.

Si la declaración solo puede ser verdadera o falsa (true/false), deberemos usar un tipo booleano (bool). Veamos cómo se ve la muestra de dicho valor: "El valor es: true" (el valor es verdadero). Estos son solo algunos de los tipos de datos comunes. Podrá obtener más información sobre los tipos de datos en la Guía de Ayuda (F1). Hay varios tipos más disponibles para su uso. También podrá utilizar tipos de datos complejos.

Le sugiero escribir pequeños programas de prueba como este. En este breve vídeo, vimos cómo colocar varios tipos de datos directamente en el gráfico con unas pocas líneas de código.


Parte 5. Cálculos


En este vídeo, trabajaremos con algunas matemáticas simples. Al desarrollar un asesor experto para el comercio automático, no podemos evitar los cálculos.

Por ejemplo, he calculado el número máximo de posiciones permitidas. Como puede ver, también se calcula el beneficio de la pareja de divisas. Vamos a aprender cómo hacer algunos cálculos básicos. Clicamos en el icono "Editor MetaQuotes Language" o presionamos F4 en MetaTrader para abrir el MetaEditor.

Clicamos en "Archivo" > "Nuevo archivo" > "Asesor (plantilla)" > "Siguiente". Llamaremos al archivo del asesor experto SimpleExpertAdvisor. Luego clicamos en "Siguiente" > "Siguiente" > "Finalizar". Cualquier cosa que se encuentre por encima de la función OnTick se puede eliminar. También eliminaremos dos líneas con comentarios. Primero, necesitaremos dos variables int. "a" será 5 y "b" será 3.

Usaremos Comment para mostrar lo que nos dará la operación "a" más "b". Clique en el botón "Compilar". No hay errores. Presione F4 para regresar a MetaTrader.

A continuación, abrimos el simulador de estrategias, seleccionamos el nuevo archivo SimpleCalculations.ex5, activamos la visualización y comenzamos la prueba. El resultado es 8, porque 5+3=8. Probemos "a" - "b", recompilamos e iniciamos una nueva prueba. Esta vez el resultado es 2, porque 5-3=2.

Multiplicamos los dos números: 5 x 3 = 15. Recompilamos. Intentamos dividir "a" entre "b". ¡Obtenemos 1! Usamos variables enteras, así que 5/3 = 1.

Aquí no tenemos valores de punto flotante. Usamos double como tipo de datos y obtenemos 1.6666666667. Ya está mejor.

¿Qué sucede si sumamos "a" y "a", y luego lo multiplicamos por "b"? Tendremos que "a" es igual a 5, entonces "a" más "a" será igual a 10, y "b" será igual a 3. Así que 10 por 3 debería ser igual a 30.

Y, sin embargo, después de todas estas operaciones, ¡obtenemos 20! Esto se debe a que la multiplicación o la división siempre se hacen en primer lugar. Si desea cambiar esto, use paréntesis para ello. Lo que está dentro de los corchetes se calcula antes de la multiplicación o división. En esta ocasión, obtenemos 30.

Encontrará muchas otras funciones matemáticas en la Guía de Ayuda de MQL5. Le sugiero escribir pequeños programas como este para averiguar cómo funcionan. En el futuro, tendrá que realizar cálculos más complejos.

En este breve vídeo, aprendimos cómo realizar los cálculos matemáticos más simples con solo unas pocas líneas de código MQL5.

 

Parte 6. Comprobando las condiciones con if


En este vídeo, descubriremos si se cumple una determinada condición. Al utilizar un programa automatizado como este asesor, deberá comprobar si algo es correcto o no, por ejemplo, si el estocástico se encuentra por encima o por debajo de las líneas punteadas, o si el precio está por encima o por debajo de la media móvil.

Ahora vamos a aprender cómo hacerlo. Clicamos en el icono "Editor MetaQuotes Language" o presionamos F4 en MetaTrader para abrir el MetaEditor. Clicamos en "Archivo" > "Nuevo archivo" > "Asesor (plantilla)" > "Siguiente". Llamaremos a nuestro asesor experto SimpleIfCondition. Luego clicamos en "Siguiente" > "Siguiente" > "Finalizar".

Cualquier cosa que se encuentre por encima de la función OnTick se puede eliminar. También eliminaremos dos líneas con comentarios. Comenzaremos usando dos variables enteras: "a" será igual a 5, y "b" deberá ser igual a 3. Si "a" es mayor que 5, querremos ver el texto "a>5". Si no es así, podremos usar una declaración else, de modo que cuando no se cumpla ninguna de las condiciones, querremos ver el texto "Conditions not true" (las condiciones no son verdaderas). Clique en "Compilar" o F7. No hay errores...

Sin embargo, he recibido una advertencia porque me he olvidado de la instrucción Comment, pero todo está bien ahora. Presione F4 para regresar a MetaTrader. Abrimos el simulador de estrategias y seleccionamos el archivo SimpleIfCondition.ex5.

Activamos el modo de visualización y comenzamos la prueba. Recibimos el mensaje "Conditions not true" porque "a" no es mayor que 5, así que añadimos otra declaración if para verificar si "a" es igual a cinco. Recompilamos el código, detenemos la prueba y comenzamos una nueva.

Esta vez obtenemos "a==5" como resultado. ¿Qué sucede si añadimos otra declaración if aquí para verificar si "b" es igual a tres? Recompilamos el código y ejecutamos otra prueba.

Ahora solo vemos el mensaje "b es igual a 3" en la pantalla. En este caso, el operador se ignora, por lo que podríamos usar dos declaraciones if en su lugar. En la primera, comprobaremos si "a" es igual a cinco, y en la segunda, si "b" es igual a tres.

El resultado será "a==5 y b==3". Recompilamos el código, y la próxima vez que lo probemos, veremos "a = 5 y b = 3" en la pantalla.

Hasta aquí, todo va bien, pero si añadimos algo como "c = a + b" aquí y presionamos "Compilar", obtendremos dos errores. Esto se debe a que cada vez que tenemos más de una línea después de una declaración if, necesitamos usar dos paréntesis. Vamos a recompilar el código. En la próxima prueba, veremos el mensaje "c = 8".

Este ha sido un ejemplo muy simple. Existen muchas otras formas de comprobar si una condición es verdadera. En este breve vídeo, hemos aprendido a usar la declaración if y algunas líneas de código MQL5 para verificar si una condición es verdadera.


Parte 7. Operadores switch y case


En este vídeo, aprenderemos cómo cambiar la forma en que funciona el asesor usando los operadores switch y case. Por el momento, nuestro asesor solo puede mostrar el mensaje "customer wants RSI" (el cliente quiere RSI).

Necesitamos descubrir cómo cambiar este valor con los comandos switch y case. Para ello, abrimos el MetaEditor.

Clicamos en "Archivo" > "Nuevo archivo" > "Asesor (plantilla)" > "Siguiente". Llamaremos a este archivo SimpleSwitchCase. Luego clicamos en "Siguiente" > "Siguiente" > "Finalizar". Cualquier cosa que se encuentre por encima de la función OnTick se puede eliminar. También eliminaremos dos líneas con comentarios. Comenzaremos usando una variable entera choice igual a 5.

También usaremos la variable de cadena entry dentro de la función OnTick. No le estamos asignando ningún valor, ya que queremos calcular esta variable en función de lo que elijamos aquí. Esto se consigue usando el operador switch.

Queremos iterar sobre los distintos valores posibles de una variable. Entonces, si el cliente elige 5, mostraremos "the customer wants RSI". Aquí usaremos el signo más y el signo igual. Más tarde veremos por qué. Por ahora, interrumpiremos la iteración actual.

Una vez se haya ejecutado el código, el "ciclo switch-casa" finalizará gracias al operador break. Vamos a añadir una opción más. Introduciendo 4, mostraremos "the customer wants Bollinger Bands" (el cliente quiere las Bandas de Bollinger).

Usaremos la instrucción break nuevamente para dejar la construcción switch/case. Después, añadiremos una opción más posible. Si nuestra variable es 3, la declaración de entrada deberá generar "customer wants MACD" (el cliente quiere MACD).

También podemos usar una expresión como 1+1 aquí en lugar de un número, pero el operador case no funcionará con variables, por lo que obtendremos un error. Añadiremos también la opción "default" (por defecto). El valor predeterminado se utiliza si ninguna de las otras opciones disponibles está activada. En este caso, el operador entry generará "the customer doesn't know" (el cliente no sabe).

Vamos a añadir dos paréntesis aquí. Luego usaremos la función Comment para imprimir entry. Cuando hayamos terminado, clicaremos en "Compilar".

No deberá haber errores ni advertencias. Volvamos a MetaTrader. Ahora, abriremos el simulador de estrategias y seleccionaremos el archivo SimpleSwitchCase.ex5.

Activamos el modo de visualización y comenzamos la prueba. Veremos la inscripción "The customer wants RSI". Establecemos choice en 3, recompilamos el código y ejecutemos otra prueba. En esta ocasión, obtendremos "The customer wants MACD". Como el valor choice es igual a 3, coincidirá con MACD. Establecemos el valor en 11, recompilamos el código y vemos qué ocurre.

En esta ocasión, veremos el mensaje "the customer doesn't know", porque el valor 11 no se encuentra en la lista de opciones disponibles. En consecuencia, se activará el valor por defecto. A continuación, comentamos el operador break para los dos primeros operadores case. Establecemos nuevamente la elección en 5, recompilamos el código y realizamos otra prueba.

Esta vez obtendremos los mensajes "the customer wants RSI", "the customer wants Bollinger Bands" y "the customer wants MACD". Esto se debe a que se han procesado las tres primeras partes de nuestra construcción switch-case. Recuerde que si omite el operador break aquí, nuestro asesor experto no saldrá del ciclo, sino que continuará verificando la siguiente condición.

En este vídeo, hemos aprendido a usar los operadores switch y case con unas pocas líneas de código MQL5.

 

Parte 8. El ciclo while


En este vídeo, aprenderemos a usar la instrucción while al esperar un evento. Hemos esperado hasta que el contador de retraso llegue a 500.000, ahora vamos a ver cómo usar el ciclo while en MQL5.

Para ello, abrimos el MetaEditor. Clicamos en "Archivo" > "Nuevo archivo" > "Asesor (plantilla)" > "Siguiente". Luego llamamos al archivo del asesor experto SimpleWhileLoop. Luego clicamos en "Siguiente" > "Siguiente" > "Finalizar". Cualquier cosa que se encuentre por encima de la función OnTick se puede eliminar. También eliminaremos dos líneas con comentarios. Comenzaremos creando un contador de retraso (DelayCounter).

Usaremos una variable entera porque solo necesitamos números enteros. Vamos a asignarle un valor de 1, incrementando este en la función OnTick. Digamos que nuestro valor mínimo es de 500.000, y solo queremos hacer algo si el contador de retraso está por encima de ese valor.

Ahora podemos usar la declaración while dentro de la función OnTick para verificar si el contador de retraso está por debajo del valor mínimo. Si es así, tendremos que hacer dos cosas. Primero, deberemos imprimir el texto "DelayCounter:" seguido del valor calculado del contador de retraso actual.

Luego, deberemos incrementar el contador de retraso en 1, indicando DelayCounter para que sea DelayCounter más 1. A continuación, abrimos el simulador de estrategias. Seleccionamos el archivo SimpleWhileLoop.ex5 recién creado.

Activamos el modo de visualización y comenzamos la prueba. Tan pronto como el contador llegue a 500.000, el gráfico comenzará a moverse. Todo funciona como es debido. Sin embargo, hay un problema: si queremos incrementar el contador de retraso fuera del ciclo while, aún podemos compilar el código sin errores, pero no pasará nada cuando ejecutemos la siguiente prueba.

¿Por qué el simulador deja de funcionar? Si elegimos el operador while y presionamos F1, se abrirá la sección correspondiente de la Guía de Ayuda, pero el simulador de estrategias permanecerá inmóvil. Esto ha sucedido porque hemos creado un ciclo infinito.

Cuando llega el primer tick y esta expresión es verdadera, el operador while inicia un ciclo infinito. Queríamos incrementar el contador de retraso, pero como lo hemos hecho fuera del ciclo while, esto nunca sucede. La expresión siempre será verdadera. Esta es una de las razones por las que evito usar demasiado el ciclo while. La mayoría de las condiciones se pueden probar con if.

Recompilamos el código y reiniciamos la prueba. Ahora podemos ver que el contador de retraso funciona porque el operador if solo se ejecutará una vez cada vez que llegue un tick. Si desea usar el operador while, asegúrese de que el ciclo se detenga. Vamos a realizar otra prueba. Ahora los cálculos son correctos.

En este breve vídeo, hemos aprendido cómo usar el operador while, y también a evitar ciclos infinitos con unas pocas líneas de código MQL5.


Parte 9. El ciclo for


En este vídeo, aprenderemos cómo usar un ciclo for para cambiar el valor del contador. La cuenta llega hasta 10.000.

Para ello, abrimos el MetaEditor. Clicamos en "Archivo" > "Nuevo archivo" > "Asesor (plantilla)" > "Siguiente". Llamamos al archivo SimpleForLoop. Luego clicamos en "Siguiente" > "Siguiente" > "Finalizar".

Cualquier cosa que se encuentre por encima de la función OnTick se puede eliminar. También eliminaremos dos líneas con comentarios. Comenzaremos por crear una variable de contador.

Esta es una variable entera (int) con un valor inicial igual a 1. También estableceremos endvalue (valor final). En nuestro caso, sería 10 000. El ciclo for se usará dentro de la función OnTick.

Si nunca antes ha tratado con un ciclo for, esto podría parecerle extraño. La primera expresión es el valor inicial. En nuestro caso, será: La segunda expresión pone a prueba la condición.

En nuestro caso, queremos comprobar si el valor del contador es inferior al valor endvalue. En la tercera expresión, hacemos algo con counter. En nuestro caso, le añadiremos 1 (counter++).

Podemos decir que counter es igual a counter más 1. Cualquier cosa dentro de los paréntesis se ejecutará siempre que se cumpla esta condición. En nuestro caso, simplemente imprimiremos el texto "the counter so far, so good" ("con el contador, hasta ahora, todo bien").

Clicamos en el botón "Compilar". Si no hay errores, regresaremos a MetaTrader. Abrimos el simulador de estrategias, seleccionamos el archivo SimpleForLoop.ex5, habilitamos la visualización y comenzamos la prueba. El funcionamiento del contador se puede ver en la pestaña "Diario".

El valor aumenta hasta llegar a 9999. También puede hacer una cuenta regresiva. Vamos a cambiar los valores. El contador ahora debería comenzar en 10 000, con un valor final de 1.

Comenzaremos desde el valor del contador y contaremos hacia atrás, restando 1 hasta que el contador esté por encima del valor final. Ahora, vamos a ejecutar de nuevo la prueba. Termina con "Counter = 2", porque en la segunda expresión estábamos comprobando si el valor de counter era superior al valor de endvalue.

También podríamos indicar "mayor o igual que". Recompilamos el asesor. Esta vez, el último valor deberá ser igual a uno. Y así es. También podemos usar un ciclo for para hacer que contador aumente o disminuya en diferentes incrementos.

Digamos, por ejemplo, 10. Después de la siguiente compilación, veremos que la cuenta regresiva funciona con un incremento de 10.

En este breve vídeo, hemos aprendido cómo usar un bucle for para calcular y disminuir/incrementar un valor con unas pocas líneas de código MQL5.


Parte 10. Creando una función simple


En este vídeo, usaremos MQL5 para crear una función personalizada que duplicará el valor del contador cada vez que cambie el precio. Para ello, abrimos el MetaEditor. Clicamos en "Archivo" > "Nuevo archivo" > "Asesor (plantilla)" > "Siguiente". Llamaremos a este archivo SimpleFunction. Luego clicamos en "Siguiente" > "Siguiente" > "Finalizar".

Cualquier cosa que se encuentre por encima de la función OnTick se puede eliminar. También eliminaremos dos líneas con comentarios. Comenzaremos creando una variable estática para counter. En este caso, usamos la definición "estática" para crear una variable local que solo existirá en nuestra función.

Transmitimos la variable a otra función, que se llamará DoubleTheValue (doblar el valor), pero antes deberemos crearla. El valor actual de counter se transmitirá entre paréntesis. Para mostrar el valor de counter, utilizaremos la función Comment.

Como ya hemos mencionado, aún debemos crear la función DoubleTheValue. Para crear una función personalizada, comenzaremos definiendo lo que retornará. En nuestro caso, la función retornará un valor entero (int).

Este es el nombre de la función personalizada (DoubleTheValue), y lo que la función tomará como parámetro. Transmitimos counter, que es un número entero (int). Le he puesto el nombre CounterValue en la función personalizada, pero no es necesario que usemos el mismo nombre.

Nuestra función necesitará dos corchetes. Al compilar, obtendremos otro error porque nuestra función no retornará nada. Así que primero duplicaremos el valor transmitido, que llamaremos CounterValue. Para hacer esto, multiplicaremos CounterValue por 2.

El resultado se almacenará en una nueva variable DoubleValue y podremos usar el operador return para enviar el valor de vuelta al programa que ha realizado la llamada. Para hacer esto, introduzca "return DoubleValue;". Compilamos el código nuevamente para asegurarnos de que no haya errores.

Abrimos el simulador de estrategias, seleccionamos el archivo SimpleFunction.ex5, habilitamos la visualización y comenzamos la prueba. Ahora vemos que el valor del contador se duplica cada vez que llega un nuevo tick, por eso nuestra función personalizada es llamada cada vez que cambia el precio. El ejemplo es muy simple, ya que solo transmitimos un valor y realizamos una operación.

No obstante, podemos usar la misma lógica para realizar tareas más complejas. Por ejemplo, podemos revisar todas las posiciones abiertas, calcular el beneficio de una pareja de divisas y retornar el valor a la función principal usando el operador return.

En este breve vídeo, hemos aprendido cómo crear una función personalizada en MQL5 con unas pocas líneas de código.


Conclusión

MQL5 no tiene por qué ser complicado. Espero que este artículo le sirva de ayuda para comenzar, y que también le dé una buena idea de lo fácil que puede ser el comercio automatizado. Obviamente, más adelante necesitará añadir componentes más avanzados a su sistema, pero a estas alturas ya debería saber si la programación MQL5 es adecuada para usted...


Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/10954

Desarrollando un EA comercial desde cero (Parte 20): Un nuevo sistema de órdenes (III) Desarrollando un EA comercial desde cero (Parte 20): Un nuevo sistema de órdenes (III)
Continuemos con la implantación del nuevo sistema de órdenes. La creación de este sistema es algo que exige un buen dominio de MQL5, así como entender cómo funciona en realidad la plataforma MetaTrader 5 y qué recursos nos proporciona.
Redes neuronales: así de sencillo (Parte 14): Clusterización de datos Redes neuronales: así de sencillo (Parte 14): Clusterización de datos
Lo confieso: ha pasado más de un año desde que publiqué el último artículo. En tanto tiempo, me ha sido posible repensar mucho, desarrollar nuevos enfoques. Y en este nuevo artículo, me gustaría alejarme un poco del método anteriormente usado de aprendizaje supervisado, y sugerir una pequeña inmersión en los algoritmos de aprendizaje no supervisado. En particular, vamos a analizar uno de los algoritmos de clusterización, las k-medias.
Indicadores con control interactivo en el gráfico. Indicadores con control interactivo en el gráfico.
Una nueva mirada a la interfaz del indicador. Lo más importante es la comodidad. Tras probar docenas de estrategias comerciales diferentes a lo largo de los años, además de probar cientos de indicadores diferentes, he llegado a algunas conclusiones propias que quiero compartir con ustedes en este artículo.
Desarrollando un EA comercial desde cero (Parte 19): Un nuevo sistema de órdenes (II) Desarrollando un EA comercial desde cero (Parte 19): Un nuevo sistema de órdenes (II)
Aquí vamos a desarrollar un sistema gráfico de órdenes, del tipo «vea lo que está pasando». Cabe decir que no partiremos de cero, sino que modificaremos el sistema existente añadiendo aún más objetos y eventos al gráfico del activo que estamos negociando.