English Русский Deutsch 日本語 Português
preview
Características del Wizard MQL5 que debe conocer (Parte 39): Índice de fuerza relativa

Características del Wizard MQL5 que debe conocer (Parte 39): Índice de fuerza relativa

MetaTrader 5Sistemas comerciales | 6 mayo 2025, 09:27
157 0
Stephen Njuki
Stephen Njuki

Introducción

En el último artículo, comenzamos a analizar las Bandas de Bollinger en uso dentro de una clase de señal personalizada para Asesores Expertos ensamblados por el Asistente MQL5 (MQL5 Wizard). Analizamos hasta 6 de las 8 posibles configuraciones previstas que pueden ser útiles para un comerciante dentro de una clase de señal personalizada al ponderar condiciones largas y cortas. Debido a que el artículo era demasiado largo, se presentan las dos configuraciones finales, así como una prueba combinada de todas las configuraciones o patrones posibles de bandas de Bollinger, como los llamábamos en ese entonces. Continuemos entonces mirando el patrón 6.


Bandas que se ensanchan después de una tendencia bajista o alcista

Nuestra séptima configuración, denominada patrón 6, se basa principalmente en la creciente volatilidad. La ampliación de la brecha entre las bandas superior e inferior de Bollinger siempre se toma como una indicación de una creciente volatilidad. En el caso de este patrón, debido a que este aumento de la volatilidad se produce al final de una tendencia, una gran cantidad de fluctuaciones en la acción del precio tiende a caracterizar los mercados y esto es lo que lleva a la presunción de reversiones pendientes de la tendencia anterior.

Por lo tanto, al interpretar esta configuración, una brecha cada vez mayor entre la banda superior e inferior después de un movimiento alcista se considera una señal bajista, mientras que brechas cada vez mayores similares después de un movimiento bajista son indicativas de una señal larga. Se trata por tanto de una señal contraria que busca oportunidades para abrir posiciones opuestas a la tendencia dominante reciente. Implementamos este patrón de la siguiente manera en MQL5:

//+------------------------------------------------------------------+
//| Check for Pattern 6.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_6(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   m_high.Refresh(-1);
   m_low.Refresh(-1);
   if(Gap(StartIndex()) > Gap(StartIndex() + 1) && Gap(StartIndex() + 1) > Gap(StartIndex() + 2))
   {  if(T == POSITION_TYPE_BUY && m_close.GetData(StartIndex() + 2) < m_close.GetData(StartIndex() + 3) && m_close.GetData(StartIndex() + 3) < m_close.GetData(StartIndex() + 4))
      {  return(true);
      }
      else if(T == POSITION_TYPE_SELL && m_close.GetData(StartIndex() + 2) > m_close.GetData(StartIndex() + 3) && m_close.GetData(StartIndex() + 3) > m_close.GetData(StartIndex() + 4))
      {  return(true);
      }
   }
   return(false);
}

Como se puede ver en nuestro código anterior, la verificación de la volatilidad en expansión es un requisito previo tanto para configuraciones alcistas como bajistas. Una vez superada esta comprobación, consideramos la tendencia anterior desde cuando comenzó la expansión de la volatilidad, no la tendencia actual. No miramos la tendencia actual porque, como se argumentó anteriormente, en este entorno volátil la dirección no es definitiva, aunque a menudo la tendencia anterior al pico de volatilidad era más clara.

Por lo tanto, esta situación en la que las tendencias actuales no están claras siempre presenta un riesgo de continuación de la ruptura donde, en lugar de revertirse como uno esperaría, el precio simplemente rompe esta "zona de consolidación" y continúa con la tendencia anterior al pico de volatilidad. Por lo tanto, esto justifica la integración con el análisis de volumen, de modo que si las bandas se ensanchan a medida que cae el volumen, esto sirve como confirmación de la tesis de reversión de la tendencia. Si el volumen no se contrae, entonces es mejor para los traders esperar un punto de reversión más adecuado. Como vimos en el patrón 2 del artículo anterior, este fue el grueso de nuestra tesis.

