Reduciendo el Impacto del Slippage con Dimensionamiento Adaptativo de Posiciones en MQL5

 
La mayoría de los EAs que veo aquí calculan el tamaño de posición con un lote fijo o una fórmula plana de porcentaje del equity, y luego se preguntan por qué las ejecuciones durante sesiones volátiles perjudican su ventaja. El slippage no es ruido aleatorio: se correlaciona con la volatilidad reciente y la ampliación del spread, y se puede ajustar de forma programática en lugar de simplemente ampliar el stop loss y esperar lo mejor.

Este es el enfoque que he estado usando: en lugar de un porcentaje de riesgo estático, escalo el tamaño de posición de forma inversa a un ratio de corto plazo entre ATR y spread. Cuando el spread se amplía en relación al ATR (algo típico antes de noticias o en momentos de baja liquidez), la función reduce el tamaño automáticamente en vez de enviar una orden de tamaño completo hacia una mala ejecución.

mql5
double GetAdjustedLotSize(string symbol, double riskPercent, int atrPeriod=14)
{
   double atr = iATR(symbol, PERIOD_M15, atrPeriod, 0);
   double spread = SymbolInfoInteger(symbol, SYMBOL_SPREAD) * SymbolInfoDouble(symbol, SYMBOL_POINT);
   double liquidityRatio = MathMax(0.1, MathMin(1.0, atr / (spread * 20)));

   double equity = AccountInfoDouble(ACCOUNT_EQUITY);
   double riskAmount = equity * (riskPercent / 100.0) * liquidityRatio;

   double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
   double lots = riskAmount / (atr * tickValue);

   double minLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   double lotStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
   lots = MathFloor(lots / lotStep) * lotStep;

   return MathMax(minLot, lots);
}

El liquidityRatio es la pieza clave: es un indicador aproximado pero efectivo de "si es un buen momento para enviar órdenes a mercado." Ajusta el multiplicador 20 si el spread típico de tu bróker ya es amplio en relación al ATR de tu instrumento; hay que calibrarlo por símbolo, no copiarlo y pegarlo a ciegas.

Hice backtesting de esto en un EA simple de breakout en EURUSD y GBPJPY durante los últimos dos años, y la mejora principal no fue el win rate, sino una reducción significativa del drawdown máximo durante ventanas de noticias de alto impacto, porque la función de dimensionamiento ya reducía el riesgo antes de que llegara la barra de spread ancho.

Tengo curiosidad por saber si otros aquí están haciendo algo similar con dimensionamiento sensible al spread, o si han encontrado que el ratio ATR/spread es demasiado ruidoso en timeframes bajos y usan otro proxy de volatilidad.