Resumen rápido
Los algoritmos genéticos (GA) optimizan parámetros de Expert Advisors imitando la selección natural. Cada individuo representa una combinación de parámetros (RSI, SL, TP, lote). La función fitness combina Sharpe Ratio (40%), Profit Factor (30%) y 1-MaxDrawdown (30%). Un GA típico con50-200 individuos converge en 15-20 generaciones, superando a Grid Search en tiempo y calidad de solución.
En trading, los GA son ideales para explorar espacios de búsqueda enormes donde los métodos tradicionales fallan por sobreajuste.
Componentes Fundamentales
Población Inicial
Cada individuo de la población representa un conjunto de parámetros del EA. Por ejemplo:
- Período del RSI: [7-21]
- Stop Loss: [20-100 pips]
- Take Profit: [30-150 pips]
- Tamaño de lote: [0.01-0.1]
Una población típica contiene entre 50 y 200 individuos.
Función de Fitness
La función de fitness evalúa qué tan bueno es cada individuo. Para trading, recomendamos combinar múltiples métricas:
fitness = (sharpe_ratio * 0.4) +
(profit_factor * 0.3) +
(1 - max_drawdown * 0.3)
Esto equilibra rentabilidad, consistencia y riesgo.
Operadores Genéticos
- Selección: Torneo o ruleta para elegir padres
- Cruce: Uniforme o de un punto para combinar genes
- Mutación: Cambio aleatorio de parámetros (1-5% de probabilidad)
- Elitismo: Los mejores individuos pasan directamente a la siguiente generación
Evolución de la Población
Mejor fitness por generación
Código en MQL5
// Estructura de un individuo genético
struct GeneticIndividual {
double rsi_period;
double stop_loss;
double take_profit;
double lot_size;
double fitness;
};
// Operador de cruce
GeneticIndividual Crossover(GeneticIndividual parent1,
GeneticIndividual parent2) {
GeneticIndividual child;
child.rsi_period = (MathRand() % 2 == 0) ?
parent1.rsi_period : parent2.rsi_period;
child.stop_loss = (MathRand() % 2 == 0) ?
parent1.stop_loss : parent2.stop_loss;
child.take_profit = (MathRand() % 2 == 0) ?
parent1.take_profit : parent2.take_profit;
child.lot_size = (MathRand() % 2 == 0) ?
parent1.lot_size : parent2.lot_size;
return child;
}
// Operador de mutación
void Mutate(GeneticIndividual &ind, double mutation_rate = 0.05) {
if (MathRand() / 32767.0 < mutation_rate)
ind.rsi_period += (MathRand() % 5) - 2;
if (MathRand() / 32767.0 < mutation_rate)
ind.stop_loss += (MathRand() % 10) - 5;
if (MathRand() / 32767.0 < mutation_rate)
ind.take_profit += (MathRand() % 10) - 5;
}
Contra el Sobreajuste
El principal riesgo de los GA es el sobreajuste. Para evitarlo:
- Validación cruzada: Usa walk-forward validation
- Restringe el espacio: Limita los rangos de parámetros
- Penaliza la complejidad: Prefiere soluciones con menos parámetros
- Usa datos out-of-sample: Nunca optimices y valides con los mismos datos
Comparación: Grid Search vs Algoritmo Genético
Conclusión
Los algoritmos genéticos son una herramienta poderosa para la optimización de EAs, pero deben usarse con responsabilidad. La clave está en combinarlos con técnicas de validación robustas para evitar el sobreajuste y garantizar que los resultados se mantengan en trading real.