Capítulo 10: Pruebas y Backtesting
En este capítulo, aprenderemos cómo configurar y ejecutar pruebas de backtesting en MQL5, interpretar los resultados clave como rendimiento, drawdown y ratio Sharpe, y optimizar los parámetros de un Expert Advisor (EA) mediante pruebas automatizadas. Estas habilidades son esenciales para evaluar la efectividad de una estrategia antes de operar en tiempo real.
10.1. Configuración del Entorno de Backtesting
El Strategy Tester de MetaTrader 5 es una herramienta poderosa que permite simular estrategias en datos históricos. Aquí te mostramos cómo configurarlo correctamente:
Pasos para Configurar el Backtesting
- Abrir el Strategy Tester:
- En MetaTrader 5, haz clic en
View > Strategy Testero presionaCtrl + R. - Asegúrate de que el EA que deseas probar esté adjunto al gráfico.
- En MetaTrader 5, haz clic en
- Seleccionar el Símbolo y el Período:
- En el panel izquierdo del Strategy Tester, selecciona el símbolo (por ejemplo,
EURUSD) y la temporalidad (por ejemplo,H1).
- En el panel izquierdo del Strategy Tester, selecciona el símbolo (por ejemplo,
- Configurar el Modelo de Ejecución:
- Elige el modelo de ejecución:
- Every tick : Simula cada tick histórico. Es el más preciso pero consume más recursos.
- 1 minute OHLC : Usa los precios de apertura, máximo, mínimo y cierre por minuto. Es más rápido pero menos preciso.
- Recomendación: Usa
Every tickpara resultados más confiables.
- Elige el modelo de ejecución:
- Definir el Intervalo de Datos:
- Selecciona el rango de fechas para el backtesting. Por ejemplo, desde
2020.01.01hasta2023.01.01.
- Selecciona el rango de fechas para el backtesting. Por ejemplo, desde
- Configurar el Modo de Prueba:
- Elige entre:
- Backtesting : Simula la estrategia en datos históricos.
- Optimización : Ajusta automáticamente los parámetros para encontrar los valores óptimos.
- Elige entre:
- Iniciar el Backtesting:
- Haz clic en
Startpara comenzar la simulación.
- Haz clic en
Ejemplo Práctico: Configuración del Backtesting
Supongamos que queremos probar un EA basado en medias móviles en el símbolo EURUSD con datos históricos desde 2020.01.01 hasta 2023.01.01. Configuramos el Strategy Tester como sigue:
- Símbolo:
EURUSD - Período:
H1 - Modelo de Ejecución:
Every tick - Intervalo de Datos:
2020.01.01 - 2023.01.01 - Modo de Prueba:
Backtesting
Una vez configurado, iniciamos la prueba y observamos los resultados.
10.2. Interpretación de Resultados: Rendimiento, Drawdown, Ratio Sharpe
Después de ejecutar el backtesting, el Strategy Tester genera un informe detallado. A continuación, explicamos los indicadores clave:
- Rendimiento Total:
- Representa la ganancia neta obtenida durante el período de prueba.
- Fórmula:
Rendimiento Total = Ganancias Totales − Pérdidas Totales
- Drawdown Máximo:
- Indica la mayor caída en el balance de la cuenta desde un pico hasta un valle.
- Un drawdown alto sugiere un mayor riesgo.
- Fórmula:
Drawdown Máximo = Balance Inicial / Diferencia entre Pico y Valle
- Ratio Sharpe:
- Mide el rendimiento ajustado al riesgo. Un valor positivo indica que la estrategia supera el riesgo asumido.
- Fórmula:
Ratio Sharpe = (Rendimiento Promedio − Tasa Libre de Riesgo) / Desviación Estándar de los Retornos
Ejemplo Práctico: Interpretación de Resultados
Supongamos que el informe del backtesting muestra lo siguiente:
- Rendimiento Total:
+15% - Drawdown Máximo:
8% - Ratio Sharpe:
1.2
Interpretación:
- La estrategia generó un rendimiento positivo del 15%, lo cual es bueno.
- El drawdown máximo del 8% sugiere un nivel moderado de riesgo.
- El ratio Sharpe de 1.2 indica que la estrategia tiene un buen equilibrio entre rendimiento y riesgo.
10.3. Optimización de Parámetros mediante Pruebas Automatizadas
La optimización automática permite ajustar los parámetros de un EA para maximizar su rendimiento. Esto se hace mediante el modo de optimización del Strategy Tester.
Pasos para Optimizar Parámetros
- Definir Parámetros a Optimizar:
- En el código del EA, usa la palabra clave
inputpara definir los parámetros ajustables. Por ejemplo:
- En el código del EA, usa la palabra clave
input int FastMAPeriod = 10; // Período de la media móvil rápida
input int SlowMAPeriod = 50; // Período de la media móvil lenta
- Configurar el Modo de Optimización:
- En el Strategy Tester, selecciona
Optimizationen lugar deBacktesting. - Define los rangos y pasos para cada parámetro. Por ejemplo:
FastMAPeriod: De 5 a 20, paso 1.SlowMAPeriod: De 30 a 100, paso 5.
- En el Strategy Tester, selecciona
- Elegir el Criterio de Optimización:
- Selecciona un criterio como
Profit Factor,Sharpe RatiooMax Drawdown.
- Selecciona un criterio como
- Iniciar la Optimización:
- Haz clic en
Startpara ejecutar la optimización. El Strategy Tester probará todas las combinaciones posibles dentro de los rangos definidos.
- Haz clic en
Ejemplo Práctico: Optimización de Parámetros
Supongamos que queremos optimizar los períodos de las medias móviles (FastMAPeriod y SlowMAPeriod). Configuramos la optimización como sigue:
- FastMAPeriod: De 5 a 20, paso 1.
- SlowMAPeriod: De 30 a 100, paso 5.
- Criterio de Optimización:
Profit Factor.
Después de ejecutar la optimización, el Strategy Tester muestra las mejores combinaciones de parámetros. Por ejemplo:
- Mejor Combinación:
FastMAPeriod = 12SlowMAPeriod = 50- Profit Factor:
1.8
Interpretación:
- Esta combinación de parámetros maximiza el factor de ganancia, lo que sugiere que es la más efectiva.
Interactividad: Ejercicios Prácticos
Ejercicio 1: Configura el Strategy Tester para probar un EA en el símbolo GBPUSD con datos históricos desde 2019.01.01 hasta 2022.01.01. Usa el modelo Every tick y analiza el rendimiento total y el drawdown máximo.
Este es un EA simple que abre posiciones largas cuando el precio sube por encima de una media móvil y cierra las posiciones cuando el precio cae por debajo de la misma. Es solo un ejemplo para ilustrar cómo configurar el Strategy Tester.
//+------------------------------------------------------------------+
//| Expert Advisor básico para pruebas |
//+------------------------------------------------------------------+
#property strict
// Parámetros de entrada
input int MAPeriod = 50; // Período de la media móvil
input double LotSize = 0.1; // Tamaño de lote
// Variables globales
double maValue;
// Función de inicialización
int OnInit() {
Print("EA iniciado. Probando en GBPUSD desde 2019.01.01 hasta 2022.01.01.");
return(INIT_SUCCEEDED);
}
// Función principal que se ejecuta en cada tick
void OnTick() {
// Calcular la media móvil
maValue = iMA(_Symbol, _Period, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
// Verificar si hay posiciones abiertas
if (PositionsTotal() == 0) {
// Abrir posición larga si el precio está por encima de la media móvil
if (Close[0] > maValue) {
OpenBuyPosition();
}
} else {
// Cerrar posición si el precio está por debajo de la media móvil
if (Close[0] < maValue) {
CloseOpenPosition();
}
}
}
// Función para abrir una posición larga
void OpenBuyPosition() {
double stopLoss = NormalizeDouble(Ask - 50 * Point(), _Digits); // Stop loss a 50 pips
double takeProfit = NormalizeDouble(Ask + 100 * Point(), _Digits); // Take profit a 100 pips
if (OrderSend(_Symbol, OP_BUY, LotSize, Ask, 10, stopLoss, takeProfit)) {
Print("Posición larga abierta. Precio: ", DoubleToString(Ask, _Digits));
} else {
Print("Error al abrir posición larga. Código de error: ", GetLastError());
}
}
// Función para cerrar la posición abierta
void CloseOpenPosition() {
for (int i = 0; i < PositionsTotal(); i++) {
uint ticket = PositionGetTicket(i);
if (OrderClose(ticket, PositionGetDouble(POSITION_VOLUME), Bid, 10)) {
Print("Posición larga cerrada.");
} else {
Print("Error al cerrar posición. Código de error: ", GetLastError());
}
}
}
Explicación del Código
- Parámetros de Entrada:
MAPeriod: Define el período de la media móvil.LotSize: Define el tamaño de lote para las operaciones.
- Lógica del EA:
- El EA calcula una media móvil simple (
iMA) y abre una posición larga si el precio de cierre (Close[0]) está por encima de la media móvil. - Cierra la posición si el precio de cierre cae por debajo de la media móvil.
- El EA calcula una media móvil simple (
- Funciones Principales:
OpenBuyPosition: Abre una posición larga con stop loss y take profit predefinidos.CloseOpenPosition: Cierra todas las posiciones abiertas.
- Comentarios:
- Los comentarios explican cada paso del código para facilitar su comprensión.
Configuración del Strategy Tester
- Paso 1: Adjuntar el EA al Gráfico
- Guarda el archivo
.mq5del EA en la carpetaExpertsde tu terminal MetaTrader 5. - Adjunta el EA al gráfico de
GBPUSD.
- Guarda el archivo
- Paso 2: Configurar el Strategy Tester
- Abre el Strategy Tester (
Ctrl + R). - Configura los siguientes parámetros:
- Símbolo:
GBPUSD - Período:
H1(u otro temporalidad según tus necesidades) - Modelo de Ejecución:
Every tick(para mayor precisión) - Intervalo de Datos: Desde
2019.01.01hasta2022.01.01 - Modo de Prueba:
Backtesting
- Símbolo:
- Abre el Strategy Tester (
- Paso 3: Ejecutar el Backtesting
- Haz clic en
Startpara iniciar el backtesting.
- Haz clic en
Análisis de Resultados
Una vez completado el backtesting, el Strategy Tester generará un informe con los siguientes resultados clave:
- Rendimiento Total:
- Observa el campo
Net Profiten el informe. Por ejemplo:
- Observa el campo
Net Profit: +$2,500
- Drawdown Máximo:
- Observa el campo
Maximal Drawdownen el informe. Por ejemplo:
- Observa el campo
Maximal Drawdown: 8.5%
- Interpretación:
- Si el rendimiento total es positivo y el drawdown máximo es bajo (por ejemplo, menos del 10%), la estrategia puede ser prometedora.
- Un drawdown alto sugiere que la estrategia es arriesgada y podría requerir ajustes.
Resultado Esperado
Cuando ejecutes este backtesting, podrías obtener resultados similares a estos:
- Rendimiento Total:
+$2,500 - Drawdown Máximo:
8.5% - Número de Operaciones Ganadoras:
60% - Factor de Ganancia:
1.5
Esto indica que la estrategia generó ganancias netas significativas con un nivel moderado de riesgo.
Caso Práctico
Este ejercicio demuestra cómo configurar y ejecutar un backtesting básico en MQL5. Aunque el EA utilizado es simple, puedes aplicar los mismos pasos para probar estrategias más complejas. Además, analizar métricas como el rendimiento total y el drawdown máximo te ayuda a evaluar la viabilidad de una estrategia antes de operar en tiempo real.
¡Espero que este ejemplo te ayude a familiarizarte con el proceso de backtesting en MQL5!
Ejercicio 2: Optimiza los parámetros de un EA basado en medias móviles. Define rangos para FastMAPeriod (de 8 a 15) y SlowMAPeriod (de 40 a 80) y selecciona Sharpe Ratio como criterio de optimización.
Este es un EA simple que abre posiciones largas cuando la media móvil rápida cruza por encima de la lenta y posiciones cortas cuando la media móvil rápida cruza por debajo de la lenta.
//+------------------------------------------------------------------+
//| Expert Advisor basado en cruce de medias móviles |
//+------------------------------------------------------------------+
#property strict
// Parámetros de entrada
input int FastMAPeriod = 10; // Período de la media móvil rápida (optimizable)
input int SlowMAPeriod = 50; // Período de la media móvil lenta (optimizable)
input double LotSize = 0.1; // Tamaño de lote
// Variables globales
double fastMA, slowMA;
// Función de inicialización
int OnInit() {
Print("EA iniciado. Optimizando FastMAPeriod (8-15) y SlowMAPeriod (40-80).");
return(INIT_SUCCEEDED);
}
// Función principal que se ejecuta en cada tick
void OnTick() {
// Calcular las medias móviles
fastMA = iMA(_Symbol, _Period, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0); // Media móvil rápida
slowMA = iMA(_Symbol, _Period, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0); // Media móvil lenta
// Verificar si hay posiciones abiertas
if (PositionsTotal() == 0) {
// Abrir posición larga si la media rápida cruza por encima de la lenta
if (fastMA > slowMA) {
OpenBuyPosition();
}
// Abrir posición corta si la media rápida cruza por debajo de la lenta
else if (fastMA < slowMA) {
OpenSellPosition();
}
} else {
// Cerrar posición si las medias móviles cruzan en sentido contrario
CloseOpenPosition();
}
}
// Función para abrir una posición larga
void OpenBuyPosition() {
double stopLoss = NormalizeDouble(Ask - 50 * Point(), _Digits); // Stop loss a 50 pips
double takeProfit = NormalizeDouble(Ask + 100 * Point(), _Digits); // Take profit a 100 pips
if (OrderSend(_Symbol, OP_BUY, LotSize, Ask, 10, stopLoss, takeProfit)) {
Print("Posición larga abierta. Precio: ", DoubleToString(Ask, _Digits));
} else {
Print("Error al abrir posición larga. Código de error: ", GetLastError());
}
}
// Función para abrir una posición corta
void OpenSellPosition() {
double stopLoss = NormalizeDouble(Bid + 50 * Point(), _Digits); // Stop loss a 50 pips
double takeProfit = NormalizeDouble(Bid - 100 * Point(), _Digits); // Take profit a 100 pips
if (OrderSend(_Symbol, OP_SELL, LotSize, Bid, 10, stopLoss, takeProfit)) {
Print("Posición corta abierta. Precio: ", DoubleToString(Bid, _Digits));
} else {
Print("Error al abrir posición corta. Código de error: ", GetLastError());
}
}
// Función para cerrar la posición abierta
void CloseOpenPosition() {
for (int i = 0; i < PositionsTotal(); i++) {
uint ticket = PositionGetTicket(i);
int type = PositionGetInteger(POSITION_TYPE);
if (type == POSITION_TYPE_BUY && fastMA < slowMA) {
OrderClose(ticket, PositionGetDouble(POSITION_VOLUME), Bid, 10);
Print("Posición larga cerrada.");
} else if (type == POSITION_TYPE_SELL && fastMA > slowMA) {
OrderClose(ticket, PositionGetDouble(POSITION_VOLUME), Ask, 10);
Print("Posición corta cerrada.");
}
}
}
Explicación del Código
- Parámetros de Entrada:
FastMAPeriod: Define el período de la media móvil rápida. Este parámetro será optimizado entre 8 y 15.SlowMAPeriod: Define el período de la media móvil lenta. Este parámetro será optimizado entre 40 y 80.LotSize: Define el tamaño de lote para las operaciones.
- Lógica del EA:
- El EA calcula dos medias móviles: una rápida (
FastMAPeriod) y una lenta (SlowMAPeriod). - Si la media rápida cruza por encima de la lenta, abre una posición larga.
- Si la media rápida cruza por debajo de la lenta, abre una posición corta.
- Cierra las posiciones si las medias móviles cruzan en sentido contrario.
- El EA calcula dos medias móviles: una rápida (
- Funciones Principales:
OpenBuyPosition: Abre una posición larga con stop loss y take profit predefinidos.OpenSellPosition: Abre una posición corta con stop loss y take profit predefinidos.CloseOpenPosition: Cierra todas las posiciones abiertas cuando las condiciones de cierre se cumplen.
Configuración del Strategy Tester para Optimización
- Paso 1: Adjuntar el EA al Gráfico
- Guarda el archivo
.mq5del EA en la carpetaExpertsde tu terminal MetaTrader 5. - Adjunta el EA al gráfico de
EURUSD(u otro símbolo de tu elección).
- Guarda el archivo
- Paso 2: Configurar el Strategy Tester
- Abre el Strategy Tester (
Ctrl + R). - Configura los siguientes parámetros:
- Símbolo:
EURUSD - Período:
H1(u otro temporalidad según tus necesidades) - Modelo de Ejecución:
Every tick(para mayor precisión) - Intervalo de Datos: Desde
2019.01.01hasta2022.01.01 - Modo de Prueba:
Optimization
- Símbolo:
- Abre el Strategy Tester (
- Paso 3: Definir los Rangos de Optimización
- En la pestaña
Inputs, selecciona los parámetros a optimizar:- FastMAPeriod: De
8a15, paso1. - SlowMAPeriod: De
40a80, paso5.
- FastMAPeriod: De
- En la pestaña
- Paso 4: Seleccionar el Criterio de Optimización
- En la pestaña
Optimization, seleccionaSharpe Ratiocomo criterio de optimización.
- En la pestaña
- Paso 5: Ejecutar la Optimización
- Haz clic en
Startpara iniciar la optimización.
- Haz clic en
Análisis de Resultados
Una vez completada la optimización, el Strategy Tester generará un informe con las mejores combinaciones de parámetros. Por ejemplo:
- Mejor Combinación:
FastMAPeriod = 12SlowMAPeriod = 50- Sharpe Ratio:
1.8
Interpretación:
- Esta combinación de parámetros maximiza el ratio Sharpe, lo que sugiere que la estrategia tiene un buen equilibrio entre rendimiento y riesgo.
Resultado Esperado
Cuando ejecutes esta optimización, podrías obtener resultados similares a estos:
- Mejor Combinación de Parámetros:
FastMAPeriod = 12SlowMAPeriod = 50
- Sharpe Ratio:
1.8 - Rendimiento Total:
+$3,000 - Drawdown Máximo:
7.5%
Esto indica que la estrategia es rentable y tiene un nivel moderado de riesgo.
Caso Práctico
Este ejercicio demuestra cómo optimizar los parámetros de un EA utilizando el Strategy Tester. Al definir rangos para FastMAPeriod y SlowMAPeriod y seleccionar el ratio Sharpe como criterio de optimización, puedes identificar la combinación de parámetros que maximiza el rendimiento ajustado al riesgo. Esto es crucial para desarrollar estrategias robustas y eficientes.
¡Espero que este ejemplo te ayude a entender cómo realizar pruebas automatizadas y optimizar tus EAs en MQL5!
Ejercicio 3: Interpreta los siguientes resultados de backtesting:
- Rendimiento Total:
+20% - Drawdown Máximo:
12% - Ratio Sharpe:
0.9
A continuación, analizamos e interpretamos los resultados proporcionados:
1. Rendimiento Total: +20%
- Qué significa: El EA generó un rendimiento neto del 20% sobre el capital inicial durante el período de prueba.
- Interpretación:
- Este es un resultado positivo, ya que indica que la estrategia fue rentable en el período de backtesting.
- Sin embargo, es importante evaluar este rendimiento en relación con el riesgo asumido (ver drawdown máximo) y otros indicadores como el ratio Sharpe.
2. Drawdown Máximo: 12%
- Qué significa: Durante el período de prueba, el balance de la cuenta experimentó una caída máxima del 12% desde un pico hasta un valle.
- Interpretación:
- Un drawdown del 12% es moderado. Para muchos traders, un drawdown por debajo del 20% se considera aceptable, pero esto depende de tu tolerancia al riesgo.
- Si bien el rendimiento total es positivo, un drawdown del 12% sugiere que la estrategia puede ser volátil y podría requerir ajustes para reducir el riesgo.
3. Ratio Sharpe: 0.9
- Qué significa: El ratio Sharpe mide el rendimiento ajustado al riesgo. Un valor de 0.9 indica que la estrategia genera retornos superiores a la tasa libre de riesgo, pero no de manera excepcional.
- Interpretación:
- Un ratio Sharpe mayor a 1 generalmente se considera bueno, ya que indica que la estrategia tiene un buen equilibrio entre rendimiento y riesgo.
- Un ratio Sharpe de 0.9 está cerca del umbral aceptable, pero podría mejorarse. Esto sugiere que la estrategia tiene un rendimiento decente, pero también asume un nivel de riesgo relativamente alto.
Conclusión General
Basándonos en estos resultados:
- Rendimiento vs. Riesgo:
- La estrategia generó un rendimiento total del 20%, lo cual es positivo.
- Sin embargo, el drawdown máximo del 12% indica que la estrategia puede ser arriesgada, especialmente si el trader tiene una baja tolerancia al riesgo.
- Eficiencia del Riesgo (Ratio Sharpe):
- El ratio Sharpe de 0.9 sugiere que la estrategia tiene un rendimiento ajustado al riesgo moderado. Aunque no es excelente, tampoco es deficiente.
- Podrías considerar ajustar los parámetros del EA o implementar mejoras en la gestión de riesgos para aumentar el ratio Sharpe.
- Recomendaciones:
- Mejorar la Gestión de Riesgos: Considera reducir el tamaño de lote o ajustar los niveles de stop loss y take profit para minimizar el drawdown.
- Optimización: Realiza pruebas adicionales para optimizar los parámetros del EA y mejorar el ratio Sharpe.
- Validación Adicional: Prueba la estrategia en diferentes períodos de tiempo o símbolos para asegurarte de que los resultados sean consistentes.
Evaluación Final
En resumen:
- Ventajas: La estrategia es rentable y generó un rendimiento positivo del 20%.
- Desventajas: El drawdown del 12% y el ratio Sharpe de 0.9 sugieren que la estrategia puede ser arriesgada y no está completamente optimizada.
Si estas métricas son aceptables para tu perfil de riesgo, podrías considerar usar esta estrategia en una cuenta demo para validar su rendimiento en tiempo real antes de operar en una cuenta real.
Conclusión: El backtesting y la optimización son herramientas esenciales para evaluar y mejorar tus estrategias de trading. Al configurar correctamente el Strategy Tester, interpretar los resultados clave y optimizar los parámetros, puedes aumentar la probabilidad de éxito en tus operaciones.
En el próximo capítulo, exploraremos cómo implementar y monitorear tus EAs en una cuenta real o demo.
¡Sigue practicando y perfeccionando tus habilidades en MQL5!