Y como se mencionó, la información sobre el volumen es difícil de conseguir, por lo que nos basamos principalmente en los rangos de barras de precios como indicador. Un indicador alternativo como el RSI, que analizamos a continuación, también se puede utilizar para servir como confirmación de puntos de precio de sobrecompra y sobreventa. Al probar nuestro Asesor Experto ensamblado por un asistente, obtenemos los siguientes resultados:

r_6_ol

c_6_ol


Orientación de las bandas y cambios de ángulo

El patrón final que consideramos para las Bandas de Bollinger está relacionado con una desviación entre las bandas superior e inferior. Cuando la banda inferior sube más rápido que la banda superior por un múltiplo igual o mayor que el parámetro de entrada de desviación de la banda de Bollinger, interpretamos esto como una señal alcista. Esto se debe a que este tipo de configuración presagia una ruptura al alza, a través de la resistencia de la banda superior. La confirmación en forma de una ruptura de precio real puede complementar esta señal para afinar los puntos de entrada. La configuración bajista refleja esto, donde si los máximos caen a un ritmo más rápido que los mínimos, las bandas inferiores actúan como un soporte que está a punto de ser roto. Nuevamente, se puede utilizar una señal de confirmación de esta ruptura, como cuando el precio cierra por debajo de las bandas inferiores. Implementamos esto en MQL5 de la siguiente manera:

//+------------------------------------------------------------------+
//| Check for Pattern 7.                                             |
//+------------------------------------------------------------------+
bool CSignalBollingerBands::IsPattern_7(ENUM_POSITION_TYPE T)
{  m_bands.Refresh(-1);
   m_close.Refresh(-1);
   m_high.Refresh(-1);
   m_low.Refresh(-1);
   if
   (
      T == POSITION_TYPE_BUY &&
      Lower(StartIndex()) > Lower(StartIndex() + 1) &&
      Lower(StartIndex() + 1) > Lower(StartIndex() + 2) &&
      Upper(StartIndex()) >= Upper(StartIndex() + 1) &&
      Upper(StartIndex() + 1) >= Upper(StartIndex() + 2) &&
      Lower(StartIndex()) - Lower(StartIndex() + 2) >= m_deviation * (Upper(StartIndex()) - Upper(StartIndex() + 2))
   )
   {  return(true);
   }
   else if
   (
      T == POSITION_TYPE_SELL &&
      Upper(StartIndex()) < Upper(StartIndex() + 1) &&
      Upper(StartIndex() + 1) < Upper(StartIndex() + 2) &&
      Lower(StartIndex()) <= Lower(StartIndex() + 1) &&
      Lower(StartIndex() + 1) <= Lower(StartIndex() + 2) &&
      Upper(StartIndex() + 2) - Upper(StartIndex()) >= m_deviation * (Lower(StartIndex() + 2) - Lower(StartIndex()))
   )
   {  return(true);
   }
   return(false);
}

Esta fuente, como se mencionó anteriormente, se puede complementar con la confirmación de ruptura de precios y el lector puede hacerlo ya que el código fuente completo se adjunta al final del artículo. Al probar nuestro Asesor Experto ensamblado con el mapa de entrada para patrones, establecido en 80 (lo que corresponde estrictamente al 8ésimo patrón), obtenemos los siguientes resultados:

r_7_ol

c_7_ol

Esto es de una de las mejores ejecuciones de optimización con solo el patrón 7. Sin embargo, como se mencionó, modificamos nuestra señal personalizada, rompiendo con la convención y permitiendo el uso de múltiples patrones simultáneamente. Si realizamos entonces algunas ejecuciones de optimización en busca de la mejor combinación de patrones y sus respectivos umbrales de apertura/cierre, obtenemos una serie de resultados de prueba plausibles, de los cuales tenemos los siguientes:

r_all_ol

c_all_ol

Hay una diferencia en estos resultados y, por lo tanto, se podría argumentar a favor de explotar el uso de patrones múltiples con bandas de Bollinger y esto podría ser plausible siempre que se tenga en cuenta que estas señales, si bien se adaptan a diferentes entornos de mercado, también se cancelarán entre sí. Esto dificulta la comprobación o validación cruzada del sistema; sin embargo, si se logra con datos de prueba de calidad adecuada, el sistema puede ir más allá. Las condiciones de compra y venta que filtran el mapa de entrada en busca de patrones utilizados para esta clase de señal personalizada de Bandas de Bollinger son idénticas a las que utilizamos a continuación con la clase personalizada RSI. El listado típico de la condición de compra, que se refleja simplemente en la condición de venta, se muestra a continuación:

