Saltar al contenido

Crea un asesor experto en MQL5 desde cero, parte 2: compila y realiza un backtest sin hacer clic

Compila un EA con metaeditor64.exe y ejecuta el Probador de Estrategias desde un archivo INI: una ejecución de diez segundos en lugar de diez minutos de configuración manual, con los problemas que encontramos.

Admin
Crea un asesor experto en MQL5 desde cero, parte 2: compila y realiza un backtest sin hacer clic · 15 de agosto de 2026

En la primera parte, vimos la estructura de un EA y cómo calcular el tamaño de la posición a partir de la distancia al stop loss. Ahora abordamos algo que rara vez se trata en las guías en ruso: probar ideas sin abrir MetaEditor ni el Probador de Estrategias con el ratón.

La diferencia es considerable. El ciclo manual —abrir el editor, pulsar F7, cambiar al terminal, abrir el probador, configurar el símbolo, el marco temporal, las fechas y los parámetros de entrada, hacer clic en Iniciar, esperar y revisar el informe— lleva unos diez minutos y requiere tu atención. La misma ejecución desde la línea de comandos tarda unos diez segundos y no necesita intervención. Así pudimos probar más de cien configuraciones del EA en una tarde; nadie haría tantas pruebas manualmente.

Compila desde la línea de comandos

El compilador es metaeditor64.exe, situado en la carpeta del terminal. Puede compilar un archivo sin abrir su interfaz:

"C:\Program Files\XM Global MT5\metaeditor64.exe" /compile:"...\MQL5\Experts\MyEA.mq5" /log:"%TEMP%\compile.log"

Conviene saber tres cosas desde el principio.

El archivo fuente debe estar dentro de la carpeta de datos del terminal. No en la carpeta de tu proyecto, sino en MQL5\Experts, dentro del directorio que el terminal utiliza para sus datos. De lo contrario, el compilador no encontrará los archivos de cabecera estándar e indicará «Trade.mqh no encontrado», aunque el archivo esté ahí. Nos ocurrió a nosotros. Coloca el código fuente en la carpeta de datos —como hacemos nosotros, copiándolo antes de cada compilación— o añade la opción /portable si el terminal se ejecuta en modo portátil.

El registro utiliza UTF-16. Si lo lees con la codificación predeterminada, obtendrás un montón de caracteres nulos. En PowerShell, especifica la codificación de forma explícita:

$result = Get-Content $log -Encoding Unicode | Select-String 'Result' | Select-Object -Last 1
if ($result -notmatch '0 errors') { throw "Build failed: $result" }

El código de salida no siempre es útil. Es más fiable analizar la línea Result: 0 errors, 0 warnings del registro, como en el ejemplo anterior, y detener la ejecución si falla la compilación. De lo contrario, el probador ejecutará el archivo .ex5 anterior, ya desactualizado, y pasarás medio día intentando explicar un resultado producido por un código que ya has cambiado.

Ejecuta el probador con una configuración INI

El terminal admite la opción /config:path.ini. Si la configuración contiene una sección [Tester], se inicia directamente en modo de prueba. Esta es una configuración mínima que funciona:

[Tester]
Expert=TradeaproRangeBreakout
Symbol=GOLD#
Period=M15
Model=1
Optimization=0
FromDate=2025.01.01
ToDate=2025.12.31
Deposit=10000
Currency=USD
Leverage=1:100
Report=C:\Temp\report
ReplaceReport=1
ShutdownTerminal=1
Visual=0

Los ajustes fundamentales están en los dos últimos pares de líneas. Visual=0 desactiva la visualización y ShutdownTerminal=1 cierra el terminal cuando termina la ejecución. Sin este último, tu script esperará indefinidamente y no sabrás si la prueba ha terminado. Model=1 utiliza precios de apertura; para una estrategia que actúa sobre velas cerradas, esto es suficiente y varias veces más rápido que «Cada tick».

Nota editorial: El ejemplo original conserva Model=1, pero MetaTrader 5 lo define como «OHLC de 1 minuto»; «Solo precios de apertura» utiliza Model=2. Por tanto, la descripción anterior de la fuente no coincide con su configuración. Consulta la referencia oficial de configuración de MetaTrader 5.

Los parámetros de entrada del EA van en una sección independiente, con los mismos nombres que las variables input del código:

[TesterInputs]
RewardRatio=3.0
BreakevenAtR=1.5
MinRangePct=0.15

Guarda el archivo en UTF-16 (-Encoding Unicode en PowerShell). Con UTF-8, el terminal ignora la configuración sin avisar y abre su ventana habitual. No aparece ningún error; no ocurre nada.

Dónde obtener los resultados

La mayor sorpresa al ejecutar sin una ventana visible es que el informe HTML —el motivo por el que has preparado todo esto— a menudo ni siquiera se crea. No puedes depender de él.

Un método que funciona es calcular las métricas dentro del propio EA e imprimirlas en OnDeinit, que se llama al final de la ejecución:

void OnDeinit(const int reason)
{
   double balance  = AccountInfoDouble(ACCOUNT_BALANCE);
   double winrate  = trades > 0 ? 100.0 * wins / trades : 0;
   double pf       = grossLoss > 0 ? grossProfit / grossLoss : 0;

   PrintFormat("[RESULT] balance=%.2f trades=%d winrate=%.1f PF=%.2f maxDD=%.1f",
               balance, trades, winrate, pf, maxDrawdownPct);
}

