Programación en MQL5 (III)

Trading Meetings  » Tutoriales »  Programación en MQL5 (III)
Programación en MQL5 - 3. Construcción de Estrategias Automatizadas
0 Comments 20:49

 
 

En este capítulo, exploraremos cómo optimizar el código en MQL5 para mejorar su eficiencia, legibilidad y mantenimiento. Aprenderemos a usar funciones reutilizables, modularizar el código y evitar errores comunes que pueden afectar el rendimiento del programa.


El uso de funciones y procedimientos reutilizables es una práctica fundamental para escribir código limpio y eficiente. Las funciones permiten encapsular bloques de código que realizan tareas específicas, lo que facilita la reutilización y reduce la duplicación de código.

Ejemplo Práctico: Creación de Funciones Reutilizables

Supongamos que queremos calcular el tamaño de lote y verificar si el spread está dentro de un rango aceptable. Podemos encapsular estas tareas en funciones separadas:

Explicación del código:

  • Hemos creado dos funciones:
    • CalculateLotSize: Calcula el tamaño de lote basado en el riesgo.
    • IsSpreadAcceptable: Verifica si el spread está dentro del rango permitido.
  • Estas funciones son reutilizables y pueden ser llamadas desde cualquier parte del código sin necesidad de duplicar lógica.

La modularización consiste en dividir el código en módulos o archivos independientes que realicen tareas específicas. Esto mejora la organización y facilita el mantenimiento.

Ejemplo Práctico: Modularización con Archivos Incluidos

Podemos crear un archivo separado para las funciones relacionadas con la gestión de riesgos y otro para la lógica de trading. Luego, incluimos estos archivos en el script principal.

Archivo RiskManagement.mqh:

Archivo TradingLogic.mqh:

Script Principal:

Explicación del código:

  • Los archivos .mqh contienen funciones específicas que pueden ser reutilizados en otros proyectos.
  • El script principal incluye estos archivos usando #include, lo que mejora la organización y claridad del código.

Al desarrollar scripts o Expert Advisors, es importante evitar errores comunes que pueden causar problemas graves, como bucles infinitos o cálculos incorrectos.

Errores Comunes y Soluciones

  1. Bucles Infinitos:
    • Un bucle infinito ocurre cuando una condición nunca se cumple. Para evitarlo, asegúrate de que las condiciones de salida estén bien definidas.
    Ejemplo Incorrecto:

Solución:

  1. Cálculos Incorrectos:
    • Asegúrate de normalizar precios y volúmenes según las especificaciones del símbolo.

Ejemplo Correcto:

  1. Comentarios para Facilitar la Comprensión:
    • Usa comentarios para explicar qué hace cada bloque de código. Esto es especialmente útil para futuros ajustes o colaboraciones.

Ejemplo de Comentarios:


Interactividad: Ejercicios Prácticos

Ver solución:

Explicación del Código

  1. Parámetros de Entrada:
    • StopLossPips: Define la distancia del stop loss en pips.
    • TakeProfitMultiplier: Es el múltiplo que se utilizará para calcular el take profit. Por ejemplo, si el stop loss es de 50 pips y el múltiplo es 2.0, el take profit será de 100 pips.
  2. Función CalculateTakeProfit:
    • Esta función toma como entrada el precio de entrada (entryPrice) y la dirección de la posición (OP_BUY o OP_SELL).
    • Calcula la distancia del take profit multiplicando el stop loss (StopLossPips) por el factor (TakeProfitMultiplier).
    • Ajusta el precio del take profit según la dirección de la posición:
      • Para posiciones largas (OP_BUY), suma la distancia al precio de entrada.
      • Para posiciones cortas (OP_SELL), resta la distancia al precio de entrada.
    • Usa NormalizeDouble para ajustar el precio a la precisión del símbolo.
  3. Prueba de la Función:
    • En la función OnStart, se simula una posición de compra (OP_BUY) con el precio actual de compra (SYMBOL_ASK).
    • Se llama a la función CalculateTakeProfit para calcular el take profit y se muestra el resultado en la ventana de resultados.

Resultado Esperado

Cuando ejecutes este script, verás mensajes similares a los siguientes en la ventana de resultados:

En este ejemplo:

  • El precio de entrada es 1.23456.
  • El stop loss está configurado en 50 pips.
  • El múltiplo del take profit es 2.0, lo que significa que el take profit estará a 100 pips del precio de entrada.

Caso Práctico

Esta función es útil para traders que desean implementar una relación de riesgo/recompensa específica en sus estrategias. Por ejemplo:

  • Si deseas una relación de 1:2 (riesgo/recompensa), configura el TakeProfitMultiplier en 2.0.
  • Si deseas una relación de 1:3, configura el TakeProfitMultiplier en 3.0.

Al encapsular esta lógica en una función reutilizable, puedes aplicarla fácilmente en diferentes partes de tu código sin duplicar la lógica de cálculo.

¡Espero que este ejemplo te ayude a entender cómo crear funciones reutilizables en MQL5!

Ver solución:

A continuación, modularizamos un script existente dividiéndolo en al menos dos archivos .mqh. Esto mejora la organización del código y facilita su reutilización y mantenimiento. El ejemplo se basa en un script que calcula el tamaño de lote y verifica si el spread está dentro de un rango aceptable.


Estructura del Proyecto

  1. Archivo Principal (MainScript.mq5): Contiene la lógica principal del script.
  2. Archivo RiskManagement.mqh: Encapsula funciones relacionadas con la gestión de riesgos (por ejemplo, cálculo del tamaño de lote).
  3. Archivo TradingLogic.mqh: Encapsula funciones relacionadas con la lógica de trading (por ejemplo, verificación del spread).

Código del Archivo RiskManagement.mqh

Este archivo contiene funciones relacionadas con la gestión de riesgos.


Código del Archivo TradingLogic.mqh

Este archivo contiene funciones relacionadas con la lógica de trading.


Código del Archivo Principal (MainScript.mq5)

Este archivo incluye los módulos anteriores y contiene la lógica principal del script.


Explicación del Código

  1. Modularización:
    • Hemos dividido el código en tres archivos:
      • RiskManagement.mqh: Contiene funciones relacionadas con la gestión de riesgos, como el cálculo del tamaño de lote.
      • TradingLogic.mqh: Contiene funciones relacionadas con la lógica de trading, como la verificación del spread.
      • MainScript.mq5: Es el archivo principal que incluye los módulos anteriores y coordina la ejecución del script.
  2. Inclusión de Archivos:
    • Usamos la directiva #include para incluir los archivos .mqh en el script principal. Esto permite reutilizar las funciones definidas en esos archivos sin duplicar código.
  3. Reutilización:
    • Las funciones en RiskManagement.mqh y TradingLogic.mqh pueden ser reutilizadas en otros proyectos simplemente incluyendo los archivos correspondientes.
  4. Ventajas de la Modularización:
    • Mejora la legibilidad del código al separar las responsabilidades en diferentes archivos.
    • Facilita el mantenimiento, ya que cada archivo tiene un propósito específico.
    • Permite reutilizar funciones en otros proyectos sin necesidad de copiar y pegar código.

Resultado Esperado

Cuando ejecutes este script, verás mensajes similares a los siguientes en la ventana de resultados:

  • Si el spread está dentro del rango permitido:
  • Si el spread es demasiado alto:

Caso Práctico

La modularización es especialmente útil cuando trabajas en proyectos grandes o colaborativos. Al dividir el código en módulos independientes, puedes:

  • Reutilizar funciones en diferentes partes del proyecto.
  • Facilitar la colaboración con otros desarrolladores, ya que cada archivo tiene una responsabilidad clara.
  • Reducir errores al mantener el código organizado y bien estructurado.

¡Espero que este ejemplo te ayude a entender cómo modularizar tu código en MQL5!

Ver solución:

Explicación del Código

  1. Identificación del Error:
    • El error original estaba en la condición del bucle for: i <= PositionsTotal().
    • PositionsTotal() devuelve el número total de posiciones abiertas, pero los índices de las posiciones comienzan desde 0 hasta PositionsTotal() - 1.
    • Al usar i <= PositionsTotal(), el bucle intenta acceder a una posición inexistente (PositionsTotal()), lo que puede causar errores o comportamientos inesperados.
  2. Corrección del Bucle:
    • Cambiamos la condición del bucle a i < totalPositions, asegurando que solo se itere sobre los índices válidos de las posiciones abiertas.
  3. Validación del Ticket:
    • Añadimos una verificación para asegurarnos de que el ticket obtenido sea válido (ticket > 0).
    • Si el ticket no es válido, mostramos un mensaje de error junto con el código de error correspondiente usando GetLastError().
  4. Mejoras Adicionales:
    • Guardamos el resultado de PositionsTotal() en una variable (totalPositions) para evitar llamar repetidamente a la función dentro del bucle.
    • Mostramos mensajes claros en la ventana de resultados para facilitar la depuración.

Resultado Esperado

Cuando ejecutes este script corregido, verás mensajes similares a los siguientes en la ventana de resultados:

  • Si hay posiciones abiertas:
  • Si no hay posiciones abiertas:
  • Si ocurre un error al obtener el ticket:

Caso Práctico

Este tipo de error es común cuando se trabaja con arrays o colecciones indexadas en MQL5. Es importante recordar que los índices siempre comienzan desde 0 y terminan en n-1, donde n es el tamaño total de la colección. Al corregir este error, evitamos problemas como:

  • Acceso a memoria no asignada.
  • Errores de ejecución que pueden interrumpir el funcionamiento del EA o script.
  • Resultados incorrectos debido a datos inválidos.

¡Espero que este ejemplo te ayude a identificar y corregir errores similares en tus proyectos futuros!


En el próximo capítulo, exploraremos técnicas avanzadas de depuración y pruebas para garantizar que tu código funcione correctamente en diferentes escenarios.

¡Sigue practicando y perfeccionando tus habilidades en MQL5!

 
 


Deja una respuesta