
Características del Wizard MQL5 que debe conocer (Parte 38): Bandas de Bollinger
Introducción
Las bandas de Bollinger son un indicador técnico popular desarrollado por John Bollinger en 1987 que consta de 3 líneas (o buffers de datos). Su función principal es encontrar una forma de cuantificar la volatilidad del mercado identificando los puntos de precio de sobrecompra y sobreventa de los valores negociados. Las bandas de Bollinger se expanden y contraen debido a la volatilidad del mercado, por lo que si la volatilidad aumenta las dos bandas externas se separan más, mientras que si hay una contracción en la volatilidad las dos bandas externas se acercan.
Los comerciantes utilizan estas expansiones y contracciones para anticipar períodos de rupturas o consolidación de precios, respectivamente. Las bandas superior e inferior de Bollinger también actúan como niveles dinámicos de soporte y resistencia, esto se debe a que los precios tienden a rebotar en estos niveles, ofreciendo pistas potenciales para reversiones o continuaciones. Las bandas de Bollinger a menudo respaldan estrategias de reversión a la media, donde se espera que los precios regresen a la media (la banda media) después de tocar la banda superior o la banda inferior. Las condiciones de sobrecompra y sobreventa también se determinan cuando el precio se extiende más allá de las bandas externas, lo que indica posibles puntos de reversión.
Además, cuando los precios se mantienen consistentemente cerca de la banda superior, indica que una tendencia alcista está en perspectiva, mientras que una ubicación predominantemente en la banda inferior a menudo implica que las tendencias bajistas están intactas. Las rupturas (o separaciones) de estas bandas pueden indicar por tanto el inicio de una nueva tendencia o un punto de inflexión. Finalmente, la compresión de las Bandas de Bollinger ocurre cuando las bandas superior e inferior están muy próximas entre sí durante un período determinado, de modo que la volatilidad es baja y el potencial de oportunidades de ruptura es inminente. Los operadores monitorean esto de cerca, a menudo utilizando la dirección de la ruptura como guía. La fórmula para los 3 buffers de datos es sencilla y se puede resumir mediante las siguientes ecuaciones:
Donde:
- MB es el búfer de banda media
- SMA es una función de media móvil simple
- P representa el historial de precios de cierre
- n es el periodo sobre el que se calcula la media móvil simple
Donde:
- UB es el búfer de banda superior
- k es un factor ajustable al que a menudo se le asigna 2 por defecto
- Sigma es la desviación estándar durante el período promedio
Donde:
- LB es el búfer de banda inferior
El propósito de este artículo no es sólo enumerar las diferentes señales que las Bandas de Bollinger pueden generar sino también, como siempre, mostrar cómo se pueden integrar en un único archivo de clase de señal personalizado. Por lo general, estos artículos están estructurados de tal manera que la ciencia detrás de una idea viene primero y luego se presentan las pruebas de la estrategia y los resultados al final. Sin embargo, para este artículo, como lo hemos hecho en algunos anteriores, compartiremos los resultados de las pruebas para cada configuración de señal presentada junto con el código de la configuración de señal. Esto significa que presentaremos múltiples resultados de pruebas a lo largo del artículo, en lugar de tenerlos al final. Estamos analizando hasta 8 posibles señales de Bandas de Bollinger que los traders podrían aprovechar.
Las clases de señales personalizadas son clave no solo para desarrollar señales versátiles y robustas debido a la forma en que permiten combinar diferentes estrategias, sino que el enfoque minimalista de codificación, en principio, permite que las ideas se prueben rápidamente y se validen de forma cruzada en un corto período de tiempo. El código adjunto al final de este artículo está destinado a ser utilizado en el asistente MQL5 para montar un Asesor Experto, y los nuevos lectores pueden encontrar orientación aquí y aquí sobre cómo hacerlo. Una vez que se validan las ideas, los operadores tienen la opción de implementar el Asesor Experto ensamblado o volver a codificarlo con personalizaciones de ejecución de operaciones mientras mantienen la estrategia base.
Antes de repasar las señales, podría ser instructivo si demostramos cómo preparamos la clase de señal personalizada para manejar o procesar todas estas 8 alternativas de señales. A continuación se muestra la interfaz de clase de señal personalizada:
//+------------------------------------------------------------------+ //| Class CSignalBollingerBands. | //| Purpose: Class of generator of trade signals based on | //| the 'BollingerBands' indicator. | //| Is derived from the CExpertSignal class. | //+------------------------------------------------------------------+ class CSignalBollingerBands : public CExpertSignal { protected: CiBands m_bands; // object-indicator .... //--- "weights" of market models (0-100) int m_pattern_0; // model 0 "Price Crossing the Upper Band or the Lower Band" int m_pattern_1; // model 1 "Price Bouncing Off Lower Band or Upper Band " int m_pattern_2; // model 2 "Price Squeeze Followed by a Breakout Above Upper Band or Below Lower Band " int m_pattern_3; // model 3 "Price Double Bottoms Near Lower Band or Double Top Near Upper Band " int m_pattern_4; // model 4 "Price Bounces Off the Middle Band from Above & Bounce Off from Below " int m_pattern_5; // model 5 "Volume Divergence at Lower Band or Upper Band " int m_pattern_6; // model 6 "Bands Widening After Downtrend or After Uptrend " int m_pattern_7; // model 7 "Bands Orientation and Angle Changes " uchar m_patterns_used; // bit-map integer for used pattens public: CSignalBollingerBands(void); ~CSignalBollingerBands(void); .... protected: ... //--- methods to check for patterns bool IsPattern_0(ENUM_POSITION_TYPE T); bool IsPattern_1(ENUM_POSITION_TYPE T); bool IsPattern_2(ENUM_POSITION_TYPE T); bool IsPattern_3(ENUM_POSITION_TYPE T); bool IsPattern_4(ENUM_POSITION_TYPE T); bool IsPattern_5(ENUM_POSITION_TYPE T); bool IsPattern_6(ENUM_POSITION_TYPE T); bool IsPattern_7(ENUM_POSITION_TYPE T); };
Sigue el enfoque estándar para la mayoría de las señales personalizadas, con la adición principal para este artículo son las variables enumeradas 'm_pattern_XX' que se destacan en el código. Estas variables que representan una ponderación (un valor en el rango de 0 a 100) son comunes en las clases de señales personalizadas que se ensamblan a través del asistente. Ejemplos rápidos de esto son la clase de señal envolvente y la clase de señal RSI. Ambas clases utilizan estas variables de patrón que presentan un peso constante preestablecido que a menudo es inferior a 100. Asignarles un peso constante no es problemático en sí porque, en principio, cada clase está destinada a usarse con otras clases de señales, de modo que lo que se optimiza o ajusta es la ponderación respectiva de cada clase en relación con la señal general del Asesor Experto.
Por lo tanto, la noción de optimizarlos es un poco extraña dado que existe un gran riesgo de sobreajuste para el símbolo o la seguridad comercial probados y el uso de estos patrones a menudo supone que el comerciante está bien familiarizado con la importancia relativa y la ponderación de cada patrón. No necesita que un optimizador le diga esto. Además, en el caso de que se utilicen múltiples clases de señales y todas ellas tengan sus propios patrones, los requisitos de optimización para esto se dispararían. Por eso es siempre mejor tenerlas como constantes “basadas en conocimiento” y no como una ponderación que se debe entrenar.
Sin embargo, para este artículo vamos a explorar la opción de tener estos patrones optimizados. Esto lo haremos principalmente por el motivo de que esta clase se ensambla únicamente dentro del asistente. No se ponderará frente a otra señal. Por lo tanto, nuestro parámetro de ponderación para esta señal permanecerá en 1,0, como lo ha sido para la mayoría de las clases de señales que hemos estado probando en estas series. Además de esto, generalmente cuando se asignan valores de patrones constantes, solo se utiliza uno de estos patrones mientras que los demás permanecen inactivos. Esto generalmente implica que debido a que la clase de señal se ensambla junto con otras señales, lo que significa que su ponderación se optimiza, el patrón seleccionado se optimiza para funcionar con otras señales, mientras que los otros patrones no seleccionados permanecen inactivos.
Para este artículo, queremos utilizar todos los patrones, siempre que estén presentes. Los patrones están emparejados por naturaleza, es decir, para condiciones largas y cortas, y es poco probable que se puedan indicar dos patrones de tipos diferentes al mismo tiempo. (Con esto queremos decir que, por ejemplo, el patrón 1 y el patrón 2 podrían señalarse simultáneamente, no que una condición larga y corta para un solo patrón podría mostrarse al mismo tiempo) Por lo tanto, lo que implica el uso concurrente es que un patrón podría indicar una posición larga, mientras que un patrón diferente en un momento separado indica una posición corta o el cierre de la posición que abrimos anteriormente. Estas clases de señales personalizadas tienen umbrales de cierre y umbrales de apertura, de modo que cuando un patrón determinado está presente, dependiendo de su valor optimizado, podría simplemente cerrar una posición ya abierta o cerrar la posición y abrir una reversión. Por lo tanto, nuestro Asesor Experto optimizará estos pesos de patrones en una ventana corta, para un solo símbolo, y verá si esto nos brinda algo interesante.
Nuestra clase de señal personalizada hereda de la clase 'CExpertSignal' que cuenta con la función 'PatternsUsage' que toma como entrada un entero de máscara de bits para los patrones utilizados en la clase de señal personalizada. Como podemos utilizar hasta 8 patrones de señales, nuestro mapa de bits tendrá un tamaño de 0 a 2 a la potencia 8 menos uno, es decir, 255. Esto implica que además de determinar los umbrales de patrones individuales (donde estos umbrales establecen el cierre y la apertura de posiciones), seleccionaremos qué patrones entre los 8 serán los más adecuados como estrategia que utilice las bandas de Bollinger. Esta selección de la combinación de patrones a utilizar simultáneamente se muestra en el informe final del probador al final de este artículo (debido a la extensión del artículo, se pospuso para aparecer en el próximo). Para cada uno de los patrones disponibles, los resultados de la prueba a continuación corresponden a cuando el asesor experto utiliza un solo patrón.
Sin embargo, según las pruebas realizadas, la asignación del número de patrones utilizados no habilita correctamente el uso de la función de definición 'IS_PATTERN_USAGE ()' como cabría esperar. Parece que la asignación predeterminada de -1 como el número de patrones utilizados, lo que implica que se pueden usar todos los patrones, es lo que siempre se implementa independientemente de la entrada que proporcionemos. Para solucionar esto, utilizamos nuestra propia implementación bit a bit que permite convertir el entero del mapa hash de entrada en 0 y 1, desde los cuales se pueden leer qué patrones se han seleccionado. La siguiente tabla puede servir como guía de cuáles son los 8 mapas de patrones individuales clave y cómo los interpretamos en nuestro código:
mapa de entradas (m_patterns_used) | bits implícitos | verificador de bytes |
1 | 00000001 | 0x01 |
2 | 00000010 | 0x02 |
4 | 00000100 | 0x04 |
8 | 00001000 | 0x08 |
16 | 00010000 | 0x10 |
32 | 00100000 | 0x20 |
64 | 01000000 | 0x40 |
128 | 10000000 | 0x80 |
Como se puede observar, cada uno de los 8 mapas enumerados implica el uso de un único patrón. Esto se ilustra mejor en los bits implícitos donde, en una cadena de 8 caracteres, todos son ceros excepto uno de ellos. En realidad, la entrada se puede asignar a cualquier valor entre 0 y 255, por lo que es un carácter sin signo (tipo de datos uchar).
Precio cruzando la banda superior o la banda inferior
Entonces, nuestra primera señal es cuando el precio cruza la banda superior o la banda inferior. Cuando el precio cruza la banda superior desde arriba para caer por debajo de ella, interpretamos esto como una señal bajista. Por el contrario, cuando el precio cruza la banda inferior desde abajo y cierra por encima de ella, potencialmente interpretamos esto como una señal alcista. Implementamos esta lógica en una función que verifica el patrón 0 de la siguiente manera:
//+------------------------------------------------------------------+ //| Check for Pattern 0. | //+------------------------------------------------------------------+ bool CSignalBollingerBands::IsPattern_0(ENUM_POSITION_TYPE T) { m_bands.Refresh(-1); m_close.Refresh(-1); if(T == POSITION_TYPE_BUY && Close(StartIndex() + 1) < Lower(StartIndex() + 1) && Close(StartIndex()) > Lower(StartIndex())) { return(true); } else if(T == POSITION_TYPE_SELL && Close(StartIndex() + 1) > Upper(StartIndex() + 1) && Close(StartIndex()) < Upper(StartIndex())) { return(true); } return(false); }
Nuestro código es bastante sencillo, gracias en parte al código de la biblioteca estándar de MQL5 donde la codificación para el indicador de Bandas de Bollinger se minimiza de tal manera que una vez que se declara una instancia de clase para el indicador de esta manera:
//+------------------------------------------------------------------+ //| Class CSignalBollingerBands. | //| Purpose: Class of generator of trade signals based on | //| the 'BollingerBands' indicator. | //| Is derived from the CExpertSignal class. | //+------------------------------------------------------------------+ class CSignalBollingerBands : public CExpertSignal { protected: CiBands m_bands; // object-indicator ... ... };
Y se inicializa de la siguiente manera:
//+------------------------------------------------------------------+ //| Create indicators. | //+------------------------------------------------------------------+ bool CSignalBollingerBands::InitIndicators(CIndicators *indicators) { //--- check pointer if(indicators == NULL) return(false); //--- initialization of indicators and timeseries of additional filters if(!CExpertSignal::InitIndicators(indicators)) return(false); //--- create and initialize MA indicator if(!InitMA(indicators)) return(false); //--- ok return(true); }
Lo único que tenemos que hacer es actualizarlo como se indica en la función anterior. No nos preocupamos por los números de buffer ya que las funciones para atender la banda superior, la banda inferior y la banda principal (o media) están construidas dentro de la clase. Además, los precios de apertura, máximo, mínimo y cierre del símbolo principal se inicializan dentro de las clases referenciadas siempre que se declaren dentro del constructor de la clase de la siguiente manera:
//+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CSignalBollingerBands::CSignalBollingerBands(void) ... { //--- initialization of protected data m_used_series = USE_SERIES_OPEN + USE_SERIES_HIGH + USE_SERIES_LOW + USE_SERIES_CLOSE; ... }
Nuevamente, esto solo deja el requisito de actualizar el controlador de precio respectivo, en cada barra, antes de recuperar el precio actual. En nuestro caso, utilizamos el precio de cierre, por lo que eso es todo lo que necesitamos para actualizar. Ejecutamos pruebas en el Asesor Experto ensamblado por el asistente donde asignamos el mapa de bits de entrada del patrón utilizado a 1 porque solo estamos usando el primer patrón. Los resultados de la prueba parcialmente optimizada al utilizar solo el patrón 0 nos brindan el siguiente informe:
Los resultados anteriores provienen de pruebas del par USDCHF en el marco temporal diario del año 2023. Debido a que solo utilizamos el patrón 0, el entero del mapa hash de entrada para los patrones utilizados es 1. Comprobamos este patrón de la siguiente manera en las condiciones largas y cortas que se comparten en el código al final de este artículo, junto con los resultados de las pruebas en todos los patrones.
Precio que rebota en la banda inferior o superior
Nuestra próxima señal es el rebote de los precios en cualquiera de las bandas exteriores. Si el precio toca la banda superior y luego se aleja de ella, esto se infiere como una señal bajista. Por el contrario, si el precio cae a la banda inferior de Bollinger y luego se recupera, esto se considera que indica una señal alcista. Esta interpretación se debe a que las bandas superiores e inferiores son zonas de reversión clave. Esto a su vez podría explicarse por la psique del mercado, donde los traders sienten que cuando un precio avanza excesivamente en una dirección determinada, es necesaria una corrección. Recordemos que las bandas de Bollinger no solo rastrean tendencias gracias al soporte de línea base (o medio), sino que también controlan la volatilidad. Por lo tanto, cuando el precio se aproxima a cualquiera de las bandas externas o cuando se amplían, se implica volatilidad.
Las herramientas de confirmación, que pueden ser indicadores alternativos, se utilizarían idealmente junto con las Bandas de Bollinger. Para implementar la verificación de este rebote en las bandas externas en MQL5, utilizamos la siguiente fuente:
//+------------------------------------------------------------------+ //| Check for Pattern 1. | //+------------------------------------------------------------------+ bool CSignalBollingerBands::IsPattern_1(ENUM_POSITION_TYPE T) { m_bands.Refresh(-1); m_close.Refresh(-1); if(T == POSITION_TYPE_BUY && Close(StartIndex() + 2) > Lower(StartIndex() + 2) && Close(StartIndex() + 1) <= Lower(StartIndex() + 1) && Close(StartIndex()) > Lower(StartIndex())) { return(true); } else if(T == POSITION_TYPE_SELL && Close(StartIndex() + 2) < Upper(StartIndex() + 2) && Close(StartIndex() + 1) >= Upper(StartIndex() + 1) && Close(StartIndex()) < Upper(StartIndex())) { return(true); } return(false); }
Estamos utilizando hasta 8 patrones y, como se puede ver en la tabla compartida anteriormente, el mapa de entrada (entrada de patrón utilizado) para el segundo patrón es 2. Esto garantiza que cuando verificamos condiciones largas y cortas, usemos solo este patrón, el rebote de las bandas superior e inferior. Realizamos pruebas en el par USDCHF en el marco temporal diario para el año 2023 y obtenemos los siguientes resultados:
Compresión de precios seguida de una ruptura por encima de la banda superior o por debajo de la banda inferior
Nuestro patrón tipo 2 es una compresión de precios seguida de una ruptura. La definición de una compresión de precios normalmente es un período prolongado de baja volatilidad, que con las Bandas de Bollinger está marcado por una brecha estrecha entre las bandas superiores y las bandas inferiores. Cuánto tiempo debe durar este intervalo es una cuestión subjetiva. Para nuestros propósitos, estamos siendo un poco simplistas, ya que estamos interpretando una compresión como cualquier contracción simultánea hacia la base de la Banda de Bollinger, tanto para la banda superior como para la banda inferior. Esto significa que si este apretón tiene solo una barra de longitud, lo usaremos. A continuación se muestra la implementación MQL5 de esto.
//+------------------------------------------------------------------+ //| Check for Pattern 2. | //+------------------------------------------------------------------+ bool CSignalBollingerBands::IsPattern_2(ENUM_POSITION_TYPE T) { m_bands.Refresh(-1); m_close.Refresh(-1); if(Upper(StartIndex()) > Upper(StartIndex() + 1) && Upper(StartIndex() + 1) < Upper(StartIndex() + 2) && Lower(StartIndex()) < Lower(StartIndex() + 1) && Lower(StartIndex() + 1) > Lower(StartIndex() + 2)) { if(T == POSITION_TYPE_BUY && Close(StartIndex()) >= Upper(StartIndex())) { return(true); } else if(T == POSITION_TYPE_SELL && Close(StartIndex()) <= Lower(StartIndex())) { return(true); } } return(false); }
De hecho, según nuestro código, la duración de la compresión es estrictamente de una barra. Nuestro código ni siquiera tiene en cuenta qué tan amplia es la brecha entre la banda superior y la banda inferior, y, sin embargo, este es otro factor clave que podría tenerse en cuenta al definir esto. Según nuestro código fuente anterior, cualquier caída en la banda superior que ocurra simultáneamente con un pico en la banda inferior equivale a una compresión. Si el precio después de esta compresión está en la banda superior o más cerca de ella, se indica una señal alcista. Por otro lado, si el precio está en la banda inferior después de esta compresión, entonces lo tomamos como una señal bajista. Las pruebas realizadas con solo este patrón nos dan los siguientes resultados:
Nuestros resultados anteriores de una breve ejecución de optimización durante el año 2023 en el marco temporal diario para el símbolo USDCHF no están validados de forma cruzada y solo sirven para indicar el potencial del patrón 2.
Doble suelo cerca de la banda inferior o doble techo cerca de la banda superior
Este patrón también está en nuestra lista y, sinceramente, es algo similar al patrón 1 (el segundo patrón mencionado anteriormente). La principal diferencia es que aquí tenemos más de un rebote en las bandas externas, a diferencia del único rebote que teníamos con el patrón 1. Entonces, este patrón, denominado patrón 3, puede considerarse como el patrón 1 con una confirmación. Debido a esto, no se realizan muchas configuraciones comerciales basándose únicamente en este patrón. Su implementación en MQL5 es la siguiente:
//+------------------------------------------------------------------+ //| Check for Pattern 3. | //+------------------------------------------------------------------+ bool CSignalBollingerBands::IsPattern_3(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 && Close(StartIndex() + 4) < Close(StartIndex() + 3) && Close(StartIndex() + 3) > Close(StartIndex() + 2) && Close(StartIndex() + 2) < Close(StartIndex() + 1) && Close(StartIndex() + 1) > Close(StartIndex()) && Close(m_close.MinIndex(StartIndex(), 5)) - Upper(StartIndex()) >= -1.0 * Range(StartIndex()) ) { return(true); } else if ( T == POSITION_TYPE_SELL && Close(StartIndex() + 4) > Close(StartIndex() + 3) && Close(StartIndex() + 3) < Close(StartIndex() + 2) && Close(StartIndex() + 2) > Close(StartIndex() + 1) && Close(StartIndex() + 1) < Close(StartIndex()) && Lower(StartIndex()) - Close(m_close.MaxIndex(StartIndex(), 5)) >= -1.0 * Range(StartIndex()) ) { return(true); } return(false); }
El mapa de entrada que nos restringe a operar únicamente con este patrón es el mapa de bits 4. Como puede verse en nuestra tabla de referencia anterior, al observar los bits implícitos se aprecia que, al contar desde la derecha hacia la izquierda, todo es cero excepto el cuarto carácter, que representa nuestro patrón 3. Las pruebas ejecutadas en configuraciones similares a las que tenemos arriba, USDCHF, marco de tiempo diario, 2023, nos dan los siguientes resultados:
Como es claramente evidente, no se realizan muchas operaciones porque los dobles suelos en cualquiera de las bandas superiores o inferiores no son algo habitual. Esto quizás implica que este patrón puede usarse independientemente sin la combinación de otro indicador, a diferencia de algunos de los patrones que acabamos de ver anteriormente.
Rebota en la banda media desde arriba y rebota desde abajo
Nuestro próximo y quinto patrón es el patrón 4 y éste evoluciona en torno a patrones de continuación en medio de una tendencia. Entonces, cada vez que el precio tiende en una dirección determinada, a menudo se hacen algunas pausas en el camino. Durante estas rupturas, hay más acción de latigazo que tendencias definitivas, sin embargo, muy a menudo (pero no siempre), antes de reanudar una tendencia, el precio puede probar la resistencia (si la tendencia es bajista) o el soporte (si la tendencia es alcista). Esta prueba de estos niveles puede estar marcada por el soporte base de la Banda de Bollinger porque también, al igual que las bandas superior e inferior, tiende a actuar como un nivel dinámico de soporte/resistencia.
Con este patrón, interpretamos un patrón alcista si el precio prueba la base (buffer medio) desde arriba y luego rebota hacia arriba y un patrón bajista si sucede lo mismo a la inversa. Un rebote desde abajo. La implementación de esto en MQL5 es la siguiente:
//+------------------------------------------------------------------+ //| Check for Pattern 4. | //+------------------------------------------------------------------+ bool CSignalBollingerBands::IsPattern_4(ENUM_POSITION_TYPE T) { m_bands.Refresh(-1); m_close.Refresh(-1); if(T == POSITION_TYPE_BUY && Close(StartIndex() + 2) > Base(StartIndex() + 2) && Close(StartIndex() + 1) <= Base(StartIndex() + 1) && Close(StartIndex()) > Base(StartIndex())) { return(true); } else if(T == POSITION_TYPE_SELL && Close(StartIndex() + 2) < Base(StartIndex() + 2) && Close(StartIndex() + 1) >= Base(StartIndex() + 1) && Close(StartIndex()) < Base(StartIndex())) { return(true); } return(false); }
La prueba con configuraciones de entorno similares a las anteriores nos da los siguientes resultados:
Nuestro indicador de Bandas de Bollinger utiliza la misma configuración en todas las pruebas realizadas en este artículo, donde el período del indicador es 20 y la desviación es 2.
Divergencia de volumen en la banda inferior o superior
A continuación tenemos nuestro sexto patrón, que busca rastrear las divergencias entre el volumen y la volatilidad. Actualmente, muchos traders, especialmente en esta plataforma, negocian pares de divisas y rara vez cuentan con datos de volumen confiables debido a las dificultades para integrar esta información entre múltiples corredores. Entonces, cuando hacemos un seguimiento o medimos el volumen en la implementación, usamos, posiblemente, el siguiente mejor proxy. Rango de barra de precios. Los argumentos para utilizar esto son que cuando a muchos compradores se les ofrece un par determinado, ese par seguramente se moverá mucho en la dirección de la oferta. Por supuesto, esto no es del todo cierto, ya que un número igualmente grande de contratos cortos en el otro extremo de esta acción podría inhibir el movimiento del precio y, sin embargo, el volumen total involucrado no se reflejaría en el rango de precios resultante de la barra.
Así que es simplemente un compromiso. Interpretamos una señal alcista cuando el rango de la barra de precios disminuye sistemáticamente durante 3 barras de precios consecutivas, mientras que al mismo tiempo el precio de cierre está en o por debajo de la banda inferior de las Bandas de Bollinger. De manera similar, tendremos una señal bajista cuando hay un rango de barra de precios de caída durante 3 barras y el precio de cierre está en o por encima del límite de las bandas superiores. El razonamiento detrás de esto podría tener que ver con el agotamiento de las tendencias anteriores, donde la caída en el "volumen" en el extremo de un rango de precios indica una reversión o al menos un retroceso. Esto se implementa en MQL5 de la siguiente manera:
//+------------------------------------------------------------------+ //| Check for Pattern 5. | //+------------------------------------------------------------------+ bool CSignalBollingerBands::IsPattern_5(ENUM_POSITION_TYPE T) { m_bands.Refresh(-1); m_close.Refresh(-1); m_high.Refresh(-1); m_low.Refresh(-1); if(Range(StartIndex()) < Range(StartIndex() + 1) && Range(StartIndex() + 1) < Range(StartIndex() + 2)) { if(T == POSITION_TYPE_BUY && fabs(m_close.GetData(StartIndex()) - Lower(StartIndex())) < fabs(m_close.GetData(StartIndex()) - Base(StartIndex()))) { return(true); } else if(T == POSITION_TYPE_SELL && fabs(m_close.GetData(StartIndex()) - Upper(StartIndex())) < fabs(m_close.GetData(StartIndex()) - Base(StartIndex()))) { return(true); } } return(false); }
Sus ejecuciones de prueba con sólo este patrón, utilizando configuraciones de entorno de ejecución similares a las de pruebas anteriores, nos dan los siguientes resultados:
Conclusión
Había planeado cubrir los 8 patrones del indicador Bandas de Bollinger, como se indica en el código adjunto, pero este artículo resultó ser un poco extenso. Por lo tanto, cubriré el resto en un artículo de seguimiento pronto.
Para concluir, hemos examinado 5 de al menos 8 patrones de señales que se pueden utilizar al operar con las Bandas de Bollinger. Este indicador no solo captura la tendencia general del precio, sino que también rastrea la volatilidad gracias a sus dos bandas externas. Cuando esta información se combina con la psicología del mercado, como hemos visto, se pueden generar una variedad de señales a partir de este único indicador. Si bien cada uno de estos patrones se puede utilizar solo como lo hemos hecho en este artículo porque tuvo que cortarse, el parámetro de entrada de los patrones utilizados en realidad puede permitir la selección múltiple de patrones para que puedan combinarse y optimizarse para llegar a una configuración más dinámica que puede adaptarse mejor a diferentes tipos de mercados. Esperamos cubrir esto y mucho más en el próximo artículo.
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/15803
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.





- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
¡¡¡Buen trabajo!!! ¿Puedes compartir el archivo de estos resultados?
No, no los guardo. Son demasiado específicos.
Gracias Stephen por este buen artículo.