//+------------------------------------------------------------------+
//| "Voting" that price will grow.                                   |
//+------------------------------------------------------------------+
int CSignalRSI::LongCondition(void)
{  int result  = 0, results = 0;
//--- if the model 0 is used and "Price Crossing the Upper Band or the Lower Band"
   if(((m_patterns_used & 0x01) != 0) && IsPattern_0(POSITION_TYPE_BUY))
   {  result += m_pattern_0;
      results++;
   }
//--- if the model 1 is used and "Price Bouncing Off Lower Band or Upper Band "
   if(((m_patterns_used & 0x02) != 0) && IsPattern_1(POSITION_TYPE_BUY))
   {  result += m_pattern_1;
      results++;
   }
//--- if the model 2 is used and "Price Squeeze Followed by a Breakout Above Upper Band or Below Lower Band "
   if(((m_patterns_used & 0x04) != 0) && IsPattern_2(POSITION_TYPE_BUY))
   {  result += m_pattern_2;
      results++;
   }
//--- if the model 3 is used and "Price Double Bottoms Near Lower Band or Double Top Near Upper Band "
   if(((m_patterns_used & 0x08) != 0) && IsPattern_3(POSITION_TYPE_BUY))
   {  result += m_pattern_3;
      results++;
   }
//--- if the model 4 is used and "Price Bounces Off the Middle Band from Above & Bounce Off from Below "
   if(((m_patterns_used & 0x10) != 0) && IsPattern_4(POSITION_TYPE_BUY))
   {  result += m_pattern_4;
      results++;
   }
//--- if the model 5 is used and "Volume Divergence at Lower Band or Upper Band  "
   if(((m_patterns_used & 0x20) != 0) && IsPattern_5(POSITION_TYPE_BUY))
   {  result += m_pattern_5;
      results++;
   }
//--- if the model 6 is used and "Bands Widening After Downtrend or After Uptrend "
   if(((m_patterns_used & 0x40) != 0) && IsPattern_6(POSITION_TYPE_BUY))
   {  result += m_pattern_6;
      results++;
   }
//--- if the model 7 is used and "Bands Orientation and Angle Changes "
   if(((m_patterns_used & 0x80) != 0) && IsPattern_7(POSITION_TYPE_BUY))
   {  result += m_pattern_7;
      results++;
   }
//--- return the result
   if(results > 0)
   {  return(int(round(result / results)));
   }
   return(0);
}

En ambas condiciones, utilizamos operaciones bit a bit para verificar si el mapa de entrada de los patrones utilizados permite el uso de un patrón determinado. Como hemos visto con las Bandas de Bollinger, los 8 patrones tienen sus índices distintos: 1, 2, 4, 8, 10, 20, 40 y 80. Dado que el mapa de entrada para los patrones utilizados es un número entero en el rango de 0 a 255, simplemente verificamos si cada uno de estos patrones está seleccionado en función del valor de entrada. Por ejemplo, un valor de mapa de entrada de 107 implica que solo se seleccionan los patrones 0, 1, 3, 5 y 6. En nuestra última ejecución de las Bandas de Bollinger, estábamos optimizando principalmente este mapa de entrada además de otros umbrales. Ahora continuamos nuestro artículo mirando el RSI a continuación. 


El Índice de fuerza relativa (Relative Strength Index, RSI)

El RSI es un oscilador muy popular en el que confían bastantes operadores a la hora de colocar y cerrar operaciones. Como se describe en las notas de resumen del artículo y en el enlace compartido, es un índice que se ocupa de rastrear la tasa de cambio en el precio para anticipar cualquier reversión pendiente para una tendencia de precios determinada. Si damos un paso atrás y pensamos en ello, el EURUSD ha estado, técnicamente, dentro de un rango entre 0,95 y 1,60 desde junio de 2002 hasta la actualidad, y se puede argumentar que durante los próximos 22 años podría seguir dentro de este rango. Obviamente, estos son movimientos enormes ya que representan muchos pips; sin embargo, son diferentes a los índices bursátiles, que casi todos se han negociado al alza desde sus niveles de 2002. Por lo tanto, la importancia de prevenir cuándo un par de divisas está sobrecomprado o sobrevendido sigue siendo una habilidad vital para muchos operadores. Su fórmula viene dada por:

Donde:

  • RS es la Fuerza Relativa, definida como la relación entre las ganancias medias y las pérdidas medias durante un periodo determinado:

El período durante el cual se calculan estas ganancias/pérdidas promedio es un parámetro de entrada al indicador RSI. La implementación de esto en MQL5 ya está manejada por el código de la biblioteca. Siguiendo con nuestro tema del artículo anterior, veamos 8 patrones más del RSI. Observamos cada uno de estos patrones en un modo similar al que usamos en el último artículo, donde se presentan los resultados de las pruebas de cada patrón individual junto con la descripción del patrón. Probamos en el marco temporal diario con el par de divisas USDJPY para el año 2023.


Niveles de sobrecompra/sobreventa (tradicionales)

Nuestro patrón 0 para el RSI son las rupturas tradicionales por debajo o por encima de los niveles del oscilador de 30 y 70 respectivamente. Esta es la forma predominante en que se utiliza este indicador y, dada la popularidad de este oscilador, es lógico que sea una configuración confiable. Entonces, las rupturas por debajo del nivel 30 indican un valor sobrevendido y a menudo señalan una entrada alcista, mientras que las rupturas por encima del nivel 70 señalan lo contrario. Implementamos esto dentro de nuestra clase de señal personalizada de la siguiente manera:

//+------------------------------------------------------------------+
//| Check for Pattern 0.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_0(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) <= 30.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) >= 70.0)
   {  return(true);
   }
   return(false);
}

Realizadas las pruebas con un Asesor Experto montado con asistente, para el que existen guías aquí y aquí sobre cómo utilizar el código adjunto para crear un Asesor Experto, obtenemos los siguientes resultados:

r_0

c_0

Este uso tradicional del RSI, como la mayoría de los osciladores, no está exento de fallos, ya que en mercados con tendencia el oscilador puede permanecer por encima del nivel 70 durante un periodo prolongado (cuando es alcista) o por debajo del 30 en escenarios bajistas. Esto a menudo implica que este oscilador puede combinarse con otros indicadores como promedios móviles o incluso osciladores como MACD, para establecer adecuadamente las señales actuales. Además, la personalización de estos niveles de oscilador de 70/30 a, por ejemplo, 80/20 podría ser adecuada cuando se trata de activos muy volátiles, con el fin de evitar la apertura prematura de posiciones en valores.

El uso de este patrón en mercados de rango limitado o de consolidación es ciertamente ideal, como ya se mencionó en la introducción anterior, y también los niveles del oscilador pueden servir como guías fiables sobre cuándo salir de las posiciones, ya que indican excesos del mercado como ya se ha discutido.


Fallas del RSI (reversiones)

Este segundo patrón, aunque en un principio es muy similar al patrón 0, se diferencia en que busca un pivote en el oscilador después de probar sus niveles clave. Esto lo hace más nítido. Una señal alcista es una prueba del nivel 30 seguida de una ruptura por encima de este, mientras que una entrada bajista se señala mediante un aumento por encima de 70 seguido de un cierre por debajo de este. Implementamos esto en MQL5 de la siguiente manera:

//+------------------------------------------------------------------+
//| Check for Pattern 1.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_1(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex() + 1) < 30.0 && Base(StartIndex()) > 30.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex() + 1) > 70.0 && Base(StartIndex()) < 70.0)
   {  return(true);
   }
   return(false);
}

Las pruebas realizadas para demostrar la comerciabilidad del patrón 1 nos dan los siguientes resultados:

r_1

c_1

El patrón 1, oscilaciones fallidas, tiende a ofrecer señales más fuertes que simplemente estar por encima o por debajo de los umbrales del oscilador clave porque confirman un cambio en el sentimiento del mercado que se confirma con más de un movimiento del RSI. Indican que el sentimiento se está revirtiendo sin necesidad necesariamente de una confirmación de precios. Se argumenta que este último punto hace que las oscilaciones fallidas del RSI sean más confiables que las divergencias del RSI con la dirección del precio, que también pueden ser una señal del RSI como destacamos a continuación.


