En esta página
Volver a tutoriales

EA Avanzado MQL5 para MT5: Multi-Timeframe y Filtros

Sube de nivel: añade análisis multi-timeframe, filtros de sesión Londres/NY, ventanas de tiempo y filtros ATR/spread. Menos señales falsas, mejor rendimiento.

📖 34 min read

📝 6,800 words

🏷️ MQL5 & Expert Advisors

Compartir este artículo:

¿Quieres crear una estrategia sin código ahora?

Crea tu cuenta gratis en segundos y empieza de inmediato.


EA Avanzado: Multi-Timeframe y Filtros — Menos Señales Falsas, Mejor Rendimiento

Tu EA tiene lógica de entrada y gestión de riesgo, pero sigue operando en sesiones asiáticas tranquilas, durante picos de noticias o contra la tendencia del timeframe superior. Los filtros reducen el ruido: solo operas cuando las condiciones coinciden en varios timeframes y estados del mercado. Según la documentación de series temporales MQL5, puedes leer cualquier combinación símbolo-período con CopyRates, iTime e iBarShift. Esta guía te enseña análisis multi-timeframe, filtros de sesión, ventanas de tiempo, filtros ATR y spread — para que tu EA opere cuando más importa.

Guías relacionadas: Referencia de programación MQL5 · Gestión de riesgo en EA · EA de scalping en MT5 · Backtest de EA en MT5


Por qué MTF y Filtros Importan

¿Cuál es el problema? Un EA simple de cruce de MA opera en cada señal. Muchas de esas señales ocurren cuando:

  • La tendencia del timeframe superior va contra ti (escalping contra-tendencia)
  • El mercado está poco líquido (sesión asiática — spreads amplios, precio errático)
  • La volatilidad es extrema (noticias — falsos rompimientos, deslizamiento)
  • El spread es alto (el coste come tu beneficio)

¿Qué hacen los filtros? Los filtros bloquean operaciones cuando las condiciones son malas. No cambian tu lógica de entrada — añaden una comprobación sí/no: "¿Es Londres o NY?" "¿La tendencia H1 está a nuestro favor?" "¿El spread está por debajo de 30 puntos?" Si alguna falla, saltas la operación. Resultado: menos operaciones, pero de mayor calidad.

FiltroPropósito
Multi-timeframe (MTF)Operar solo cuando el TF superior (H1/H4) coincide con la dirección de entrada
Sesión (Londres/NY)Operar solo en horas de alto volumen — menos spread, tendencias más claras
Ventana de tiempoRestringir el trading a horas específicas (ej. 9:00–17:00 servidor)
Filtro ATRSaltar cuando la volatilidad es muy alta (noticias) o muy baja (mercado muerto)
Filtro spreadSaltar cuando el spread supera tu límite — protege objetivos de beneficio

Paso 1: Análisis Multi-Timeframe

¿Qué es? El análisis multi-timeframe significa comprobar un timeframe superior (ej. H1 o H4) antes de tomar una señal en el timeframe del gráfico (ej. M15). Ejemplo: "Solo comprar en M15 si la tendencia H1 es alcista." Usas el timeframe superior como filtro — si H1 indica bajista, no compras en M15 aunque M15 dé señal de compra.

¿Por qué usarlo? Operar con la tendencia del timeframe superior aumenta la probabilidad de que tu señal M15 lleve a un movimiento sostenido. Las operaciones contra-tendencia suelen fallar cuando el panorama general va contra ti.

¿Cómo funciona? Lee OHLC del timeframe superior con CopyRates. La función copia MqlRates (time, open, high, low, close, volume). Usa iBarShift para alinear el tiempo de la barra actual con el timeframe superior — devuelve el índice de barra en el TF superior para un tiempo dado.

Ejemplo — Filtro tendencia H1 (solo comprar si cierre H1 está por encima de MA H1):

int g_maH1Handle = iMA(_Symbol, PERIOD_H1, 50, 0, MODE_EMA, PRICE_CLOSE);

bool IsH1TrendBullish()
{
   datetime barTime = iTime(_Symbol, PERIOD_CURRENT, 0);
   int h1Bar = iBarShift(_Symbol, PERIOD_H1, barTime, false);
   if(h1Bar < 0) return false;
   double maBuffer[];
   ArraySetAsSeries(maBuffer, true);
   if(CopyBuffer(g_maH1Handle, 0, h1Bar, 1, maBuffer) < 1) return false;
   double closeH1 = iClose(_Symbol, PERIOD_H1, h1Bar);
   return (closeH1 > maBuffer[0]);
}

Uso antes de abrir Compra: if(!IsH1TrendBullish()) return;


Paso 2: Filtro de Sesión (Londres y Nueva York)