La salida se guarda en el registro del agente de pruebas:

%APPDATA%\MetaQuotes\Tester\<ID>\Agent-127.0.0.1-3000\logs\<date>.log

Tu script puede extraer el resultado de ahí con una sola línea. También resulta útil imprimir los motivos por los que se omiten entradas —[SKIP] spread, [SKIP] range, [SKIP] lot— y agruparlos:

$skips = $txt | Select-String '\[SKIP\] (\w+)' -AllMatches |
  ForEach-Object { $_.Matches[0].Groups[1].Value } | Group-Object | Sort-Object Count -Desc

Esto fue lo que nos sacó del apuro cuando la primera versión del EA no realizó ninguna operación en cuatro años. El informe estaba vacío, pero el registro mostraba que el filtro de rango había rechazado todos y cada uno de los días. Sin esa salida, encontrar la causa habría sido cuestión de conjeturas.

Problemas que encontramos

El terminal se cerró a los cuatro segundos sin hacer nada. Estaba instalando una actualización. El primer inicio después de una actualización es algo que simplemente tienes que gestionar de forma manual.

Una prueba de tres meses tardó nueve minutos en lugar de diez segundos. El terminal tenía iniciada la sesión en una cuenta cuyo acceso había caducado y se quedaba esperando a que el servidor sincronizara el historial. Para hacer pruebas necesitas un terminal con una cuenta activa. Cualquier cuenta demo sirve; no cambia los datos históricos.

Sobre los brókeres: prueba una estrategia con al menos dos. Los spreads, la precisión de las cotizaciones e incluso los nombres de los instrumentos varían. Un bróker llama al oro GOLD#, otro lo llama XAUUSD, y nuestro EA obtuvo un factor de beneficio de 1.41 con la segunda fuente de cotizaciones, frente a 1.33 con la primera. Realizamos pruebas en XM y las contrastamos en RoboForex; abrir una cuenta demo lleva un par de minutos y el historial de cotizaciones está disponible de inmediato.

No edites terminal.ini ni las plantillas del terminal a mano. Nosotros «ordenamos» la configuración y borramos los campos de inicio de sesión; el terminal dejó de iniciarse por completo. Todo lo que necesita el probador se puede proporcionar en un archivo INI independiente mediante /config. No hace falta modificar la configuración del terminal.

Una ejecución, un terminal. Cierra el proceso anterior antes de empezar (Stop-Process -Name terminal64), o el nuevo inicio podría cargar la configuración de otra ejecución. Para realizar pruebas en paralelo, instala varias copias del terminal con carpetas de datos independientes. Cada copia utiliza alrededor de un gigabyte de memoria, por lo que un portátil de trabajo con cuatro gigabytes no podrá gestionar más de dos ejecuciones simultáneas.

Una vez que hayas encontrado una configuración y puesto el EA a funcionar en una cuenta, tu equipo de pruebas dejará de ser adecuado: el terminal tiene que funcionar a todas horas, independientemente de que cierres la tapa del portátil. Mantenemos nuestros terminales de trading en un VPS cerca del servidor del bróker. Una latencia de milisegundos de un solo dígito marca una diferencia apreciable en una estrategia de ruptura, porque la entrada se produce justo cuando el precio supera el límite del rango.

Qué te aporta

El script completo —compilación, configuración, inicio y análisis del registro— cabe en unas cien líneas de PowerShell y se ejecuta así:

.\run-test.ps1 -Symbol GOLD# -From 2025.01.01 -To 2025.12.31 -Inputs @{ RewardRatio = 3; BreakevenAtR = 1.5 }

Intégralo en un bucle que recorra los parámetros y obtendrás una tabla en lugar de una opinión sobre la estrategia. Probamos nuestro EA con una rejilla de parámetros para 2022–2024 y después comprobamos la mejor configuración en 2025–2026, un periodo que no se había utilizado para la selección: un factor de beneficio de 1.33, un drawdown de 3.9% y 145 operaciones en el periodo de validación.

Lo más valioso de esa tabla no es el máximo, sino lo que lo rodea. Si las combinaciones de parámetros cercanas producen resultados similares, tienes una meseta y probablemente el ajuste refleje una característica del mercado. Si un único pico queda aislado entre combinaciones vecinas con pérdidas, se trata de un sobreajuste y poco de ese resultado se mantendrá en una cuenta real. No puedes ver esa diferencia mediante ensayo y error manual, simplemente porque nadie hará cien ejecuciones a mano.

El EA utilizado para estas pruebas está en el catálogo con su código fuente, y sus operaciones en nuestra cuenta demo pueden verse en el seguimiento en vivo.

La tercera parte tratará sobre cómo distinguir una estrategia viable de una sobreajustada: pruebas forward, división de los datos y por qué un backtest atractivo, por sí solo, significa muy poco.

Los enlaces al bróker y al VPS de este artículo son enlaces de afiliación: si te registras a través de ellos, recibimos una comisión y tú obtienes las mismas condiciones que con un enlace directo. Solo mencionamos servicios que utilizamos nosotros mismos.

Comparte este artículo:

Comentarios (0)

Los comentarios y las reseñas se muestran en su idioma original.

Inicia sesión para comentar

Todavía no hay comentarios

¡Sé la primera persona en comentar!

Más guías y pruebas de EA

Reseñas de EA, resultados en demo y notas de MQL5.

Todos los artículos del blog