Divergencia RSI (divergencia alcista/bajista)

El patrón 2 ocurre cuando el RSI se mueve en una dirección determinada y el precio se mueve en la dirección opuesta, lo que nuevamente indica un posible cambio en el impulso del mercado. Esta divergencia indica que la tendencia alcista o bajista predominante podría estar debilitándose y, como tal, una reversión podría ser inminente. Estas divergencias pueden ser alcistas o bajistas: una divergencia alcista se indica cuando el precio hace mínimos más bajos mientras el RSI hace mínimos más altos, y una divergencia bajista se indica si el precio hace máximos más altos, pero el RSI hace mínimos más altos. Para codificar este patrón en nuestra clase de señal personalizada, utilizamos el siguiente listado:

//+------------------------------------------------------------------+
//| Check for Pattern 2.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_2(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_close.Refresh(-1);
   if(T == POSITION_TYPE_BUY && 
   Close(StartIndex()) < Close(StartIndex() + 1) && 
   Close(StartIndex() + 1) < Close(StartIndex() + 2) && 
   Base(StartIndex()) > Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) > Base(StartIndex() + 2)
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && 
   Close(StartIndex()) > Close(StartIndex() + 1) && 
   Close(StartIndex() + 1) > Close(StartIndex() + 2) && 
   Base(StartIndex()) < Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) < Base(StartIndex() + 2)
   )
   {  return(true);
   }
   return(false);
}

Las ejecuciones de prueba de nuestro Asesor Experto ensamblado por asistente que utilizan únicamente el patrón 2 para el cual requerimos que el mapa de entrada utilizado del patrón sea 4, nos brindan los siguientes resultados:

r_2

c_2

La divergencia del RSI, como ya se mencionó en el patrón 1 anterior, no es tan resistente, sin embargo su uso principal es servir como un indicador de alerta temprana de reversiones de precios. Son particularmente importantes en mercados con tendencias o situaciones donde existen tendencias muy fuertes. Sin embargo, las señales de divergencia que producen podrían ser indicativas de un retroceso y no de una reversión, por lo que se sostiene que no son tan confiables. Por este motivo, a menudo se complementa con indicadores adicionales como medias móviles y líneas de tendencia de soporte/resistencia.

Por lo tanto, aquí es muy importante la necesidad de filtrar señales de divergencia falsas. Lo que podría ayudar es confiar en marcos de tiempo más grandes, ya que estos, aunque no son tan productivos a la hora de generar señales, tienden a ser un poco más confiables. También son dignas de mención las divergencias ocultas. Estos sirven como matasellos de una continuación de tendencia, donde una continuación alcista se infiere a partir del precio que forma mínimos más altos con el RSI que forma mínimos más bajos, mientras que la divergencia bajista oculta se suma a partir del precio que forma máximos más bajos y el RSI que forma máximos más altos.


RSI cruza por encima/por debajo de la línea media (nivel 50)

El patrón 3 se centra en el punto medio del RSI, nivel 50, y considera que cualquier cruce por debajo de él es bajista, mientras que cualquier ruptura por encima es alcista. Por defecto, la presencia del RSI cerca del nivel 50 debería indicar que no hay una señal clara presente, por lo tanto, como sería de esperar, cualquier cruce de este nivel es solo sugerente y a menudo requiere confirmación, o actúa en una capacidad de soporte para otros indicadores de tendencia como un filtro.

Al estar "en la cerca", los cruces de línea media pueden servir como un indicador de continuación de tendencia o un indicador de reversión de tendencia. La continuación de la tendencia se confirma para una señal alcista si el RSI cruza por encima de 50 y lo mismo para una señal bajista cuando cruza en la dirección opuesta. Las reversiones también se confirman para los bajistas cuando el RSI rompe la barrera de 50 desde abajo antes de retroceder por debajo de ella, y para los alcistas en un patrón U opuesto sobre esta línea media. Implementamos nuestro patrón 3 de la siguiente manera:

//+------------------------------------------------------------------+
//| Check for Pattern 3.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_3(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_close.Refresh(-1);
   m_high.Refresh(-1);
   m_low.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex() + 1) < 50.0 && Base(StartIndex()) > 50.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex() + 1) > 50.0 && Base(StartIndex()) < 50.0)
   {  return(true);
   }
   return(false);
}