¿Qué es? Londres (aprox. 8:00–16:00 GMT) y Nueva York (13:00–21:00 GMT) son las sesiones más líquidas. Los spreads suelen ser más ajustados, las tendencias más claras. El solapamiento (13:00–16:00 GMT) suele ser el mejor momento para Forex. Un filtro de sesión bloquea operaciones fuera de estas horas.

¿Por qué usarlo? La sesión asiática (00:00–08:00 GMT) suele tener spreads más amplios y precio errático. Las noticias al abrir las sesiones pueden disparar la volatilidad. Restringir a Londres/NY mejora la ejecución y la calidad de la tendencia.

¿Cómo funciona? Usa TimeToStruct(TimeCurrent(), dt) para obtener la hora del servidor (dt.hour) y el día (dt.day_of_week). Comprueba si la hora cae dentro de Londres (8–16) o NY (13–21). Para solapamiento, permite 8–21. Excluye fines de semana (dt.day_of_week == SUNDAY || dt.day_of_week == SATURDAY).

Ejemplo — Permitir trading 8:00–21:00 GMT (Londres + NY):

bool IsLondonOrNySession()
{
   MqlDateTime dt;
   TimeToStruct(TimeCurrent(), dt);
   if(dt.day_of_week == SUNDAY || dt.day_of_week == SATURDAY) return false;
   return (dt.hour >= 8 && dt.hour < 21);
}

Nota: TimeCurrent() devuelve la hora del servidor del bróker. Si tu bróker usa GMT+2, ajusta las horas. SymbolInfoSessionTrade devuelve los horarios de sesión del bróker si prefieres eso a horas fijas.


Paso 3: Filtro de Ventana de Tiempo

¿Qué es? Una ventana de tiempo restringe el trading a un rango específico de horas (ej. 9:00–17:00 hora servidor). A diferencia del filtro de sesión (Londres/NY), esto es totalmente personalizable — defines hora de inicio y fin como inputs.

¿Por qué usarlo? Puede que quieras evitar la primera hora tras la apertura de Londres (picos de noticias) o la última hora antes del cierre de NY. Una ventana de tiempo te da control preciso.

¿Cómo funciona? Igual que el filtro de sesión — TimeToStruct(TimeCurrent(), dt), luego comprueba dt.hour >= InpStartHour && dt.hour < InpEndHour.

Ejemplo — Operar solo 10:00–18:00 servidor:

input int InpStartHour = 10;
input int InpEndHour   = 18;

bool IsWithinTimeWindow()
{
   MqlDateTime dt;
   TimeToStruct(TimeCurrent(), dt);
   if(dt.day_of_week == SUNDAY || dt.day_of_week == SATURDAY) return false;
   if(InpStartHour <= InpEndHour)
      return (dt.hour >= InpStartHour && dt.hour < InpEndHour);
   return (dt.hour >= InpStartHour || dt.hour < InpEndHour);
}

Paso 4: Filtro ATR

¿Qué es? El ATR (Average True Range) mide la volatilidad. Un filtro ATR salta operaciones cuando la volatilidad es demasiado alta (noticias, pánico) o demasiado baja (mercado muerto, lateral). Ejemplo: no operar si ATR actual > 1.5× ATR medio de 20 períodos (demasiado volátil) o < 0.5× (demasiado tranquilo).

¿Por qué usarlo? Durante noticias, el precio puede dispararse y alcanzar tu SL rápidamente — o zigzaguear. En períodos muy tranquilos, tu estrategia puede generar señales falsas. El filtro ATR evita ambos extremos.

¿Cómo funciona? Obtén ATR actual y ATR medio (ej. SMA 20 períodos del ATR). Compara: si atrNow > atrAvg * 1.5 → demasiado volátil, saltar. Si atrNow < atrAvg * 0.5 → demasiado tranquilo, saltar.

Ejemplo — Saltar cuando ATR > 1.5× o < 0.5× media 20 barras:

int g_atrHandle = iATR(_Symbol, PERIOD_CURRENT, 14);

bool IsAtrAcceptable()
{
   double atrBuffer[];
   ArraySetAsSeries(atrBuffer, true);
   if(CopyBuffer(g_atrHandle, 0, 0, 21, atrBuffer) < 21) return false;
   double atrNow = atrBuffer[0];
   double atrSum = 0;
   for(int i = 1; i <= 20; i++) atrSum += atrBuffer[i];
   double atrAvg = atrSum / 20.0;
   if(atrNow > atrAvg * 1.5) return false;
   if(atrNow < atrAvg * 0.5) return false;
   return true;
}

Paso 5: Filtro de Spread

¿Qué es? El spread es la diferencia entre Ask y Bid. Cuando el spread es alto (ej. durante noticias o baja liquidez), tu precio de ejecución es peor y el coste por ida y vuelta aumenta. Un filtro de spread salta abrir cuando el spread supera tu límite (ej. 30 puntos).

¿Por qué usarlo? Si tu objetivo es 50 pips y el spread es 20 pips, necesitas 70 pips de movimiento para cubrir costes. Un spread alto afecta objetivos pequeños y estrategias de scalping.

¿Cómo funciona? Obtén el spread actual con SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) (en puntos) o calcula (Ask - Bid) / Point. Compara con tu input de spread máximo.

Ejemplo — Saltar cuando spread > 30 puntos:

input int InpMaxSpread = 30;

bool IsSpreadAcceptable()
{
   long spread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
   return (spread <= InpMaxSpread);
}

Resumen — Poner Todo Junto

Añadiste: filtro tendencia MTF (alineación H1/H4), filtro sesión (Londres/NY), ventana de tiempo (horas personalizadas), filtro ATR (rango de volatilidad) y filtro spread (spread máximo). Aplica todos los filtros antes de tu lógica de entrada — si alguno falla, salta la operación. Tu EA ahora opera solo cuando las condiciones coinciden.

Consejo extra: ¿Prefieres añadir MTF y filtros de forma visual? Prueba AlfaTactix Strategy Builder gratis — configura señales multi-timeframe, filtros de sesión Londres/NY, ventanas de tiempo, filtros ATR y límites de spread con una interfaz sin código. Exporta MQL5 con todos los filtros integrados. Menos señales falsas, mismo resultado.


Código Completo

int g_maH1Handle = iMA(_Symbol, PERIOD_H1, 50, 0, MODE_EMA, PRICE_CLOSE);
int g_atrHandle  = iATR(_Symbol, PERIOD_CURRENT, 14);

bool PassesAllFilters()
{
   if(!IsH1TrendBullish()) return false;
   if(!IsLondonOrNySession()) return false;
   if(!IsWithinTimeWindow()) return false;
   if(!IsAtrAcceptable()) return false;
   if(!IsSpreadAcceptable()) return false;
   return true;
}

void OnTick()
{
   // ... tu lógica de señal ...
   if(!PassesAllFilters()) return;
   // ... abrir operación ...
}

Resolución de Problemas

SíntomaCausaSolución
Sin operaciones con filtro MTFLa tendencia H1 nunca coincide, o iBarShift devuelve -1Registra índice barra H1; asegura historial cargado para PERIOD_H1. Comprueba símbolo en Market Watch.
Filtro sesión bloquea todoZona horaria servidor distinta de GMTRegistra TimeCurrent() y dt.hour; ajusta rango de horas para tu bróker (ej. GMT+2 → usa 10–22).
Filtro ATR demasiado estrictoUmbrales 1.5× / 0.5× demasiado ajustadosAmplía rango (ej. 2.0× y 0.3×) o usa período ATR distinto.
CopyRates devuelve -1Sin historial para símbolo/períodoAsegura símbolo en Market Watch; espera descarga. Usa Bars() para comprobar barras disponibles.
Filtro spread nunca pasaSpread máx. muy bajo para el símboloAumenta InpMaxSpread o registra spread actual para fijar valor realista.

Consulta Funciones de Series MQL5 y Info de Mercado.

Crea tu estrategia de trading sin código ahora — gratis

Crea tu cuenta y empieza ahora mismo a construir una estrategia sin código. Añade indicadores, filtros y reglas de riesgo, y exporta MQL5 en minutos.

Preguntas Frecuentes

El análisis multi-timeframe (MTF) significa comprobar un timeframe superior (ej. H1 o H4) para tendencia o estructura antes de tomar señales en un timeframe inferior (ej. M15). Ejemplo: solo comprar en M15 si la tendencia H1 es alcista. Usa CopyRates, iTime o iBarShift para leer datos del timeframe superior.

Usa TimeToStruct(TimeCurrent(), dt) para obtener la hora actual (dt.hour) en hora del servidor. Londres suele ser 8–16 GMT, NY 13–21 GMT. Comprueba si la hora actual cae dentro de estos rangos antes de abrir operaciones. Alternativamente usa SymbolInfoSessionTrade para sesiones definidas por el bróker.

Un filtro ATR evita operar cuando la volatilidad es demasiado alta o baja. Ejemplo: no operar si ATR actual > 1.5× ATR medio (demasiado volátil) o < 0.5× ATR medio (demasiado tranquilo). Usa iATR y CopyBuffer.

Un spread alto aumenta el coste por operación y puede invalidar objetivos pequeños. Un filtro de spread evita abrir cuando SymbolInfoInteger(symbol, SYMBOL_SPREAD) o (Ask-Bid)/Point supera un límite (ej. 30 puntos).

iBarShift(symbol, higherTF, time, false) devuelve el índice de barra en el timeframe superior para un tiempo dado. Usa el tiempo de la barra actual del timeframe de entrada para encontrar la barra H1/H4 correspondiente. Consulta la documentación de CopyRates en MQL5.

Crea tu estrategia sin código ahora — gratis

Crear cuenta gratis