Las pruebas ejecutadas solo con este patrón donde nuestro parámetro de entrada para los patrones utilizados se asigna a 8 nos dan los siguientes resultados:

r_3

c_3

El cruce de la línea media es una simplificación excesiva de todos los patrones considerados hasta ahora, lo que a su vez lo convierte en el menos afirmativo de una señal potencial. Por lo tanto, el uso de órdenes pendientes con este tipo de señal es común, y también lo es su uso en múltiples marcos temporales. Además, el patrón 3 también se puede utilizar en trailing stops, mediante el cual los operadores en, digamos, una posición larga, permanecen en ella mientras el RSI se encuentre por encima de esta línea media de 50 y salen de la posición una vez que cruza o cae por debajo de este nivel. Se aplicaría una configuración inversa para posiciones bajistas.


Ruptura de la línea de tendencia RSI

El patrón 4 es probablemente el más complejo entre los 8 que analizamos en este artículo, ya que considera los picos o valles a lo largo del RSI, así como una ruptura en sus respectivas líneas de tendencia. Con esta configuración de patrón, una señal alcista se interpreta si los picos descendentes en el RSI son seguidos por un aumento en el RSI que rompe la línea de tendencia de los picos. Por el contrario, un aumento en los valles del RSI seguido de una ruptura o caída por debajo de la línea de tendencia de la lectura actual del RSI se toma como indicativo de una señal bajista. Los enumeramos a continuación:

//+------------------------------------------------------------------+
//| Check for Pattern 4.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_4(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && 
   Base(StartIndex()) > Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) < Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) > Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) < Base(StartIndex() + 4) && 
   Base(StartIndex() + 4) > Base(StartIndex() + 2) && 
   Base(StartIndex()) >= 2.0*Base(StartIndex() + 2)-Base(StartIndex() + 4)
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && 
   Base(StartIndex()) < Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) > Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) < Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) > Base(StartIndex() + 4) && 
   Base(StartIndex() + 4) < Base(StartIndex() + 2) && 
   Base(StartIndex()) <= 2.0*Base(StartIndex() + 2)-Base(StartIndex() + 4)
   )
   {  return(true);
   }
   return(false);
}

Tenga en cuenta que no necesariamente buscamos los últimos picos o valles verdaderos del RSI, sino que verificamos si en las últimas 5 lecturas del RSI tenemos una secuencia de picos (para la señal alcista) o valles (para la bajista). Si esta comprobación solo dentro de los últimos 5 valores RSI es positiva, entonces simplemente verificamos la ruptura de la línea de tendencia. Nuevamente, no profundizamos en la geometría de la línea real que conecta estos picos o valles, sino que simplemente observamos el cambio en el RSI en estos dos puntos extremos. Si no continúa al mismo ritmo que la lectura actual del RSI, lo interpretamos como una ruptura de la línea de tendencia porque si la línea de pico o la línea de valle se hubieran mantenido, la lectura actual habría estado tan lejos del último valle o pico como su predecesora en la secuencia. Probando solo con este patrón 4 donde la entrada para los patrones utilizados es 10, obtenemos los siguientes resultados:

r_4

c_4

La ruptura de la línea de tendencia del RSI explotada en este artículo, como se indica en la fuente compartida, solo considera o verifica este patrón en las últimas 5 lecturas del RSI. Un enfoque más amplio que busque los puntos fractales o pico/valle del RSI podría producir resultados más interesantes.


Zonas de sobrecompra/sobreventa del RSI con confirmación de media móvil

El patrón 5 es simplemente una combinación del patrón 0 con la confirmación del promedio móvil. Por lo tanto, las condiciones alcistas descritas para el patrón 0 anterior se mantienen más un precio por encima del promedio móvil al definir las condiciones largas, mientras que, de manera similar, las mismas condiciones bajistas se darían con un precio por debajo del promedio móvil como confirmación para el posicionamiento corto. Con solo este ajuste, definimos esto como una función en MQL5 de la siguiente manera:

//+------------------------------------------------------------------+
//| Check for Pattern 5.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_5(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_close.Refresh(-1);
   m_ma.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) < 30.0 && Close(StartIndex()) > m_ma.Main(StartIndex()))
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > 70.0 && Close(StartIndex()) < m_ma.Main(StartIndex()))
   {  return(true);
   }
   return(false);
}

Y las ejecuciones de pruebas exclusivas que utilizan sólo este patrón, donde el mapa de entrada para los patrones utilizados es 20, nos dan los siguientes resultados:

r_5

c_5


Patrones de doble suelo/techo RSI

Este patrón también es algo similar al patrón 1 en que requiere la prueba de los niveles clave del oscilador RSI de 70 y 30. Sin embargo, a diferencia del patrón 1 que requiere solo un pico o caída, el patrón 6 requiere 2, de modo que dos caídas posteriores por debajo de la línea 30, cada una seguida por una recuperación desde este nivel, sí significan una señal alcista. Del mismo modo, un doble pico por encima del nivel 70 seguido de un cierre por debajo de este nivel se toma como una señal bajista. Esto lo implementamos de la siguiente manera:

//+------------------------------------------------------------------+
//| Check for Pattern 6.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_6(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) < 30.0 && 
   Base(StartIndex()) > Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) < Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) > Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) < Base(StartIndex() + 4)
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > 70.0 && 
   Base(StartIndex()) < Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) > Base(StartIndex() + 2) && 
   Base(StartIndex() + 2) < Base(StartIndex() + 3) && 
   Base(StartIndex() + 3) > Base(StartIndex() + 4)
   )
   {  return(true);
   }
   return(false);
}

Al probar solo con este patrón, 6, que requiere que nuestro parámetro de entrada para los patrones utilizados sea 40, obtenemos los siguientes resultados:

r_6

c_6


RSI con múltiples marcos temporales

Nuestro patrón final, el patrón 7, simplemente toma el patrón 0, el patrón tradicional y más popular para el RSI, y lo aplica en múltiples marcos de tiempo. Por lo tanto, las condiciones alcistas y bajistas para esto son idénticas a las que vimos arriba en el patrón 0. El parámetro de entrada adicional que nuestra clase de señal personalizada tomará para esto sería el marco de tiempo adicional para ayudar a construir el segundo indicador RSI. Para fines de prueba eficientes y para evitar el ruido de precios que puede prevalecer en períodos de tiempo más cortos, nuestro segundo período de tiempo será más grande que el período de tiempo de prueba predeterminado. La codificación de esto es la que se comparte a continuación:

//+------------------------------------------------------------------+
//| Check for Pattern 7.                                             |
//+------------------------------------------------------------------+
bool CSignalRSI::IsPattern_7(ENUM_POSITION_TYPE T)
{  m_rsi.Refresh(-1);
   m_rsi_alt.Refresh(-1);
   if(T == POSITION_TYPE_BUY && Base(StartIndex()) <= 30.0 && Alt(StartIndex()) <= 30.0)
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) >= 70.0 && Alt(StartIndex()) >= 70.0)
   {  return(true);
   }
   return(false);
}

La prueba de solo este patrón con el mapa de entrada de patrones utilizado como 80 nos da los siguientes resultados:

r_7

c_7

Como compartimos con las Bandas de Bollinger, vea la conclusión anterior, también tenemos una opción de patrón múltiple para esta clase de señal personalizada. Al igual que con las Bandas de Bollinger, optimizamos los patrones de entrada utilizados para mapear un número entero de 0 a 255 para encontrar la combinación ideal de patrones que podrían ser ideales para el oscilador RSI. Nuestra ejecución de optimización arrojó el mapa de patrones utilizados como 189. En formato binario, esto es 10111101, lo que significa que los únicos patrones, de nuestra ejecución de optimización, que son "inadecuados" son el patrón 1 y el patrón 6 (las oscilaciones de falla del RSI y los máximos/mínimos dobles). Esto, por supuesto, fue para el par USDJPY, y no se realizó una validación cruzada. Sin embargo, los resultados de la prueba se comparten a continuación:

r_all

c_all


Conclusión

En conclusión, para este artículo hemos examinado el oscilador RSI, un indicador técnico muy popular, destacando sus patrones de señal. Algunos de estos patrones son muy comunes y se asocian fácilmente con el RSI, como el patrón tradicional 0, mientras que otros, como la ruptura de la línea de tendencia, el patrón 4, pueden resultar extraños para algunos operadores. Sin embargo, además de probar cada patrón individual con exclusión de todos los demás, nuestra clase de señal personalizada también se toma la libertad de usar los patrones utilizados en el mapa de entrada como una máscara para seleccionar más de un patrón, de modo que, en efecto, los patrones que abren una posición determinada pueden no ser necesariamente los mismos patrones que gobiernan o determinan cuándo se cierra. 

Además, lo que podría valer la pena explorar para los lectores es cualquier patrón adicional que no hayamos considerado en este artículo. Utilizamos sólo 8 patrones, lo que significa que nuestra entrada para los patrones utilizados no fue más que 2 a la potencia 8 menos 1 (255). Si sumamos este número de patrones y decimos que llega a 10, entonces nuestro mapa de entrada para los patrones utilizados variará de 0 hasta 2 a la potencia 10 menos 1, lo que da como resultado 1023. Patrones adicionales que podrían considerarse incluyen la estrategia de ruptura del RSI, donde si el precio de un activo sube por encima de un nivel de resistencia clave en el gráfico de precios y simultáneamente rompe el nivel 70 en el gráfico RSI, esta señal, contrariamente a los patrones considerados hasta ahora, se interpreta como fuertemente alcista y el comienzo de una tendencia importante. Del mismo modo, la señal bajista también seguiría, en primer lugar, con el precio del gráfico cayendo por debajo de un nivel de resistencia clave del gráfico y el RSI también cayendo por debajo de 30. Esto también va en contra de cómo hemos interpretado el RSI en este artículo. La codificación de esto está sujeta a que el comerciante sea consciente de los niveles de soporte y resistencia del gráfico de precios clave para el valor con el que está negociando, por lo que se deja al lector (comerciante) su implementación.

Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/15850

Archivos adjuntos |
SignalWZ_39.mqh (19.43 KB)
wz_39.mq5 (8.13 KB)
Redes neuronales en el trading: Estudio de la estructura local de datos Redes neuronales en el trading: Estudio de la estructura local de datos
La identificación y preservación eficaz de la estructura local de los datos del mercado en condiciones de ruido es una tarea importante en el trading. El uso del mecanismo de Self-Attention ha ofrecido buenos resultados en el procesamiento de estos datos, pero el método clásico no tiene en cuenta las características locales de la estructura original. En este artículo, le propongo familiarizarse con un algoritmo que considera estas dependencias estructurales.
Del básico al intermedio: Unión (II) Del básico al intermedio: Unión (II)
Este será un artículo muy divertido y bastante curioso, en varios aspectos. Abordará la unión, para resolver un problema discutido anteriormente. Además, exploraremos algunas situaciones inusuales que pueden surgir al usar una unión en aplicaciones. El contenido expuesto aquí tiene, pura y simplemente, una finalidad didáctica. En ningún caso debe considerarse como una aplicación cuya finalidad no sea el aprendizaje y el estudio de los conceptos mostrados.
Características del Wizard MQL5 que debe conocer (Parte 40): SAR parabólico Características del Wizard MQL5 que debe conocer (Parte 40): SAR parabólico
El SAR parabólico (Stop-and-Reversal, SAR) es un indicador de confirmación de tendencia y de puntos de finalización de tendencia. Debido a que es un rezagado en la identificación de tendencias, su propósito principal ha sido posicionar trailing stop loss en posiciones abiertas. Sin embargo, exploramos si realmente podría usarse como una señal de Asesor Experto, gracias a clases de señales personalizadas de Asesores Expertos ensamblados por un asistente.
Del básico al intermedio: Unión (I) Del básico al intermedio: Unión (I)
En este artículo, veremos qué es una unión. Aquí, mediante la experimentación, analizaremos las primeras construcciones en las que podría utilizarse una unión. No obstante, lo que se mostrará aquí es solo la parte básica de todo un conjunto de conceptos e información que se explorará más a fondo en artículos futuros. El contenido expuesto aquí tiene un propósito puramente didáctico. En ningún caso debe considerarse una aplicación cuya finalidad no sea aprender y estudiar los conceptos mostrados.