English Русский 中文 Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Indicadores William Blau y sistemas de trading en MQL5. Parte 1: indicadores

Indicadores William Blau y sistemas de trading en MQL5. Parte 1: indicadores

MetaTrader 5Sistemas comerciales | 21 enero 2014, 15:07
3 628 0
Andrey F. Zelinsky
Andrey F. Zelinsky

El trading técnico solo permite obtener beneficios si se dispone de las herramientas adecuadas.
Las herramientas de un buen operador son la experiencia, el buen juicio y la organización matemática de un buen software de trading.
William Blau

Introducción

La primera parte del artículo, "Indicadores y sistemas de trading en MQL5" de William Blau. Parte 1: indicadores", es una descripción de los indicadores y osciladores descritos por William Blau en el libro "Momentum, Direction, and Divergence".

Los indicadores y osciladores descritos en este artículo se muestran en forma de código fuente en el lenguaje MQL5 y están disponibles en el archivo adjunto  "Blau_Indicators_MQL5_en.zip".

La idea principal del análisis de William Blau

El análisis técnico de William Blau consta de cuatro fases:

  1. Al usar los datos de las series de precios (barras q) se calcula el indicador y se imprime en el gráfico. El indicador no refleja la tendencia principal del movimiento de los precios y no permite determinar los puntos de cambio de tendencia.
  2. El indicador es ajustado varias veces usando el método EMA: la primera vez (con el período r), la segunda vez (con el período s) y la tercera vez (con el período u). Se traza un indicador ajustado. Un indicador ajustado reproduce fielmente y con precisión las fluctuaciones de precios con un mínimo retraso. Permite calcular la tendencia del movimiento de precios y los puntos de cambio de tendencia, eliminando el ruido de fondo en los precios.
  3. El indicador ajustado se normaliza y es trazado a continuación. La normalización permite que el valor del indicador pueda interpretarse como un estado de sobrecompra o sobreventa del mercado.
  4. Un indicador ajustado y normalizado se ajusta una vez por el método EMA (período ul). Se construye un oscilador -el histograma del indicador y la línea de la señal, y se añaden los niveles de sobrecompra y sobreventa del mercado. Los osciladores nos permiten distinguir los estados de sobrecompra/sobreventa del mercado, los puntos de cambio de tendencia y el final de una tendencia.

Indicadores

Este artículo describe los siguientes grupos de indicadores:

  1. Indicadores basados en la dinámica:
  2. Indicadores basados en estocásticos:
  3. Indicadores basados en la dinámica estocástica:
  4. Indicadores basados en una desviación media de las tendencias del mercado:
  5. Indicadores basados en la convergencia/divergencia de la media móvil:
  6. Indicadores basados en la dinámica de velas japonesas:
  7. Indicadores basados en una dinámica combinada alto-bajo:

Para cada grupo de indicadores se muestran los siguientes:

  • Índice de indicador ajustado;
  • El índice del indicador ajustado normalizado;
  • El oscilador, basado en el índice del índicador ajustado normalizado.

La sección índice de fortaleza verdadera contiene:

  • Un análisis detallado del enfoque Williams Blau con relación al análisis técnico del gráfico de precios;
  • Una descripción detallada del algoritmo y el código de cada indicador de los grupos de indicadores basados en la dinámica.

Como método de ajuste, William Blau utiliza el ajuste exponencial de medias móviles (EMA). La media móvil exponencial se calcula añadiendo al valor previo de la media móvil un cierto porcentaje del precio actual.

Al usar el método EMA, los últimos precios tienen un mayor peso.

La función para el cálculo del método EMA es:

EMA(k,n) = EMA(k-1,n) + 2/(n+1) * (price(k) - EMA(k-1,n))
         = price(k) * 2/(n+1) + EMA(k-1,n) * (1 - 2/(n+1))

donde:

  • EMA(k,n) - medial móvil ajustada exponencialmente del periodo n para el momento del periodo k;
  • precio (k) - el precio en el momento del periodo k.

La descripción de los cuatro tipos de medias móviles y sus métodos de uso en el análisis técnico (véase también iMA) se encuentra disponible en la "Ayuda de MetaTrader 5" ("Analítica/Indicadores técnicos/Indicadores de tendencia/Media móvil").


La librería de funciones

La librería de funciones para el cálculo de medias móviles se encuentra en el archivo "MovingAverages.mqh". Nos preocupa ExponentialMAOnBuffer(), que rellena el buffer de la matriz de salida con los valores EMA del precio de la matriz de entrada[]. Sin embargo, la implementación de ExponentialMAOnBuffer() que se realiza en el archivo "MovingAverages.mqh" tiene la desventaja de que no funciona con el período n = 1.

Vea en el código fuente:

if(period<=1 || rates_total-begin<period) return(0);

Sine embargo, William Blau usa en su libro el período ajustado n = 1 como ausencia del ajuste.

Por tanto, el código de la función ExponentialMAOnBuffer() ha experimentado algunos cambios:

if(period<1 || rates_total-begin<period) return(0);

y así obtenemos ExponentialMAOnBuffer(). El código de esta función se encuentra en el archivo "WilliamBlau.mqh".

El archivo "WilliamBlau.mqh" también contiene las siguientes funciones:

  • La función PriceName() devuelve el tipo de precio como string:
string PriceName(
                 const int applied_price // price type
                )
  • La función CalculatePriceBuffer() calcula la matriz de precios de este tipo de precio:
int CalculatePriceBuffer(
                         const int applied_price,   // price type
                         const int rates_total,     // rates total
                         const int prev_calculated, // bars, processed at the last call
                         const double &Open[],      // Open[]
                         const double &High[],      // High[]
                         const double &Low[],       // Low[]
                         const double &Close[],     // Close[]
                         double &Price[]           // calculated prices array
                        )


El tipo de precio aplicado y el periodo de tiempo del gráfico de precio

William Blau considera los precios de cierre del periodo de tiempo diario. Los indicadores desarrollados en este artículo nos permiten elegir el tipo de precio (vea constantes de precio) y el periodo de tiempo del gráfico de precio depende del periodo de tiempo del indicador (vea periodos de tiempo del gráfico).

 

1. El índice de fortaleza verdadera

Los indicadores considerados (ver adjunto):

  1. Blau_Mtm.mq5 - Indicador del ratio (dinámica del periodo q; dinámica del periodo q ajustado);
  2. Blau_TSI.mq5 - Indicador de fortaleza verdadera (dinámica del periodo q ajustado y normalizado);
  3. Blau_Ergodic.mq5 - Oscilador ergódico (basado en el índice de fortaleza verdadera).


1.1. Dinámica

La descripción del indicador incorporado Dinámica y su uso en el análisis técnico se encuentra disponible en la sección "Ayuda de MetaTrader 5" "Analítica/Indicadores técnicos/Osciladores/Dinámica" (ver también iMomentum). Al contrario que la dinámica estándar (iMomentum), la de William Blau calcula la dinámica como un cambio del precio absoluto.

Un ejemplo de la implementación en MQL5 del indicador de fortaleza verdadera (TSI) de William Blau se encuentra disponible en el artículo "MQL5: crear su propio indicador".


1.1.1. Análisis técnico usando el indicador de dinámica

El objeto del análisis técnico es el gráfico de precio del instrumento financiero. Cada elemento del gráfico es una barra de precio. La barra de precio tiene las siguientes características: tiempo de apertura, precio de apertura, precio máximo, precio mínimo, tiempo de cierre, volúmenes de transacciones, y otros. La barra de precio comprende y refleja el comportamiento de los precios durante un periodo de tiempo discreto (periodo de tiempo del gráfico).

La tarea del análisis técnico del gráfico de precio es determinar la tendencia actual del movimiento del precio, mostrar los puntos altos y bajos en el precio y predecir la dirección del cambio del precio en el próximo periodo de tiempo. La complejidad de esto consiste en que el precio, al tiempo que se mueve dentro de los límites de su tendencia básica, realiza fluctuaciones multidireccionales creando el llamado ruido de fondo de precio.

La propuesta de William Blau. La primera diferencia: la dinámica. William Blau calculó la dinámica en función del cambio de precio [cierre] para cada [día] periodo de tiempo y creó el indicador de dinámica. Desde un punto de vista matemático, la función Dinámica es la primera derivada del precio.

Fig. 1.1. Indicador de dinámica (dinámica del periodo q)

Fig. 1.1. Indicador de dinámica (dinámica del periodo q)

La dinámica muestra la fluctuaciones del precio del periodo de un día y muestra la velocidad (magnitud) y dirección de los cambios en este periodo pero no refleja la tendencia general del movimiento del precio y no determina los puntos de inversión de la tendencia.

La segunda diferencia es el ajuste. La media móvil de la dinámica (la suma agregada de las fluctuaciones de precio diarias) reproduce casi con exactitud tanto las variaciones principales como las variaciones locales de los precios de la curva. Fig. 1.2 (a) en las subventanas I y II presenta la dinámica ajustada (medias móviles con periodos 20 y 300, respectivamente).

Cuando mayor es el periodo de la media móvil con mayor precisión es realizada la aproximación (reproducción) de las fluctuaciones de la curva de precio por la dinámica ajustada. Desde un punto de vista matemático, la función de la dinámica ajustada es la función integral de la dinámica o la función del precio reintegrada.

Fig. 1.2 (a). Indicador de la dinámica (dinámica del periodo q ajustada)

Fig. 1.2 (a). Indicador de la dinámica (dinámica del periodo q ajustada)


Fig. 1.2 (b). Indicador de la dinámica (dinámica del periodo q ajustada)

Fig. 1.2 (b). Indicador de la dinámica (dinámica del periodo q ajustada)


En la ventana principal de la Fig. 1.2 (a) se muestran los indicadores ajustados por EMA (con periodos de 5, 20 y 100). Un ligero incremento del periodo de la media móvil produce un retraso y la media móvil prácticamente es incapaz de reproducir las fluctuaciones de la curva de precio.

La tercera diferencia es el reajuste. El primer ajuste de la dinámica define la tendencia principal del movimiento del precio y los puntos de inversión pero no elimina el ruido de fondo. Para eliminar el ruido de fondo del precio se requiere un reajuste con un periodo pequeño de la media móvil.

Fig. 1.2 (b), en la subventana I se muestra el indicador de la dinámica ajustado (media móvil con periodo 20), las subventanas II y III muestran las dinámicas con ajustes dobles y triples (periodos de media móvil de 5 y 3). La repetición del ajuste elimina el ruido de fondo del precio, pero añade un ligero cambio en la curva (un retraso).

La cuarta diferencia: la diferencia en una señal de tendencias cambiantes. El ajuste de una dinámica con un periodo promedio pequeño puede producir una divergencia de la dinámica ajustada con la tendencia de la curva de precio.

En la Fig. 1.2 (a) la discrepancia se observa en la subventana I, mientras que en la Fig. 1.2 (b) se observa en las subventanas I, II y III (la dirección de cambio del precio se desvía de la dirección de cambio de la dinámica ajustada). Tales diferencias a menudo indican un cambio de tendencia. Desde un punto de vista matemático, la divergencia es una función del periodo de ajuste.

La fiabilidad de la interpretación de estas diferencias como una señal de las tendencias cambiantes puede mejorarse si consideramos la divergencia solo para las áreas de sobrecompra o sobreventa (ver n.  1.2.1).


1.1.2. Definición de la dinámica

La dinámica es un cambio de precio relativo.

El signo de la dinámica muestra la dirección del cambio de precio: en una dinámica positiva el precio se incrementa a lo largo del periodo, mientras que en una dinámica negativa el precio bajada en el periodo. La magnitud de la dinámica es la velocidad relativa del cambio de precio (primera derivada del precio).

Fig. 1.3. Definición de la dinámica

Fig. 1.3. Definición de la dinámica

Fórmula de la dinámica:

mtm(price) = price - price[1]

donde:

  • price - precio [cierre] del periodo actual;
  • price [1] - precio de [cierre] del periodo previo.

William Blau analiza la dinámica como la diferencia entre el precio de cierre del periodo actual y el precio de cierre del periodo previo. William Blau, en su cálculo de una dinámica de período único, utiliza los precios de dos períodos (el período actual y el previo).

Vamos a trabajar ahora sobre la fórmula para calcular la dinámica de un indicador del periodo, donde q es el número de periodos de tiempo utilizados en los cálculos (según William Blau q = 2).

Fórmula de la dinámica del periodo q:

mtm(price,q) = price - price[q-1]

donde:

  • q - número de barras usadas en el cálculo de la dinámica;
  • price - precio [cierre] del periodo actual;
  • price [q-1] - precio de cierre en el periodo (q-1).

En la fórmula resultante, nuestra dinámica de dos periodos se corresponde con la dinámica de un periodo de William Blau.

Fórmula de la dinámica de periodo q ajustada:

Mtm(price,q,r,s,u) = EMA(EMA(EMA( mtm(price,q) ,r),s),u)

donde:

  • price - precio de cierre, el precio base del gráfico de precio;
  • q - número de barras usadas en el cálculo de la dinámica;
  • mtm(price,q)=price-price[q-1] - dinámica del periodo q;
  • EMA (mtm (price, q), r) - el primer ajuste, EMA(r) aplicada a la dinámica del periodo q;
  • EMA (EMA(..., r),s) - el segundo ajuste, EMA(s) aplicada al resultado del primer ajuste;
  • EMA (EMA (EMA (..., r), s), u) - el tercer ajuste, EMA(u) aplicada al resultado del segundo ajuste.

1.1.3. Mtm(price,q,r,s,u) - indicador de ratio (dinámica). Especificación
  • Nombre de archivo: Blau_Mtm.mq5
  • El nombre: Dinámica (dinámica del periodo q, dinámica del periodo q ajustada) de William Blau.
  • Parámetros de entrada:
    • q - el periodo para el que se calcula la dinámica (por defecto q = 2);
    • r -periodo de la primera EMA, aplicada a la dinámica (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambios de representación del trazado gráfico: color, espesor, tipo de línea (la pestaña "Colores").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se utiliza el ajuste EMA. Por ejemplo, si establecemos Mtm (precio, 2,20,5,1), obtenemos una dinámica con doble ajuste, pero si establecemos Mtm (precio, 2,1,1,1), obtendremos una dinámica sin ajuste;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u-3 +1).

 

1.2. El índice de fortaleza verdadera

1.2.1. Análisis técnico usando el índice de fortaleza verdadera

Continúa: Vea el principio en el apartado 1.1.1.

La quinta: normalización. Mantener la normalización de los valores de la dinámica ajustada a una sola escala (mapeando en el intervalo [-1, +1]), nos permitirá determinar los estados de sobrecompra o sobreventa del mercado. La multiplicación reiterada de los valores de la dinámica ajustada normalizada en un factor de 100 convierte las series numéricas en el rango porcentual (mapeando en el intervalo [-100, 100]).

Fig. 1.4. Dinámica ajustada normalizada

Fig. 1.4. Dinámica ajustada normalizada


Una discrepancia sobre una señal de cambio de tendencias puede considerarse de confianza si la dinámica ajustada normalizada se encuentra en el estado de sobrecompra o sobreventa.


1.2.2. Definición del índice de fortaleza verdadera

El índice de fortaleza verdadera (TSI) es un indicador de la dinámica normalizada (dinámica del periodo q normalizada). El establecimiento de los valores de la dinámica ajustada a una sola escala (mapeando en el intervalo [+1, -1]) se consigue con la normalización de cada valor de la dinámica ajustada (la suma agregada de las fluctuaciones de precio del periodo q ajustada) al valor de la dinámica tomada en valor absoluto.

La multiplicación por un coeficiente de 100 cambia el intervalo de representación a [-100. +100] (porcentual). La normalización permite la interpretación del valor TSI como nivel de mercado de sobrecompra (positivo) o sobreventa (negativo).


Fórmula del índice de fortaleza verdadera:

                     100 * EMA(EMA(EMA( mtm(price,q) ,r),s),u)         100 * Mtm(price,q,r,s,u)
TSI(price,q,r,s,u) = –––––––––––––––––––––––––------–––––––––– = ––––––––––––––––------–––––––––––––––
                       EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)     EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)
if EMA(EMA(EMA(|mtm(price,q)|,r),s),u)=0, then TSI(price,q,r,s,u)=0

donde:

  • price - precio de cierre, el precio base del gráfico de precio;
  • q - periodo de la dinámica;
  • mtm(price,q)=price-price[q-1] - dinámica del periodo q;
  • | Mtm (price, q) | - el valor absoluto de la dinámica del periodo q;
  • Mtm (price, q, r, s, u) - dinámica del periodo q ajustada tres veces;
  • EMA (..., r) - el primer ajuste, la EMA del periodo r aplicada a::
    1) la dinámica del periodo q;
    2) valor absoluto de la dinámica del periodo q;
  • EMA (EMA(..., r),s) - el segundo ajuste, EMA(s) aplicada al resultado del primer ajuste;
  • EMA (EMA (EMA (..., r), s), u) - el tercer ajuste, EMA(u) aplicada al resultado del segundo ajuste.

1.2.3. TSI(price,q,r,s,u) - el índice de fortaleza verdadera. Especificación
  • Nombre de archivo: Blau_TSI.mq5
  • El nombre: El índice de fortaleza verdadera (dinámica relativa del periodo q ajustada y normalizada) de William Blau.
  • Parámetros de entrada:
    • q - el período para el que se calcula la dinámica (por defecto q = 2);
    • r -periodo de la primera EMA, aplicada a la dinámica (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación del trazado gráfico - el color, el espesor, el estilo de línea (la pestaña "Colores");
    • (opcional) dos niveles (por defecto es -25 y +25) - añadir/eliminar un nivel; cambiar el valor, la descripción del nivel, cambiar el estilo de representación de los niveles (la pestaña "Niveles");
    • cambia los límites inferiores (por defecto -100) y superiores (por defecto +100) de la escala de la ventana del indicador único (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se realizará el ajuste en el periodo correspondiente de EMA;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u-3 +1).

 

1.3. Oscilador ergódico

1.3.1. Análisis técnico usando el oscilador ergódico

Continúa: Ver el principio en los apartados 1.1.1 y 1.2.1.

Sexta: las áreas de un mercado con sobrecompra o sobreventa. El intervalo unitario [-1, +1] o el intervalo porcentual [-100, +100] en el que ocurren los cambios en los valores de la dinámica ajustada normalizada nos permite definir las áreas de sobrecompra o sobreventa del mercado.

La clase de índices del análisis técnico que caracteriza el estado de sobrecompra o sobreventa del mercado se llama oscilador. Para cada oscilador, los niveles se determinan conforme al criterio seguido para la recepción de las señales de sobrecompra o sobreventa del mercado. Los osciladores son ineficaces en mercados con tendencias ya que estos pueden estar en una condición de sobrecompra/sobreventa durante un periodo de duración arbitrario.

Séptima: la línea de señal. Para obtener una señal sobre el final de una tendencia y una tendencia inversa del movimiento del precio, se usa la línea de señal. La señal para comprar se recibe cuando la línea principal cruza la línea de la señal de abajo hacia arriba. La señal para vender se recibe cuando la línea principal cruza la línea de la señal desde arriba hacia abajo. Cuando hay una línea principal -esta es ergódica (índice de fortaleza verdadera), el reajuste de la ergódica forma una línea de señal. El procedimiento de reajuste es igual al último proceso de ajuste ergódico.

Octava: la tendencia del movimiento del precio. La tendencia del movimiento del precio es ascendente (tendencia ascendente) cuando la línea principal (ergódica) pasa sobre la línea de señal. La tendencia del movimiento del precio es descendente (tendencia descendente) cuando la línea principal (ergódica) pasa bajo la línea de señal.

Fig. 1.5. Oscilador ergódico

Fig. 1.5. Oscilador ergódico


1.3.2. Definición del oscilador ergódico

Ergodic(price,q,r,s,u) = TSI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( Ergodic(price,q,r,s,u) ,ul)

donde:

  • Ergodic() - ergódico- índice de fortaleza verdadera TSI(price,q,r,s,u);
  • SignalLine() -una línea de señal - EMA(ul) aplicada a la ergódica;
  • ul - un periodo EMA de una línea de señal - según William Blau, el valor ul debe ser igual al periodo del último valor significativo (>1) del ergódico EMA. Por ejemplo, si usamos un ergódico de doble ajuste (price, q, r, s, u) = Ergodic (price, 2,20,5,1), entonces según William Blau ul = s = 5.

1.3.3. Ergodic (price, q,r,s,u,ul) - oscilador ergódico. Especificación
  • Nombre de archivo: Blau_Ergodic.mq5
  • Nombre: Oscilador ergódico (basado en un índice de fortaleza verdadera) según William Blau.
  • Parámetros de entrada:
    • graphic plot #0 - Ergódico (un índice de fortaleza verdadera):
      • q - el período para el que se calcula la dinámica (por defecto q = 2);
      • r -periodo de la primera EMA, aplicada a la dinámica (por defecto r = 20);
      • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
      • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • graphic plot #1 - la línea de señal:
      • ul - línea de señal del periodo EMA aplicada al ergódico (por defecto ul = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación de cada trazado gráfico - color, espesor, estilo de línea (la pestaña "Colores").
    • dos niveles (por defecto -25 y +25) - añadir/eliminar un nivel, cambiar el valor, descripción del nivel, cambiar el estilo de representación de los niveles (la pestaña "Niveles");
    • cambiar los límites inferiores (por defecto -100) y superiores (por defecto +100) de la escala de la ventana de indicador única (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se usa el ajuste EMA;
    • ul>0. Si ul = 1 la línea de señal y las líneas ergódicas son las mismas;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u + ul-4 +1).

1.4. El código (descripción detallada)

1.4.1. "Blau_Mtm.mq5" - indicador Mtm(price,q,r,s,u) - dinámica

El código del indicador Mtm (price,q,r,s,u):

//+------------------------------------------------------------------+
//|                                                     Blau_Mtm.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description
#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window     // indicator in a separate window
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots
//--- main graphic plot #0
#property indicator_label1  "Mtm"       // graphic plot label #0
#property indicator_type1   DRAW_LINE   // draw as a line
#property indicator_color1  Blue        // color
#property indicator_style1  STYLE_SOLID // line style - solid line
#property indicator_width1  1           // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA
//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes
int    rates_total_min; // total rates min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // plot buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
   // buffers for intermediate calculations
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");             // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // applied price
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[] arrays
                        PriceBuffer          // price buffer
                       );
//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Vamos a ver en detalle el código.


1.4.1.1. Configuración del indicador Mtm (price,q,r,s,u)

Bibliografía

Qué leer sobre la configuración del indicador en la Guía de referencia de MQL5:

  1. Apartado "Indicadores personalizados".
  2. La relación entre las propiedades del indicador y las funciones correspondientes (Ver"Indicadores personalizados").
  3. Propiedades de los programas (# property) (Ver Fundamentos del lenguaje/Preprocesador").
  4. Estilos de representación (propiedades de trazado gráfico) (Ver apartado "Constantes estándar, enumeraciones y estructuras / constantes de indicador").
  5. Propiedades de indicadores personalizados (Ver apartado "Constantes estándar, enumeraciones y estructuras / constantes de indicador").
Copyright. Descripción del indicador
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description

Configuración solo a través de la directiva del preprocesador #property. El copyright (parámetros copyright y link), la versión (la versión del parámetro) y una descripción del programa mql5 (descripción del parámetro) se muestran en las "propiedades" de la ventana del indicador (la pestaña "propiedades", cuadro "adicional").

Archivo include
#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)

Preprocessor reemplaza la línea #Include <WilliamBlau.mqh> con los contenidos del archivo "WilliamBlau.mqh". Los paréntesis en ángulo indican que el archivo "WilliamBlau.mqh" se obtendrá de la carpeta de datos del terminal. Para más información véanse los archivos inclusivos.

Para los contenidos del archivo "WilliamBlau.mqh" véase la introducción.

Configuración del indicador (en general)

El indicador personalizado - es un conjunto de trazados gráficos. El trazado gráfico del indicador puede mostrarse en pantalla, bien en la ventana principal del gráfico de precio o en una ventana separada. Cada trazado gráfico tiene un determinado método de dibujo, color, estilo y espesor.

Los datos para la representación del trazado gráfico se obtienen de los buffers del indicador (cada trazado gráfico se corresponde con entre uno a cinco buffers del indicador). Usamos una matriz de indicador como buffer del indicador.

Para configurar el indicador es necesario (ver Fig. 1.6):

  1. Especificar la ventana en la que mostrar los indicadores.
  2. Especificar el número de trazados gráficos.
  3. Especificar el número de buffers del indicador.
  4. Declarar las matrices del indicador.
  5. Establecer un enlace: matriz del indicador -> buffer del indicador -> trazado gráfico.
  6. Describir las propiedades de cada trazado gráfico.
  7. Especificar la precisión en la representación de los valores del indicador.
  8. Especificar, para cada construcción gráfica, el número de barras iniciales sin la representación del trazado gráfico.
  9. Configurar los niveles horizontales y describir las propiedades de cada nivel horizontal (no presente).
  10. Establecer las restricciones de escala para la ventana de indicador independiente (no presente).
  11. Especificar el nombre corto del indicador.

Fig. 1.6. Indicador de la dinámica Mtm (price,q,r,s,u)

Fig. 1.6. Indicador de la dinámica Mtm (price,q,r,s,u)


La configuración del indicador se realiza:

Para más información, puede consultarse el apartado conexión entre las propiedades del indicador y las funciones correspondientes.

La diferencia entre los métodos para configurar el indicador reside en que los ajustes por medio de la directiva #property están disponibles antes de que el indicador sea vinculado al gráfico de precio, mientras que los ajustes a través de las funciones especiales están disponibles después de que el indicador es vinculado al gráfico del precio. La configuración de los ajustes se realiza en la ventana "propiedades" del indicador.

Los ajustes: una ventana para mostrar el indicador (1)
#property indicator_separate_window     // indicator in a separate window

La configuración es obligatoria y solo es posible realizarla a través de la directiva del preprocesador #property. Hay dos opciones para mostrar el indicador:

  1. En la ventana principal del gráfico de precio - indicator_chart_window;
  2. En una ventana independiente - indicator_separate_window.
Ajustes: el número de buffers (3) y trazados gráficos (2)
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots

La configuración es obligatoria y solo es posible realizarla a través de la directiva del preprocesador #property. El número de buffers del indicador (parámetro indicator_buffers) y el número de trazados gráficos (parámetro indicator_plots) no está limitado.

Ajustes: matrices del indicador (4)
//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA

Las matrices del indicador se declaran a nivel global como matrices dinámicas de una dimensión de tipo doble.

Ajustes: configurar el vínculo (5) entre las matrices del indicador, los buffers del indicador y los trazados gráficos.
// graphic plot #0
SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
// buffers for intermediate calculations
SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA

El código se escribe en la función OnInit() del controlador de evento Init().

El enlace del buffer del indicador con la matriz de una dimensión correspondiente se realiza con la función SetIndexBuffer():

bool SetIndexBuffer(
   int                 index,    // index of the indicator buffer (starts from 0)
   double              buffer[], // dynamic array
   ENUM_INDEXBUFFER_TYPE data_type // type of data, stored in the indicator array
   );

El buffer del indicador es una matriz dinámica de una dimensión de tipo doble, cuyo tamaño se controla a través del terminal de cliente, de forma que siempre se corresponde con el número de barras sobre las que se calcula el indicador. La indexación de los buffers del indicador se inicia en 0.

Un buffer de indicador puede almacenar tres tipos de datos: INDICATOR_DATA, INDICATOR_COLOR_INDEX, INDICATOR_CALCULATIONS. Cada trazado gráfico, dependiendo de la forma en que se muestra en pantalla, puede corresponder a entre uno y cinco buffers de indicador, de uno a cuatro valores de buffer de indicador (tipo de dato INDICATOR_DATA) y un buffer de color (tipo de dato INDICATOR_COLOR_INDEX).

Los buffers de indicador con el tipo de datos INDICATOR_CALCULATIONS están pensados para los cálculos intermedios. Tras la unión, la matriz del indicador será objeto de indexación al igual que ocurre con las matrices convencionales (véase más adelante el apartado 1.4.1.2.)

Ajustes: propiedades de los trazados gráficos (6)

Para la configuración de cada conjunto de trazados gráficos se especifica lo siguiente:

  1. Etiqueta;
  2. Tipo de dibujo (véanse los 18 tipos en la enumeración ENUM_DRAW_TYPE);
  3. Color de línea;
  4. Estilo de línea (véanse los posibles estilos enumerados en ENUM_LINE_STYLE);
  5. Ancho de línea;

Hay dos tipos de configuraciones posibles:

1) A través de la directiva del preprocesador #property (implementada de la siguiente forma):

//--- graphic plot #0 (Main)
#property indicator_label1  "Mtm"       // label of graphic plot #0
#property indicator_type1   DRAW_LINE   // Drawing type: DRAW_LINE - line
#property indicator_color1  Blue        // Line color - Blue
#property indicator_style1  STYLE_SOLID // Line style: STYLE_SOLID - solid line
#property indicator_width1  1           // Line width

2) Usando un grupo de funciones de los ajustes de las propiedades del trazado gráfico PlotIndexSetDouble(), PlotIndexSetInteger(), PlotIndexSetString():

//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");            // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);       // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);          // line width

El código se escribe en la función Oninit() del controlador de evento Init. Especificación de la función PlotIndexSet *():

bool PlotIndexSetDouble|Integer|String(
   int                             plot_index, // index of the graphic plot
   int                             prop_id,    // identifier of the property of the graphic plot
   double|int,char,bool,color|string  prop_value  // new value of the property
   );

Para mejorar la representación en pantalla del tipo de trazado gráfico seleccionado usamos la propiedad IDs del trazado gráfico incluida en la enumeración ENUM_PLOT_PROPERTY.

El indexado de los trazados gráficos se inicia en 0. Con relación a la preferencia de una configuración mediante la directiva #property véase el apartado anterior de "Preferencias de indicador". Algunas propiedades de los trazados gráficos (color, estilo, ancho de línea) se encuentran disponibles para ser cambiadas a través de la ventana "propiedades" (la pestaña "Colores") del indicador.

Ajustes: la precisión de la representación en pantalla de los valores del indicador (7)
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

El código se escribe en la función Oninit() del controlador de evento Init. Especificación de la función de configuración de ajustes del indicador IndicatorSet * ():

bool IndicatorSetDouble|Integer|String(
   int                    prop_id,   // ID of indicator property
   double|int,color|string  prop_value // new value of a property
   );

Los identificadores de las propiedades del indicador se incluyen en la enumeración de ENUM_CUSTOMIND_PROPERTY.

La precisión de la representación en pantalla de los valores del indicador es proporcionada solo por la función IndicatorSetInteger(), el ID de las propiedades del indicador INDICATOR_DIGITS, y la enumeración de ENUM_CUSTOMIND_PROPERTY_INTEGER.

En un ejemplo donde los valores de los buffers de indicador que se pretenden representar en pantalla: junto al nombre corto del indicador, en un mensaje emergente, cuando el puntero del ratón se sitúa sobre la línea del indicador, se redondeará a _Digits - número de dígitos después del punto decimal en el precio del instrumento al que va unido el indicador.

Ajustes: número de barras iniciales sin representación (8)

Los datos para la representación de la dinámica del periodo q de William Blau constan de cuatro pasos:

Paso 1. Sobre la base de los datos de la matriz de precios PriceBuffer[] se calcula la dinámica (el periodo q). Los valores de la dinámica del periodo q se sitúan dentro de la matriz MtmBuffer[]. Como la indexación de la matriz de precios comienza en 0, los datos relevantes en la matriz de precios también comienzan por el índice 0 y a continuación los datos relevantes en la matriz MtmBuffer[] se inician con el índice (q-1).

Paso 2. Los datos relevantes en la matriz MtmBuffer[] son ajustados (periodo de ajuste r). Los valores de la dinámica del periodo q ajustada se sitúan en la matriz EMA_MtmBuffer[]. Como la indexación de la matriz MtmBuffer[] comienza en 0, los datos relevantes en la matriz MtmBuffer[] comienzan con el índice (q-1) y los datos relevantes en la matriz EMA_MtmBuffer[] comienzan con el índice (q-1) + (r-1).

Pasos tercero y cuarto. Para determinar a partir de qué barra se inician los datos significativos en la matriz DEMA_MtmBuffer[] (periodo de ajuste s) y en la matriz MainBuffer[] (periodo de ajuste u), se hacen las mismas consideraciones. Véase la Fig. 1.7.

Fig. 1.7. Los datos significativos del indicador Mtm (price,q,r,s,u)

Fig. 1.7. Datos significativos del indicador Mtm (price,q,r,s,u)


Las variables se declaran a nivel global:

//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes

Los valores de las variables -es el índice de la barra a partir del cual empiezan los datos significativos en el correspondiente a la matriz del indicador de la variable. Los valores de la variable son calculados en la función OnInit() y el controlador de evento Init, y se usarán en la función OnCalculate() del controlador de evento Calculate.

//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);

El número de barras iniciales sin que se muestre en el trazado gráfico se especifica usando la función PlotIndexSetInteger() y el identificador de las enumeraciones ENUM_PLOT_PROPERTY_INTEGER de PLOT_DRAW_BEGIN de la propiedad del indicador.

Configuración: el nombre corto del indicador (11)
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");

El código se escribe en la función Oninit() del controlador de evento Init. El nombre corto del indicador se especifica solo usando la función IndicatorSetString(), identificador de las propiedades del indicador INDICATOR_SHORTNAME (enumeración de ENUM_CUSTOMIND_PROPERTY_STRING). La función PriceName () devuelve el nombre del tipo de precio, dependiendo del valor del parámetro de entrada AppliedPrice. El código de la función PriceName() se encuentra en el archivo "WilliamBlau.mqh" (véase la introducción).

Parámetros de entrada
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type

Para más información véase variables de entrada. Los parámetros de entrada pueden cambiarse en la ventana "propiedades" (pestaña "entradas") del indicador.


1.4.1.2. El cálculo del indicador Mtm (price,q,r,s,u)

Cálculo: el algoritmo

Algoritmo para calcular el indicador Mtm(price,q,r,s,u):

  1. Verifique si hay suficientes datos para calcular el indicador.
  2. Los cálculos de la matriz de precios de acuerdo con el tipo de precio especificado - formación de la matriz PriceBuffer[]
  3. La determinación de la barra del índice de la que se inicia/continúa el cálculo de la dinámica del periodo q.
  4. El cálculo de la dinámica del periodo q -el llenado de la matriz MtmBuffer[].
  5. El primer ajuste por el método EMA (periodo r) - el llenado de la matriz EMA_MtmBuffer[].
  6. El segundo ajuste por el método EMA (periodo s) - el llenado de la matriz DEMA_MtmBuffer[].
  7. El tercer ajuste por el método EMA (periodo u) - el llenado de la matriz MainBuffer[] - el cálculo de los valores para la representación del trazado gráfico #0.
Cálculo: la función OnCalculate()

El cálculo de los valores del indicador se realiza en la función OnCalculate() del controlador de evento Calculate. Usamos la segunda forma de la llamada a la función OnCalculate().

int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at the previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
//---
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }

El argumento rates_total es el número de barras del gráfico del precio que es representado y se encuentran disponibles para ser procesadas por el indicador. Prev_calculated es el número de barras del gráfico de precio procesadas por el indicador en el momento del inicio de la llamada actual a la función OnCalculate().

La función OnCalculate() devuelve el número de barras del gráfico del precio procesadas por el indicador en el momento de la finalización de la llamada actual. Esta función devuelve el parámetro rates_total y debe construirse de tal forma que en la primera llamada sean procesadas todas las barras no procesadas del gráfico del precio.

Es decir, si en la primera llamada a la función OnCalculate() el parámetro prev_calculated es igual a 0, en la segunda llamada el parámetro prev_calculated es, o bien igual a rates_total o igual a rates_total + 1, y comenzando por la segunda llamada, la función OnCalculate() controla (cuenta) solo la última barra. Para mayor claridad con un ejemplo puede consultar aquí.

Los buffers del indicador y las matrices Time[], Open[], High[], Low[], Close[], TickVolume[], Volume[], y Spread[] tienen una dirección de indexado por defecto de izquierda a derecha, desde el principio al final de la matriz y desde el dato más antiguo al más reciente. El índice del primer elemento es igual a 0. El tamaño del buffer del indicador es controlado por el terminal de cliente por lo que se corresponde siempre con el número de barras para las que se calcula el indicador.

Cálculo: verifique si hay suficientes datos para calcular el indicador (1)
//--- check rates
   if(rates_total<rates_total_min) return(0);

La variable global rates_total_min es el tamaño mínimo de las series de tiempo de entrada del indicador calculado en la función OnInit() del controlador de evento Init.

   rates_total_min=begin4+1; // minimum size of the input timeseries of the indicator
Cálculo: las matrices de precios PriceBuffer[] (2)
//--- calculation of the prices array PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // size of the input timeseries
                        prev_calculated,     // bars, processed on the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // calculate the prices array
                       );

Para llenar la matriz de precios PriceBuffer[] se usa la función CalculatePriceBuffer(). El código de la función CalculatePriceBuffer() se encuentra en el archivo "WilliamBlau.mqh" (véase la introducción). Price type se especifica en el parámetro de entrada AppliedPrice.

Cálculo: la definición del índice de la barra a partir del cual comienza/continúa el cálculo de la dinámica del periodo q (3)

La variable local pos es el índice de la barra a partir del cual se calculará el indicador en la llamada actual de la función OnCalculate(). Vamos a combinar el cálculo de la variable pos con la etapa de preparación de la matriz MtmBuffer[] para el cálculo (la etapa en la que se hacen ceros los elementos no significativos de la matriz MtmBuffer[])

Cálculo: dinámica del periodo q (4)
//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];

La dinámica del periodo q se calcula como la diferencia entre el periodo actual PriceBuffer[i] y el precio (q-1) de los periodos previos PriceBuffer[i-(q-1)].

Cálculo: ajuste por el método EMA (5-7)

//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);

La función ExponentialMAOnBuffer() se describe en la introducción. En el ejemplo del cálculo del primer EMA del periodo r: la función ExponentialMAOnBuffer() llena la matriz de salida con los valores de EMA (r) de la matriz de entrada MtmBuffer[], con los datos no significativos hasta el índice (begin1-1) inclusive, que se llenan con valores cero.

 

1.4.2. "Blau_TSI.mq5" - indicador TSI(price,q,r,s,u) - el índice de fortaleza verdadera

El código del indicador TSI (price,q,r,s,u) (se construye a partir de los cambios y adiciones al código de "Blau_Mtm.mq5"):

//+------------------------------------------------------------------+
//|                                                     Blau_TSI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "True Strength Index (William Blau)"      // description
#include <WilliamBlau.mqh>               // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window      // indicator in a separate window
#property indicator_buffers 10           // number of buffers used
#property indicator_plots   1            // graphic plots
//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width
//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "TSI"        // label for graphic plot #0
#property indicator_type1   DRAW_LINE    // draw as a line
#property indicator_color1  Blue         // line color
#property indicator_style1  STYLE_SOLID  // line style
#property indicator_width1  1            // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // TSI (graphic plot #0)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period 1st EMA
double DEMA_MtmBuffer[];    // s-period 2nd EMA
double TEMA_MtmBuffer[];    // u-period 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4; // starting index
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"TSI");             // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // draw as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"
//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum
*/
//---
   begin1=q-1;        //                             - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_...[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_...[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - TEMA_...[], MainBuffer[]
   //
   rates_total_min=begin4+1; // rates total min
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous tick
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price buffer
                       );
//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Vamos a considerar en detalle solo las modificaciones y adiciones al código del archivo "Blau_Mtm.mq5".

1.4.2.1. Configuraciones del indicador TSI (price,q,r s,u) (alteraciones y adiciones al código del archivo "Blau_Mtm.mq5")

Ajustes del indicador (en general)

Las configuraciones del indicador TSI(price,q,r,s,u) son distintas a las del indicador Mtm(price,q,r,s,u) (véase la Fig. 18):

  1. Especificar la ventana para la visualización de los indicadores (sin cambio)
  2. Especificar el número de estructuras gráficas (sin cambio)
  3. Especificar el número de buffers del indicador (el número de buffers ha aumentado)
  4. Declaración de las matrices del indicador (añadida a las matrices)
  5. Asignar las matrices/buffer/trazados: la matriz del indicador -> el buffer del indicador -> el trazado gráfico (reestructuración)
  6. Describir las propiedades de cada trazado gráfico (la etiqueta ha sido cambiada)
  7. Especificar la precisión de la visualización de los valores del indicador (precisión cambiada)
  8. Especificar, para cada trazado gráfico, el número de barras iniciales son mostrarlas en el trazado gráfico (sin cambio)
  9. Establecer los niveles horizontales y describir las propiedades de cada nivel horizontal (nuevo)
  10. Establecer los límites para la escala de la ventana del indicador independiente (nuevo)
  11. Especificar el nombre corto del indicador (nombre cambiado)

Fig. 1.8. El indicador del índice de fortaleza verdadera TSI (price,q,r,s,u)

Fig. 1.8. El indicador del índice de fortaleza verdadera TSI (price,q,r,s,u)


Configuraciones (cambios)

En el código de "Blau_Mtm.mq5" se han realizado las siguientes modificaciones:

1. La descripción breve del programa mql5 ha cambiado:

#property description "True Strength Index (William Blau)"      // description

2. (en la configuración 6) El número de trazados gráficos no ha aumentado, el método de dibujo (DRAW_LINE - línea), el color de línea (azul), el estilo de línea (STYLE_SOLID - línea continua) y el grosor de línea (1) permanecen sin cambios pero la etiqueta para el trazado gráfico #0 ha cambiado:

#property indicator_label1  "TSI"        // label for graphic plot #0

3. (en la configuración 7) la precisión en pantalla de los valores del indicador ha cambiado:

   IndicatorSetInteger(INDICATOR_DIGITS,2);

4. (en la configuración 11) el nombre abreviado del indicador ha cambiado:

   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
Configuraciones: niveles horizontales (9)

Para configurar los niveles horizontales debe especificarse para cada nivel lo siguiente:

  1. El valor en el eje vertical;
  2. La descripción del nivel (opcional). Las capas horizontales tienen un solo estilo de representación:
    1. EL color con el que se muestra la línea; 
    2. El estilo de línea (véanse los posible estilos enumerados en ENUM_LINE_STYLE);
    3. El grosor de la línea.

Hay dos tipos de configuraciones posibles:

1) Usar la directiva del preprocesador #property (implementado de esta forma).

//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width

2) Usar el grupo de funciones de IndicatorSet *():

//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"

El código se escribe en la función Oninit() del controlador de evento Init. La indexación de los niveles horizontales comienza por 0. Para mejorar la representación en pantalla del nivel horizontal, se usan los identificadores de las propiedades del índice de INDICATOR_LEVEL que se incluyen en la enumeración ENUM_CUSTOMIND_PROPERTY.

La descripción de cada nivel solo se establece usando la función IndicatorSetString() y el identificador de la propiedad del indicador NDICATOR_LEVELTEXT (enumeración ENUM_CUSTOMIND_PROPERTY_STRING). La descripción del nivel se sitúa directamente sobre el nivel, a la izquierda. 

Podemos añadir/eliminar niveles horizontales, cambiar los valores, la descripción de cada nivel y el estilo de representación del nivel en la ventana "Propiedades" (la pestaña "Niveles") del indicador.

Configuraciones: límites de la escala de la ventana del indicador independiente (10)

Hay dos tipos de configuraciones posibles:

1) Usar la directiva del preprocesador #property (implementado de esta forma).

//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum

2) Usar la función IndicatorSetDouble(), los identificadores de las propiedades de los indicadores INDICATOR_MINIMUM e INDICATOR_MAXIMUM  (enumeración ENUM_CUSTOMIND_PROPERTY_DOUBLE).

//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum

El código se escribe en la función Oninit() del controlador de evento Init. Los límites inferiores y superiores de la escala de una ventana de indicador independiente pueden cambiarse en la ventana "Propiedades" (pestaña "Escala") del indicador.

Configuraciones (cambios): los buffers del indicador (3-5)

Los cambios en la configuración "matriz del indicador -> buffer del indicador -> trazado gráfico":

1. (en la configuración 3) Se incrementó el número de buffers:

#property indicator_buffers 10           // the number of buffers for the calculation of the indicator

2. (en la configuración 4) Se han añadido matrices del indicador necesarias para calcular el valor absoluto de la dinámica del periodo q:

double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)

la finalidad de la matriz MainBuffer[] ha cambiado:

double MainBuffer[];        // TSI (graphic plot #0)
double TEMA_MtmBuffer[];    // u-period 3rd EMA

3. (en la configuración 5) La conexión "matriz del indicador -> buffer del indicador -> trazado gráfico" ha cambiado:

   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)


1.4.2.2. Cálculo del indicador TSI (price,q,r,s,u) (modificaciones y adiciones al código de "Blau_Mtm.mq5")

Cálculo: el algoritmo

El algoritmo para el cálculo del indicador TSI (price,q,r,s,u):

  1. Verifique si hay suficientes datos para calcular el indicador.
  2. Cálculo de la matriz de precios de acuerdo con el tipo de precio especificado - formación de la matriz PriceBuffer[].
  3. La determinación de la barra del índice de la que se inicia/continúa el cálculo de la dinámica del periodo q.
  4. Cálculo de la dinámica del periodo q y su valor absoluto - rellenar las matrices MtmBuffer[] y AbsMtmBuffer[].
  5. El primer ajuste por el método EMA (periodo r) - rellenar las matrices EMA_MtmBuffer[] y EMA_AbsMtmBuffer[].
  6. El segundo ajuste por el método EMA (periodo s) - rellenar las matrices DEMA_MtmBuffer[] y DEMA_AbsMtmBuffer[].
  7. El tercer ajuste por el método EMA (periodo u) - rellenar las matrices TEMA_MtmBuffer[] y TEMA_AbsMtmBuffer[].
  8. La determinación de la barra del índice a partir de la cual se inicia/continúa el cálculo del índice de fortaleza verdadera.
  9. Cálculo del índice de fortaleza verdadera - rellenar la matriz MainBuffer[] - cálculo de los valores para el trazado gráfico #0.

La esencia de los cambios en el algoritmo (brevemente):

  • a) (ver párrafo 4-7) al mismo tiempo que se realiza el cálculo de la dinámica del periodo q (grupo de matrices * MtmtBuffer[]) se lleva a cabo el cálculo de los valores absolutos de la dinámica del periodo q (grupo de matrices *AbsMtmBuffer[]);
  • b) (ver apartado 8-9) se añade el cálculo de TSI.
Cálculo: la dinámica del periodo q y su valor absoluto (3-7)
//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);

Cálculo: el índice de fortaleza verdadera (8-9)

//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }

1.4.3. "Blau_Ergodic.mq5" - Ergódico (price,q,r,s,u,ul) - Oscilador ergódico

El código del indicador ergódico (price,q,r,s,u,ul) se basa en los cambios realizados al código de "Blau_TSI.mq5":

//+------------------------------------------------------------------+
//|                                                 Blau_Ergodic.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "Ergodic Oscillator (William Blau)"       // description
#include <WilliamBlau.mqh>                 // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window        // indicator in a separate window
#property indicator_buffers 11             // number of buffers
#property indicator_plots   2              // indicator plots
//--- horizontal levels
#property indicator_level1 -25             // level #0
#property indicator_level2 25              // level #1
#property indicator_levelcolor Silver      // level color
#property indicator_levelstyle STYLE_DOT   // level style
#property indicator_levelwidth 1           // level width
//--- min/max
#property indicator_minimum -100           // minimum
#property indicator_maximum 100            // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width
//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input int    ul=3; // ul- period of a Signal Line
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // Ergodic (graphic plot #0)
double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period of the 1st EMA
double DEMA_MtmBuffer[];    // s-period of the 2nd EMA
double TEMA_MtmBuffer[];    // u-period of the 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period of the 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period of the 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period of the 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4, begin5; // starting indexes
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Ergodic");           // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); // draw as a histogram
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Silver);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);             // line width
//--- graphic plot #1 (Signal Line)
   PlotIndexSetString(1,PLOT_LABEL,"Signal");            // label of graphic plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);      // draw as a line
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,Red);           // line color
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,1);             // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of indicator levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level #0 "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level #1 "Overbought"
//--- min/max values
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // min
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // max
*/
//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- rates total
   if(rates_total<rates_total_min) return(0);
//--- calculation of PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price array
                       );
//--- calculation of mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period of the 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period of 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- calculation of Ergodic (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // starting from begin4
      for(i=0;i<pos;i++)       // pos
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Vamos a ver en profundidad solo las modificaciones y adiciones al código de "Blau_TSI.mq5".

1.4.3.1. Configuraciones del indicador ergódico (price,q,r,s,u,ul) (modificaciones y adiciones al código de "Blau_TSI.mq5")

Ajustes del indicador (en general)

Las configuraciones del indicador ergódico (price,q,r,s,u,ul) son distintas a las del indicador TSI (price,q,r,s,u) (véase Fig. 1.9):

  1. Especificar la ventana para mostrar los indicadores (sin cambio)
  2. Especificar el número de trazados gráficos (se añade un trazado gráfico)
  3. Especificar el número de buffers del indicador (el número de buffers ha aumentado)
  4. Declaración de las matrices del indicador (añadido a la matriz)
  5. Establecer una relación: la matriz del indicador -> buffer del indicador -> trazado gráfico (reestructurar)
  6. Describir las propiedades de cada trazado gráfico (propiedades modificadas, se ha añadido un trazado gráfico)
  7. Especificar la precisión de la visualización de los valores del indicador (sin cambio)
  8. Especificar, para cada estructura gráfica, el número de barras iniciales sin mostrar en el trazado gráfico (se añade un trazado gráfico)
  9. Establecer los niveles horizontales y describir las propiedades de cada nivel horizontal (sin cambio)
  10. Establecer el límite de la escala independiente de la ventana del indicador (sin cambio)
  11. Especificar el nombre corto del indicador (nombre cambiado)

Fig. 1.9. Indicador ergódico (price,q,r,s,u,ul)

Fig. 1.9. Indicador ergódico (price,q,r,s,u,ul)


Configuraciones (cambios)

El código de "Blau_TSI.mq5" ha cambiado como se describe a continuación.

1. La descripción breve del programa mql5 ha cambiado:

#property description "Ergodic Oscillator (William Blau)"       // description

2. Se ha añadido un parámetro de entrada:

input int    ul=3; // ul- period of a Signal Line

3. (en la configuración 11) el cambio se realiza sobre el nombre corto del indicador.

//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
Configuraciones (cambios): trazados gráficos (2,6)

1. (en la configuración 2) Se ha añadido un trazado gráfico más (línea de la señal):

#property indicator_plots   2              // indicator plots

2. (en la configuración 6) a) Han cambiado las propiedades del primer trazado gráfico #0 "ergódico".

Previamente, como una forma de mostrar en pantalla la línea, hemos usado el identificador DRAW_LINE y ahora usamos un histograma de la línea cero (DRAW_HISTOGRAM de la enumeración ENUM_DRAW_TYPE)

Ha cambiado el color y el grosor de las líneas:

//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width

b) Se ha añadido un trazado gráfico #1 "señal" (línea de señal):

//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width
Configuraciones (cambios): los buffers del indicador (3-5)

Los cambios en la configuración "matriz del indicador -> buffer del indicador -> estructura gráfica":

1. (en la configuración 3) Se incrementó el número de buffers:

#property indicator_buffers 11             // number of buffers

2. (en la configuración 4) Se ha añadido una matriz del indicador que es necesaria para calcular y representar los valores de la línea de señal:

double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)

3. (en la configuración 5) La relación "matriz del indicador -> buffer del indicador -> estructura gráfica" ha cambiado:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)
Ajustes: número de barras iniciales sin representación (8)
  • El número de barras iniciales sin representar el trazado gráfico #0 "ergódico" no ha cambiado. El método de cálculo se plantea en el apartado 1.4.1.1.
  • Los métodos para el cálculo del número de barras iniciales sin representar el trazado gráfico #1 "señales" son los mismos. La matriz SignalBuffer[] es el resultado del ajuste de los datos relevantes de la matriz MainBuffer[] (el periodo de ajuste ul).

Como la indexación de la matriz MainBuffer[] comienza en 0 y los datos significativos en la matriz MainBuffer[] comienzan con el índice (q-1)+(r-1)+(s-1)+(u-1), los datos significativos en la matriz SignalBuffer[] comienzan con el índice (q-1)+(r-1)+(s-1)+(u-1)+(ul-1).

Se declara la variable global begin5.

int    begin1, begin2, begin3, begin4, begin5; // starting indexes

Cálculo (al completo en el apartado 1.4.1.1.):

//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);


1.4.3.2. Cálculo del indicador ergódico (price,q,r,s,u,ul) (modificaciones y adiciones al código de "Blau_TSI.mq5")

Cálculo: el algoritmo

El algoritmo para el cálculo del indicador ergódico (price,q,r,s,ul):

  1. Verifique si hay suficientes datos para calcular el indicador.
  2. El cálculo de la matriz de precios de acuerdo con el tipo de precio especificado - rellenar la matriz PriceBuffer[].
  3. La determinación de la barra del índice de la que se inicia/continúa el cálculo de la dinámica del periodo q.
  4. El cálculo de la dinámica del periodo q y su valor absoluto - rellenar las matrices MtmBuffer[] y AbsMtmBuffer[].
  5. El primer ajuste por el método EMA (periodo r) - rellenar las matrices EMA_MtmBuffer[] y EMA_AbsMtmBuffer[].
  6. El segundo ajuste por el método EMA (periodo s) - rellenar las matrices DEMA_MtmBuffer[] y DEMA_AbsMtmBuffer[].
  7. El tercer ajuste por el método EMA (periodo u) - rellenar las matrices TEMA_MtmBuffer[] y TEMA_AbsMtmBuffer[].
  8. La determinación de la barra del índice a partir del cual se inicia/continúa el cálculo del índice de fortaleza verdadera.
  9. El cálculo del ergódico (índice de fortaleza verdadera) - rellenar la matriz MainBuffer[] - cálculo de los valores para la representación del trazado gráfico #0.
  10. Cálculo de la línea de señal - ajuste del ergódico por el método EMA (periodo ul) - rellenar la matriz SignalBuffer[] - cálculo de los valores para la representación del trazado gráfico #1.

Lo esencial de los cambios en el algoritmo (brevemente) a) (véase apartado 1) el requisito para el tamaño mínimo para las series de tiempo de entrada del indicador ha cambiado; b) (véase el párrafo 10) el cálculo de la línea de señal ha cambiado.

Cálculo (cambio): verifique si hay suficientes datos para calcular el indicador (1)

No hay cambios en el algoritmo:

//--- rates total
   if(rates_total<rates_total_min) return(0);

Los valores de la variable global rates_total_min han cambiado (el tamaño mínimo de las series de tiempo de entrada del indicador calculados en la función OnInit() en el evento Initialization):

   rates_total_min=begin5+1; // the minimum size of the input timeseries of the indicator
Cálculo: línea de señal (10)
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);

2. Dinámica estocástica

Los indicadores considerados (véase el adjunto) se dividen en dos grupos.

I. Indicadores basados en el estocástico (estocástico del periodo q; estocástico del periodo q ajustado);

  1. Blau_TStoch.mq5 - estocástico (estocástico del periodo q; estocástico del periodo q ajustado);
  2. Blau_TStochI.mq5 - índice estocástico del periodo q ajustado y normalizado);
  3. Blau_TS_Stochastic.mq5 - oscilador TS estocástico (basado en el índice del estocástico).

II. Indicadores basados en la dinámica estocástica:

  1. Blau_SM.mq5 - dinámica estocástica (dinámica estocástica del periodo q; dinámica estocástica del periodo q ajustada);
  2. Blau_SMI.mq5 - índice de la dinámica estocástica (dinámica del periodo q ajustada y normalizada);
  3. Blau_SM_Stochastic.mq5 - oscilador SM estocástico (basado en el índice de la dinámica estocástica).


2.1. Indicadores basados en el estocástico

La "Guía del usuario del terminal de cliente de MetaTrader" proporciona en el apartado "Análisis/Indicadores técnicos/Osciladores/Osciladores estocásticos" una descripción del oscilador estocástico de los indicadores del terminal de cliente de MetaTrader 5 y las distintas formas de uso en el análisis técnico (véase también iStochastic.)

 

2.1.1. Oscilador estocástico de George Lane

Estocástico, oscilador estocástico (Estocástico, oscilador estocástico) - es un indicador que muestra el precio respecto a las fluctuaciones en los precios para periodos q previos. El autor y divulgador del indicador es George Lane.

Distinguir:

  • Estocástico rápido, algunas veces llamado %K;
  • Estocástico lento (línea de señal), algunas veces llamado %D.

La fórmula del estocástico de George Lane:

           price - LL(q)
%K = 100 * -------------
           HH(q) - LL(q)
%D = SMA(%k, ul)

donde:

  • % K - Estocástico rápido;
  • % D - Estocástico lento (línea de señal);
  • price - precio [cierre] del periodo actual;
  • q - el número de períodos de tiempo del gráfico de precio usado en el cálculo del estocástico;
  • HH (q) - el valor máximo para los periodos q previos de los precios más altos para el periodo q;
  • LL (q) - el valor mínimo para los periodos q previos del precio menor para el periodo q;
  • SMA (%K, ul) - la media móvil simple de orden ul aplicada al estocástico rápido (% K).

Según la interpretación de George Lane, la idea básica es que durante la tendencia alcista de un precio (tendencia al alza) el precio tiende a pararse en valores próximos a máximos anteriores. Con la tendencia del precio a bajar (tendencia a la baja) el precio tiende a pararse en valores próximos a los mínimos anteriores.

 

2.1.2. Oscilador estocástico de William Blau


Fig. 2.1. Indicadores de William Blau basados en el estocástico

Fig. 2.1. Indicadores de William Blau basados en el estocástico

 

2.1.2.1. Estocástico


Estocástico - es la distancia del precio (de cierre) del periodo actual al punto más bajo del rango de fluctuaciones del precio para los periodos q previos. El valor del estocástico del periodo q muestra cuándo ha cambiado el precio con relación al punto más bajo del rango de fluctuaciones de precio del periodo q. Los valores del estocástico del periodo q son positivos o iguales a cero.

Fig. 2.2. Definición del estocástico

Fig. 2.2. Definición del estocástico

Fórmula del estocástico del periodo q:

stoch(price,q) = price - LL(q)

donde:

  • price - precio [cierre] del periodo actual;
  • q - número de periodos de tiempo del gráfico de precio involucrados en el cálculo del estocástico;
  • LL (q) - el valor mínimo, para los periodos q previos, del menor precio para el periodo q.

Fórmula del estocástico del periodo q ajustado:

TStoch(price,q,r,s,u) = EMA(EMA(EMA( stoch(price,q) ,r),s),u)

donde:

  • price - precio de cierre, el precio base del gráfico de precio;
  • q - número de barras, usadas en el cálculo del estocástico;
  • stoch(price,q)=price-LL(q) - estocástico del periodo q;
  • EMA (stoch (price,q),r) - primer ajuste - EMA del periodo r aplicado al estocástico del periodo q;
  • EMA (EMA(..., r),s) - segundo ajuste - EMA del periodo aplicado al resultado del primer ajuste;
  • EMA (EMA (EMA (..., r), s), u) - tercer ajuste - EMA del periodo u, aplicado al resultado del segundo ajuste.

TStoch(price,q,r,s,u) - Estocástico. Especificación

  • Nombre de archivo: Blau_TStoch.mq5
  • Nombre: Indicador estocástico (estocástico del periodo q; estocástico del periodo q ajustado), según William Blau.
  • Parámetros de entrada:
    • q - periodo para el que se calcula el estocástico (por defecto q = 5);
    • r - periodo de la primera EMA aplicada al estocástico (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambios de representación del trazado gráfico: color, espesor, tipo de línea (la pestaña "Colores").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se usa el ajuste EMA;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u-3 +1).

 

2.1.2.2. El índice estocástico

El indicador del índice estocástico es el estocástico del periodo q ajustado y normalizado.

Los valores del estocástico del periodo q ajustado se mapean a un formato de porcentaje (el intervalo [0, 100]. Cada valor del estocástico del periodo q se normaliza por el valor del rango de precio del periodo q. La normalización permite interpretar el valor del estocástico del periodo q ajustado y normalizado como el grado de sobrecompra/sobreventa del mercado.

La fórmula del índice estocástico:

                         100 * EMA(EMA(EMA( price-LL(q) ,r),s),u)       100 * TStoch(price,q,r,s,u)
TStochI(price,q,r,s,u) = ---------------------------------------- = ----------------------------------
                            EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)      EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then TStochI(price,q,r,s,u)=0

donde:

  • price - precio de cierre, el precio base del gráfico de precio;
  • q - número de barras, usadas en el cálculo del estocástico;
  • LL (q) - el mínimo valor del precio más bajo para el periodo q;
  • HH (q) - el máximo valor para el precio más alto para el periodo q;
  • stoch(q)=price-LL(q) - estocástico del periodo q;
  • TStoch(price,q,r,s,u) - estocástico del periodo q ajustado tres veces;
  • HH(q)-LL(q) - rango de precio del periodo q;
  • EMA (..., r) - primer ajuste - EMA(r) aplicado a:
    1. el estocástico del periodo q;
    2. el rango de precio del periodo q;
  • EMA (EMA(..., r),s) - el segundo ajuste, EMA(s) aplicada al resultado del primer ajuste;
  • EMA (EMA (EMA (..., r), s), u) - el tercer ajuste, EMA(u) aplicada al resultado del segundo ajuste.

TStochI(price,q,r,s,u) - índice estocástico. Especificación

  • Nombre de archivo: Blau_TStochI.mq5
  • Nombre: Índice estocástico (estocástico del periodo q ajustado y normalizado) según William Blau.
  • Parámetros de entrada:
    • q - periodo para el que se calcula el estocástico (por defecto q = 5);
    • r - periodo de la primera EMA aplicada al estocástico (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación del trazado gráfico - el color, grosor, estilo de línea (la pestaña "Colores");
    • (opcional) dos niveles (por defecto 40 y 60) - añadir/eliminar un nivel, cambia el valor y descripción del nivel, cambia el estilo de representación de los niveles (la pestaña "Niveles");
    • cambiar los límites inferior (por defecto 0) y superior (por defecto 100) de la escala de la ventana independiente del indicador (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se realizará el ajuste en el periodo correspondiente de EMA;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u-3 +1).

 

2.1.2.3. Oscilador estocástico


Definición del oscilador estocástico:

TS_Stochastic(price,q,r,s,u) = TStochI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( TS_Stochastic(price,q,r,s,u) ,ul)

donde:

  • TS_Stochastic() - Estocástico rápido, %k - Índice estocástico TStochI(price,q,r,s,u);
  • SignalLine() - Estocástico lento (línea de señal),% d - EMA del periodo ul aplicado al estocástico rápido (% k);
  • ul - línea de señal EMA del periodo - según William Blau, el valor de ul debe ser igual al periodo del último valor estocástico rápido EMA significativo (> 1).

TS_Stochastic(price,q,r,s,u,ul) - Oscilador estocástico. Especificación

  • Nombre de archivo: Blau_TS_Stochastic.mq5
  • Nombre: Oscilador estocástico (basado en el índice estocástico) según William Blau.
  • Parámetros de entrada:
    • trazado gráfico #0 - estocástico rápido (índice estocástico), % k:
      • q - periodo para el que se calcula el estocástico (por defecto q = 5);
      • r - periodo del primer EMA aplicado al estocástico (por defecto r = 20);
      • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
      • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • trazado gráfico #1 - estocástico lento (línea de señal), % d:
      • ul - línea de señal EMA del periodo aplicado al estocástico rápido (por defecto ul = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación de cada trazado gráfico - el color, grosor, estilo de línea (la pestaña "colores");
    • dos niveles (por defecto 40 y 60) - añadir/eliminar un nivel, cambia el valor y descripción del nivel, cambia el estilo de representación de los niveles (pestaña "Niveles");
    • cambiar los límites inferior (por defecto 0) y superior (por defecto 100) de la escala de la ventana independiente del indicador (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se usa el ajuste EMA;
    • ul>0. Si ul = 1 entonces el estocástico lento (línea de señal) y el estocástico rápido son los mismos;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u + ul-4 +1).

 

2.1.2.4. Continuidad


El oscilador estocástico de William Blau incluye el oscilador estocástico de George Lane. Para que el TS_Stochastic (William Blau) se corresponda con el oscilador estocástico estándar (George Lane) implementado en MetaTrader 5 debe especificarse lo siguiente:

TS_Stochastic( price=Close, q=KPeriod, r=1, s=1, u=1, ul=DPeriod )
Stochastic( KPeriod=q, DPeriod=ul, Slowing=1, price="Low/High", method="Exponential" )

Fig. 2.3. El oscilador estocástico de William Blau incluye el oscilador estocástico de George Lane.

Fig. 2.3. El oscilador estocástico de William Blau incluye el oscilador estocástico de George Lane.

 

2.1.2.5. El código del oscilador estocástico


En el ejemplo del indicador TS_Stochastic (price,q,r,s,u,ul):

1) La relación entre las matrices del indicador, los buffers del indicador y los trazados gráficos:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // fast Stochastic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // slow Stochastic: ul-period EMA of the fast Stochastic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);         // min value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);         // max value (q bars)
   SetIndexBuffer(5,StochBuffer,INDICATOR_CALCULATIONS);      // q-period Stochastic
   SetIndexBuffer(6,EMA_StochBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_StochBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_StochBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA
   SetIndexBuffer(9,HHLLBuffer,INDICATOR_CALCULATIONS);       // q-period price range
   SetIndexBuffer(10,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (price range)
   SetIndexBuffer(11,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (price range)
   SetIndexBuffer(12,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (price range)

2) El algoritmo de cálculo para el estocástico del periodo q y para el rango de precio del periodo q:

   // calculation of StochBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // LLBuffer[] - search for the minimal price (q bars)
      // HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // StochBuffer[] - q-period Stochastic
      StochBuffer[i]=PriceBuffer[i]-LLBuffer[i];
      // HHLLBuffer[] - q-period price range
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }


2.2. Indicadores basados en la dinámica estocástica

Fig. 2.4. Indicadores de William Blau basados en la dinámica estocástica

Fig. 2.4. Indicadores de William Blau basados en la dinámica estocástica

 

2.2.1. Dinámica estocástica

La dinámica estocástica (dinámica estocástica, SM) - es la distancia entre el precio del periodo actual y el punto medio del rango de precio sobre los periodos q previos. El valor de la dinámica estocástica del periodo q muestra la posición del precio en el rango de precio.

El signo de la dinámica estocástica del periodo q muestra la posición del precio con relación al punto medio del rango de precio del periodo q: una dinámica estocástica positiva indica que el precio se encuentra por encima del punto medio, mientras que una negativa indica que el precio está por debajo del punto medio.

Fig. 2.5. Definición de la dinámica estocástica

Fig. 2.5. Definición de la dinámica estocástica

Fórmula de la dinámica estocástica del periodo q:

sm(price,q) = price - 1/2 * [LL(q) + HH(q)]

donde:

  • price - precio [cierre] del periodo actual;
  • q - el número de barras usado en el cálculo de la dinámica estocástica;
  • LL (q) - el mínimo valor del precio más bajo para el periodo q;
  • HH (q) - el valor máximo de los precios más altos para el periodo q;
  • 1/2* [LL(q)+HH (q)] - el punto medio del rango de precios del periodo q.

Fórmula de la dinámica estocástica del periodo q ajustada:

SM(price,q,r,s,u) = EMA(EMA(EMA( sm(price,q) ,r),s),u)

donde:

  • price - precio de cierre, el precio base del gráfico de precio;
  • q - número de barras usadas en el cálculo de la dinámica estocástica;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - la dinámica estocástica del periodo q;
  • EMA (sm(price,q),r) - primer ajuste - EMA(r) aplicado a la dinámica estocástica del periodo q;
  • EMA (EMA(..., r),s) - el segundo ajuste, EMA(s) aplicada al resultado del primer ajuste;
  • EMA(EMA(EMA(sm(q),r),s),u) - el segundo ajuste - EMA(u) aplicada al resultado del segundo ajuste.


2.2.1.2. SM(price,q,r,s,u) - dinámica estocástica. Especificación

  • Nombre de archivo: Blau_SM.mq5
  • Nombre: Indicador de la dinámica estocástica (dinámica estocástica del periodo q, dinámica estocástica del periodo q ajustada), según William Blau.
  • Parámetros de entrada:
    • q - el periodo por el que se calcula la dinámica estocástica (por defecto q = 5);
    • r - periodo de la primera EMA aplicada a la dinámica estocástica (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambios de representación del trazado gráfico: color, espesor, tipo de línea (la pestaña "Colores").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se usa el ajuste EMA;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u-3 +1).

 

2.2.2. El índice de la dinámica estocástica

El índice de la dinámica estocástica (SMI) - es un indicador de un ratio estocástico normalizado (dinámica estocástica del periodo q ajustada y normalizada). Los valores de la dinámica estocástica ajustada del periodo q se dan en formato porcentual (intervalo mostrado [-100, 100]).

Cada valor de la dinámica estocástica del periodo q ajustada se normaliza por un valor igual a la mitad del rango del periodo q de las fluctuaciones del precio. La normalización permite la interpretación del valor de SMI como un grado de sobrecompra (valor positivo) o sobreventa (valor negativo) del mercado.

Fórmula del índice de la dinámica estocástica:

                     100 * EMA(EMA(EMA( price-1/2*[LL(q)+HH(q)] ,r),s),u)           100 * SM(price,q,r,s,u)
SMI(price,q,r,s,u) = ---------------------------------------------------- = ----------------------------------------
                           EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)         EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)
if EMA(EMA(EMA(1/2*[HH(q)-LL(q)],r),s),u)=0, then SMI(price,q,r,s,u)=0

donde:

  • price - precio de cierre, el precio base del gráfico de precio;
  • LL (q) - el mínimo valor del precio más bajo para el periodo q;
  • HH (q) - el valor máximo de los precios más altos para el periodo q;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - la dinámica estocástica del periodo q;
  • SM(price,q,r,s,u) - tres veces la dinámica estocástica del periodo q ajustada;
  • HH(q)-LL(q) - rango de precio del periodo q;
  • 1/2* [LL(q)+HH (q)] - el punto medio del rango de precios del periodo q;
  • 1/2*[HH(q)-LL(q)] - la mitad del periodo q del rango de precio;
  • EMA (..., r) - primer ajuste - EMA(r) aplicado a:
    1) la dinámica estocástica del periodo r
    2) la mitad del rango de precio del periodo q;
  • EMA (EMA(..., r),s) - el segundo ajuste, EMA(s) aplicada al resultado del primer ajuste;
  • EMA (EMA (EMA (..., r), s), u) - el tercer ajuste, EMA(u) aplicada al resultado del segundo ajuste.


2.2.2.2. SMI(price,q,r,s,u) - Índice de la dinámica estocástica. Especificación

  • Nombre de archivo: Blau_SMI.mq5
  • Nombre: Índice de la dinámica estocástica (dinámica estocástica del periodo q ajustada y normalizada) según William Blau.
  • Parámetros de entrada:
    • q - el periodo por el que se calcula la dinámica estocástica (por defecto q = 5);
    • r - periodo de la primera EMA aplicada a la dinámica estocástica (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación del trazado gráfico - el color, el espesor, el estilo de línea (la pestaña "Colores");
    • (opcional) dos niveles (por defecto -40 y +40) - añadir/eliminar un nivel, cambia el valor y descripción del nivel, cambia el estilo de representación de los niveles (la pestaña "Niveles");
    • cambia los límites inferiores (por defecto -100) y superiores (por defecto +100) de la escala de la ventana del indicador único (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se realizará el ajuste en el periodo correspondiente de EMA;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u-3 +1).

 

2.2.3. El oscilador estocástico

Definición del oscilador estocástico:
SM_Stochastic(price,q,r,s,u) = SMI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( SM_Stochastic(price,q,r,s,u) ,ul)

donde:

  • SM_Stochastic() - Índice de la dinámica estocástica SMI(price,q,r,s,u).
  • SignalLine() - línea de señal - EMA del periodo ul aplicado al índice de la dinámica estocástica;
  • ul - línea de señal EMA del periodo - según William Blau, el valor de ul debe ser igual al periodo del último valor índice EMA significativo (> 1) del rango estocástico.


2.2.3.1. SM_Stochastic(price,q,r,s,u,ul) - Oscilador estocástico. Especificación

  • Nombre de archivo: Blau_SM_Stochastic.mq5
  • El nombre: Oscilador estocástico (basado en la dinámica estocástica) según William Blau.
  • Parámetros de entrada:
    • trazado gráfico #0 - el índice de la dinámica estocástica:
      • q - el periodo por el que se calcula la dinámica estocástica (por defecto q = 5);
      • r - periodo de la primera EMA aplicada a la dinámica estocástica (por defecto r = 20);
      • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
      • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • graphic plot #1 - la línea de señal:
      • ul - línea de señal EMA del periodo con relación al índice del ratio estocástico (por defecto ul = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación de cada trazado gráfico - el color, grosor, estilo de línea (la pestaña "colores");
    • dos niveles (por defecto -40 y +40) - añadir/eliminar un nivel, cambiar el valor, descripción del nivel, cambiar el estilo de representación de los niveles (la pestaña "Niveles");
    • cambia los límites inferiores (por defecto -100) y superiores (por defecto +100) de la escala de la ventana del indicador único (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se realizará el ajuste en el periodo correspondiente de EMA;
    • ul>0. Si ul = 1 entonces la línea de señal coincide con el índice del ratio estocástico;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u + ul-4 +1).

 

2.2.4. El código del oscilador estocástico

SM_Stochastic (price, q, r, s, u, ul):

1) La relación entre las matrices del indicador, los buffers del indicador y los trazados gráficos:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                   // Stochastic Momentum Index
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                 // Signal Line: ul-period EMA of Stochastic Momentum Index
   // buffers for intermediate calculations (not used for plotting)
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);          // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);             // minimal price value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);             // maximal price value (q bars)
   SetIndexBuffer(5,SMBuffer,INDICATOR_CALCULATIONS);             // q-period Stochastic Momentum
   SetIndexBuffer(6,EMA_SMBuffer,INDICATOR_CALCULATIONS);         // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_SMBuffer,INDICATOR_CALCULATIONS);        // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_SMBuffer,INDICATOR_CALCULATIONS);        // u-period of the 3rd EMA
   SetIndexBuffer(9,HalfHHLLBuffer,INDICATOR_CALCULATIONS);       // half of price range (q bars)
   SetIndexBuffer(10,EMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (half of price range)
   SetIndexBuffer(11,DEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (half of price range)
   SetIndexBuffer(12,TEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (half of price range)

2) El algoritmo de cálculo de la dinámica estocástica del periodo q y la mitad del rango de precio del periodo q:

//--- calculation of q-period Stochastic Momentum and half of price range (q bars)
   if(prev_calculated==0)       // at first call
     {
      pos=begin1;               // starting from 0
      for(i=0;i<pos;i++)        // pos values
        {
         SMBuffer[i]=0.0;       // zero values
         HalfHHLLBuffer[i]=0.0; //
         LLBuffer[i]=0.0;       //
         HHBuffer[i]=0.0;       //
        }
     }
   else pos=prev_calculated-1;  // overwise calculate only last value
   // calculation of SMBuffer[], HalfHHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // calculation of LLBuffer[] - search for the minimal price (q bars)
      // calculation of HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // calculation of SMBuffer[] - q-period Stochastic Momentum
      SMBuffer[i]=PriceBuffer[i]-0.5*(LLBuffer[i]+HHBuffer[i]);
      // calculation of HalfHHLLBuffer[] - half of price range (q bars)
      HalfHHLLBuffer[i]=0.5*(HHBuffer[i]-LLBuffer[i]);
     }

3. El indicador de la desviación de la tendencia

Los indicadores considerados (véase el adjunto) se dividen en dos grupos.

Indicadores basados en una desviación de la tendencia del mercado.

  1. Blau_MDI.mq5- Un indicador de una desviación media de la tendencia (desviación media, desviación de la media móvil);
  2. Blau_Ergodic_MDI.mq5- oscilador ergódico MDI (basado en la desviación media).

II. Indicadores basados en la convergencia/divergencia de las medias móviles.

  1. Blau_MACD.mq5- convergencia/divergencia de las medias móviles (MACD; MACD ajustada);
  2. Blau_Ergodic_MACD.mq5- Oscilador MACD ergódico (basado en el indicador MACD).


3.1. Indicadores basados en una desviación de las tendencias del mercado

Fig. 3.1. Indicadores de William Blau están basados en una desviación de las tendencias del mercado.

Fig. 3.1. Los indicadores de William Blau están basados en una desviación de las tendencias del mercado.

 

3.1.1. El indicador de la desviación media

La desviación media de la tendencia es la distancia entre el precio y EMA (media móvil ajustada exponencialmente) del periodo r aplicado al precio.

Tendencia del desarrollo del mercado: EMA (r) aplicado al precio se usa para determinar la tendencia al alza (aumento exponencial) o tendencia a la baja (disminución exponencial) de los precios.

La media móvil suaviza la curva de precio pero un ligero incremento del periodo de la media móvil produce un retraso que es claramente visible en los puntos de inversión del precio (véase adicionalmente 1.1.1., Fig. 1.2.). El valor de la desviación media de la tendencia muestra la distancia a EMA (r) aplicado al precio.

El signo de la desviación media de la tendencia muestra la posición del precio con relación a EMA(r) aplicado al precio. Para una desviación positiva de la tendencia el precio es mayor que el exponente y para una desviación negativa el precio es menor que el exponente.


La fórmula para la desviación media de la tendencia:

md(price,r) = price - EMA(price,r)

donde:

  • price - precio del periodo actual;
  • EMA (price,r) - la tendencia del mercado - EMA del periodo r aplicado al precio..

Véase la "Guía del usuario para el terminal de cliente de MetaTrader" en el apartado "Analítica/Indicadores técnicos/Indicadores de tendencia":

  1. Media móvil exponencial doble, MMED;
  2. Media móvil exponencial triple, MMET;

Un índice similar es usado por Alexander Elder en sus indicadores Bears Power y Bulls Power. Véase la "Guía del usuario para el terminal de cliente de MetaTrader" en el apartado "Análisis/Indicadores técnicos/Osciladores":

  1. Bears Power;
  2. Bulls Power.

El indicador de la desviación media de la tendencia (Índice de la desviación media, MDI) - es una desviación media ajustada de la tendencia del mercado.

La fórmula para el indicador de la desviación media de la tendencia:

MDI(price,r,s,u) = EMA(EMA( md(price,r) ,s),u) = EMA(EMA( price-EMA(price,r) ,s),u)

donde:

  • price - precio de cierre, el precio base del gráfico de precio;
  • EMA (price, r) - la tendencia del mercado - el primer ajuste de EMA(r) aplicado al precio;
  • md (price,r) = price-EMA (price,r) - la desviación media de la tendencia - la desviación del precio de EMA(r) aplicado al precio;
  • EMA (md (price, r), s) - el segundo ajuste - EMA(s) aplicado a la desviación media de la tendencia;
  • EMA (EMA (md(price,r),s),u) - el tercer ajuste - EMA(u) aplicado al resultado del segundo ajuste.


3.1.1.3. MDI(price,r,s,u) - Índice de la desviación media. Especificación

  • Nombre de archivo: Blau_MDI.mq5
  • Nombre: El indicador de la desviación media del mercado (desviación media; una desviación media ajustada) según William Blau.
  • Parámetros de entrada:
    • r - periodo de la primera EMA aplicado al precio (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada a la desviación media (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambios de representación del trazado gráfico: color, espesor, tipo de línea (la pestaña "Colores").
  • Limitaciones:
    • r>1;
    • s>0, u>0. Si s o u son iguales a 1, no se utiliza el ajuste EMA.
    • el tamaño mínimo de la matriz de precios = (r+s+u-3+1).

 

3.1.2. Oscilador MDI ergódico

Definición del oscilador MDI ergódico
Ergodic_MDI(price,r,s,u) = MDI(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MDI(price,r,s,u) ,ul)

donde:

  • Ergodic_MDI() - Ergódico - Índice de la desviación media MDI(price,r,s,u);
  • SignalLine() - una señal de línea- EMA del periodo ul aplicado al ergódico;
  • ul - un periodo EMA de una línea de señal - según William Blau, el valor ul debe ser igual al periodo del último valor significativo (>1) del ergódico EMA.


3.1.2.2. Ergodic_MDI(price,r,s,u,ul) - Oscilador MDI ergódico. Especificación

  • Nombre de archivo: Blau_Ergodic_MDI.mq5
  • Nombre: El oscilador MDI ergódico (basado en el índice de la desviación media) según William Blau.
  • Parámetros de entrada:
    • trazado gráfico #0 - ergódico (el indicador de la desviación media de la tendencia):
      • r - periodo de la primera EMA aplicado al precio (por defecto r = 20);
      • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
      • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • trazado gráfico #1 - la línea de señal:
      • ul - línea de señal del periodo EMA aplicada al ergódico (por defecto ul = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación de cada estructura gráfica - color, espesor, tipo de línea (la pestaña "Colores").
  • Limitaciones:
    • r>1;
    • s>0, u>0. Si s o u son iguales a 1, no se utiliza el ajuste EMA.
    • ul>0. Si ul = 1 la línea de señal y las líneas ergódicas son las mismas;
    • el tamaño mínimo de la matriz de precios = (r+s+u+ul-4+1).

 

3.1.3. El código del oscilador ergódico

Como ejemplo, vamos a considerar el indicador Ergodic_MDI (price,r,s,u,ul):

1) La relación entre las matrices del indicador, los buffers del indicador y los trazados gráficos:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations; not used for plotting
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);     // price array
   SetIndexBuffer(3,EMA_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (price)
   SetIndexBuffer(4,MDBuffer,INDICATOR_CALCULATIONS);        // среднее отклонение
   SetIndexBuffer(5,DEMA_MDBuffer,INDICATOR_CALCULATIONS);   // s-period 2nd EMA

2) El algoritmo para el cálculo de la desviación media:

//--- calculation of the mean deviation
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // starting from 0
      for(i=0;i<pos;i++)       // pos data
         MDBuffer[i]=0.0;      // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // r-period 1st EMA: calculation of EMA_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA_PriceBuffer);
   // calculation of MDBuffer[]
   for(i=pos;i<rates_total;i++)
      MDBuffer[i]=PriceBuffer[i]-EMA_PriceBuffer[i];


3.2. Indicadores basados en la convergencia/divergencia de la media móvil:

Fig. 3.2. Los indicadores de William Blau están basados en la convergencia/divergencia de las medias móviles.

Fig. 3.2. Los indicadores de William Blau están basados en la convergencia/divergencia de las medias móviles.

 

3.2.1. El indicador de la convergencia/divergencia de las medias móviles

La convergencia/divergencia de la media móvil (Convergencia/divergencia de la media móvil, MACD) - es la diferencia entre dos medias móviles ajustadas exponencialmente: el EMA(s) rápido, el EMA(r) lento, aplicado al precio.

El signo de MACD muestra la posición del EMA(s) rápido, con relación al EMA(r) lento: si CDMM es positivo EMA(s) está por encima de EMA(r), y si es negativo EMA(s) están por debajo de EMA(r). Cambio de MACDpor el valor absoluto: un incremento en |MACD| indica la discrepancia entre las medias móviles y una disminución de |MACD| indica una convergencia de las medias móviles.

La fórmula de la convergencia/divergencia de la media móvil:

macd(price,r,s) = EMA(price,s) - EMA(price,r)
s < r

donde:

  • price - precio [cierre] del periodo actual;
  • EMA(price,r) - EMA(r) lento aplicado al precio;
  • EMA(price,s) - EMA(s) rápido aplicado al precio.

El indicador MACD muestra la relación entre las medias exponenciales rápida y lenta (convergencia/divergencia ajustada de las medias móviles).

La fórmula del indicador MACD:

MACD(price,r,s,u) = EMA( macd(price,r,s) ,u) = EMA( EMA(price,s)-EMA(price,r) ,u)
s < r

donde:

  • price - precio de cierre, el precio del gráfico de precio;
  • EMA(price,r) - el primer ajuste - el exponencial lento de EMA(r) aplicado al precio;
  • EMA(price,s) - el segundo ajuste - EMA(s) rápido, s, aplicado al precio;
  • macd(r,s)=EMA(price,s)-EMA (price,r) - MACD;
  • EMA(macd (r,s),u) - el tercer ajuste - EMA(u), aplicado a MACD: EMA (price,s) rápido y un EMA (price,r) lento.

3.2.1.1. MACD(price,r,s,u) - el indicador de la convergencia/divergencia de la media móvil. Especificación

  • Nombre de archivo: Blau_MACD.mq5
  • Nombre: El indicador MACD (MACD, MACD ajustado) según William Blau.
  • Parámetros de entrada:
    • r - periodo del primer EMA (lento) aplicado al precio (por defecto r = 20);
    • s - periodo del segundo EMA, aplicado al precio (por defecto s = 5);
    • u - periodo del tercer EMA, aplicado a la convergencia/divergencia de las medias móviles (por defecto, u = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambios de representación del trazado gráfico: color, espesor, tipo de línea (la pestaña "Colores").
  • Limitaciones:
    • r>1, s>1;
    • s <r (límite por los requisitos de la teoría, no es verificado a nivel del programa);
    • u>0. Si u =1 no se realiza el ajuste;
    • el tamaño mínimo de la matriz de precios = ([max(r,s)]+u-2+1).

 

3.2.2. Oscilador MACD ergódico

Definición del oscilador MACD ergódico:
Ergodic_MACD(price,r,s,u) = MACD(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MACD(price,r,s,u) ,ul)

donde:

  • Ergodic_MACD () - ergódico - es un indicador de la convergencia/divergencia de las medias móviles MACD(price,r,s,u);
  • SignalLine() -una línea de señal - EMA(ul) aplicada a la ergódica;
  • ul - un periodo EMA de una línea de señal - según William Blau, el valor ul debe ser igual al periodo del último valor significativo (>1) del ergódico EMA.

La "Guía de usuario del terminal de cliente de Meta Trader", en el apartado "Analítica/Indicadores técnicos/Osciladores/MACD" describe el indicador técnico convergencia/divergencia de las medias móviles (MACD), integrado en el terminal de cliente de MetaTrader 5 y cómo usarlo en el análisis técnico (véase también iMACD.)

A diferencia de la MACD estándar, William Blau utiliza la media móvil ajustada exponencialmente (en la MACD estándar se usa la media móvil simple).

3.2.2.1. Ergodic_MACD(price,r,s,u,ul) - Oscilador MACD ergódico. Especificación

  • Nombre de archivo: Blau_Ergodic_MACD.mq5
  • Nombre: Oscilador MACD ergódico (basado en el indicador de la convergencia/divergencia de las medias móviles) según William Blau.
  • Parámetros de entrada:
    • trazado gráfico #0 - ergódico (la convergencia/divergencia de las medias móviles):
      • r - periodo del primer EMA (lento) aplicado al precio (por defecto r = 20);
      • s - periodo del segundo EMA, aplicado al precio (por defecto s = 5);
      • u - periodo del tercer EMA, aplicado a la convergencia/divergencia de las medias móviles (por defecto, u = 3);
    • graphic plot #1 - la línea de señal:
      • ul - línea de señal del periodo EMA aplicada al ergódico (por defecto ul = 3);
    • AppliedPrice - tipo de precio (por defecto AppliedPrice=PRICE_CLOSE).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación de cada estructura gráfica - color, espesor, tipo de línea (la pestaña "Colores").
  • Limitaciones:
    • r>1, s>1;
    • s <r (límite por los requisitos de la teoría, no es verificado a nivel del programa);
    • u>0. Si u =1 no se realiza el ajuste;
    • ul>0. Si ul = 1 entonces la línea de señal coincide con el ergódico;
    • el tamaño mínimo de la matriz de precios = ([max(r,s)]+u+ul-3+1).

 

3.2.3. El código del oscilador MACD ergódico

Como ejemplo, vamos a considerar el indicador Ergodic_MACD (price,r,s,u,ul):

1) La relación entre las matrices del indicador, los buffers del indicador y los trazados gráficos:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: ul-period EMA, applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,EMA1_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (slow), applied to price
   SetIndexBuffer(4,EMA2_PriceBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (fast), applied to price
   SetIndexBuffer(5,MACDBuffer,INDICATOR_CALCULATIONS);       // moving averages convergence/divergence

2) El algoritmo de la convergencia/divergencia de las medias móviles:

//--- calculation of moving average convergence/divergence
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // 
      for(i=0;i<pos;i++)       // pos
         MACDBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // r-period 1st EMA: calculation of EMA1_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA1_PriceBuffer);
   // s-period 2nd EMA: calculation of EMA2_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,s,PriceBuffer,EMA2_PriceBuffer);
   // calculation of MACDBuffer[]
   for(i=pos;i<rates_total;i++)
      MACDBuffer[i]=EMA2_PriceBuffer[i]-EMA1_PriceBuffer[i];

3.3. Adición

Al calcular el oscilador MDI ergódico y el oscilador MACD, según William Blau, no se usa la normalización (como referencia véanse los apartados 1.2.1 y 1.3.1). Por tanto, el oscilador MDI ergódico y el oscilador MACD no pueden usarse para interpretar el grado de sobrecompra o sobreventa del mercado.

Por ejemplo, las recomendaciones para usar las señales del indicador MACD de la "Guía de usuario del terminal de cliente de MetaTrader 5" del apartado "Analítica/Indicadores técnicos/Osciladores/MACD":

MACD también es útil como indicador de sobrecompra/sobreventa. Cuando la media móvil más corta se aleja drásticamente de la media móvil más larga (es decir, MACD aumenta) es probable que el precio del título valor sea demasiado alto y vuelva pronto a valores más realísticos.

en este caso, de la faceta del análisis técnico.


4. Dinámica de las velas japonesas

Los indicadores considerados (véase el adjunto) se dividen en dos grupos.

  1. Blau_CMtm.mq5- es el indicador de la dinámica de las velas japonesas (dinámica de las velas del periodo q; dinámica de las velas del periodo q ajustada);
  2. Los índices (dinámica de las velas del periodo q ajustada y normalizada):
    • Blau_CMI.mq5- el índice de la dinámica de las velas japonesas (normalización por el valor absoluto de la dinámica de las velas japonesas del periodo q);
    • Blau_CSI.mq5- el índice de las velas japonesas (normalizado por la longitud de las velas japonesas del periodo q);
  3. El oscilador ergódico de las velas japonesas
    • Blau_Ergodic_CMI.mq5- el oscilador CMI ergódico (basado en el índice de la dinámica de las velas japonesas);
    • Blau_Ergodic_CSI.mq5- el oscilador CSI ergódico (basado en el índice de las velas japonesas).

Fig. 4.1. Indicadores de William Blau basados en la dinámica de las velas japonesas (normalizados por el valor absoluto de la dinámica de las velas japonesas del periodo q)

Fig. 4,1. Indicadores de William Blau basados en la dinámica de las velas japonesas (normalizados por el valor absoluto de la dinámica de las velas japonesas del periodo q)

 

Fig. 4,2. Indicadores de William Blau basados en la dinámica de las velas japonesas (normalizados por la longitud absoluto de las velas japonesas del periodo q)

Fig. 4.2. Indicadores de William Blau basados en la dinámica de las velas japonesas (normalizados por la longitud absoluto de las velas japonesas del periodo q)

 

4.1. Dinámica de las velas japonesas

4.1.1. Definición de la dinámica de las velas japonesas

La dinámica (ver apartado 1.1.) es la diferencia entre el precio actual (habitualmente el precio de cierre de hoy) y los precios anteriores (habitualmente el precio de cierre de ayer). La dinámica puede reflejar el cambio de precio en cualquier periodo del gráfico de precio.

La dinámica de las velas japonesas (según William Blau) es la diferencia entre el precio de cierre y el precio de apertura en el mismo periodo (en una vela japonesa). El signo de la dinámica de las velas japonesas muestra la dirección del cambio de precio: una dinámica positiva, el precio se incrementó a lo largo del periodo; una dinámica negativa, el precio ha bajado en el periodo.

Fórmula de la dinámica de las velas japonesas:

cmtm = close - open

donde:

  • close - el precio de cierre de el periodo [actual] de las velas japonesas;
  • open - el precio de apertura de el periodo [actual] de las velas japonesas;

Desde el punto de vista de la universalidad vamos a ampliar la definición de la dinámica de la vela japonesa.

  1. La dinámica de la vela japonesa puede reflejar el cambio de precio en cualquier periodo del gráfico de precio.
  2. La base del precio (el precio de cierre, precio de apertura) puede ser arbitraria.

Fig. 4.3. Definición la vela japonesa del periodo q

Fig. 4.3. Definición la vela japonesa del periodo q


Fórmula de la dinámica de la vela japonesa del periodo q:

cmtm(price1,price2,q) = price1 - price2[q-1]

donde:

  • q - el número de barras del gráfico de precio usado en el cálculo de la dinámica de la vela japonesa;
  • price1 - precio [de cierre] al final del periodo q;
  • price2 - precio [de apertura] al inicio del periodo q;

Fórmula de la dinámica de la vela japonesa del periodo q ajustada:

CMtm(price1,price2,q,r,s,u) = EMA(EMA(EMA( cmtm(price1,price2,q) ,r),s),u)

donde:

  • q - el número de barras del gráfico de precio usado en el cálculo de la dinámica de la vela japonesa del periodo q;
  • price1 - precio [de cierre] al final del periodo q;
  • price2 - precio [de apertura] al inicio del periodo q;
  • cmtm(price1,price2,q)=price1-price2[q-1] - dinámica de la vela japonesa del periodo q;
  • EMA (cmtm (price1, price2, q), r) - el primer ajuste - EMA(r), aplicado a la dinámica de la vela japonesa del periodo q;
  • EMA (EMA(..., r),s) - el segundo ajuste, EMA(s) aplicada al resultado del primer ajuste;
  • EMA (EMA (EMA (..., r), s), u) - el tercer ajuste, EMA(u) aplicada al resultado del segundo ajuste.


4.1.2. CMtm(price1,price2,q,r,s,u) - Indicador de la dinámica de la vela japonesa. Especificación
  • Nombre de archivo: Blau_CMtm.mq5
  • Nombre: El indicador de la dinámica de la vela japonesa (dinámica de la vela japonesa del periodo q ajustada) según William Blau.
  • Parámetros de entrada:
    • q - periodo de la dinámica de la vela japonesa (por defecto q = 1);
    • r - periodo de la primera EMA aplicada a la dinámica de la vela japonesa (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • AppliedPrice - tipo de precio [cierre](por defecto AppliedPrice=PRICE_CLOSE).
    • AppliedPrice - tipo de precio [apertura](por defecto AppliedPrice=PRICE_OPEN).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambios de representación del trazado gráfico: color, espesor, tipo de línea (la pestaña "Colores").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se usa el ajuste EMA;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u-3 +1).


4,2. Dinámica de la vela japonesa normalizada

4.2.1. Índice de la dinámica de la vela japonesa

El índice de la dinámica de la vela japonesa (CMI) - es la dinámica de la vela japonesa del periodo q normalizada.

Los valores de la dinámica ajustada de la vela japonesa del periodo q se dan como porcentaje (intervalo de mapeado [-100, 100]). Cada valor de la dinámica ajustada de la vela japonesa del periodo q es normalizado por el valor de la dinámica de la vela japonesa del periodo q ajustada, tomado en valor absoluto. La normalización permite que el valor de CMI pueda interpretarse como un grado de sobrecompra (valor positivo) o de sobreventa (valor negativo) en el mercado.

Fórmula del índice de la dinámica de la vela japonesa:

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)          100 * CMtm(price1,pric2,q,r,s,u)
CMI(price1,price2,q,r,s,u) = –––––––––––-------------––––––––-–––––––––––––––– = –––––––––––––––-------------–––-–––––––––––––
                               EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)     EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)
if EMA(EMA(EMA(|cmtm(price1,pric2,q)|,r),s),u)=0, then CMI(price1,price2,q,r,s,u)=0

donde:

  • q - número de periodos de tiempo del gráfico de precio involucrados en el cálculo del periodo q de la vela japonesa;
  • price1 - precio [de cierre] al final del periodo q;
  • price2 - precio [de apertura] al inicio del periodo q;
  • cmtm(price1,price2,q)=price1-price2[q-1] - dinámica de la vela japonesa del periodo q;
  • |cmtm(price1,pric2,q)| - valor absoluto de la dinámica de la vela japonesa del periodo q;
  • CMtm (price,q,r,s,u) - tres veces la dinámica de la vela japonesa del periodo q ajustada;
  • EMA (..., r) - primer ajuste - EMA(r) aplicado a:
    1) la dinámica de la dinámica de la vela japonesa del periodo q;
    2) valor absoluto de la dinámica de la vela japonesa del periodo q;
  • EMA (EMA(..., r),s) - el segundo ajuste, EMA(s) aplicada al resultado del primer ajuste;
  • EMA (EMA (EMA (..., r), s), u) - el tercer ajuste, EMA(u) aplicada al resultado del segundo ajuste.


4.2.1.1. CMI(price1,price2,q,r,s,u) - índice de la dinámica de la vela japonesa. Especificación

  • Nombre de archivo: Blau_CMI.mq5
  • Nombre: índice de la dinámica de la vela japonesa del periodo q (dinámica de la vela japonesa del periodo q normalizada; normalización por el valor absoluto de la dinámica de la vela japonesa del periodo q) según William Blau.
  • Parámetros de entrada:
    • q - periodo de la dinámica de la vela japonesa (por defecto q = 1);
    • r - periodo de la primera EMA aplicada a la dinámica de la vela japonesa (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • AppliedPrice - tipo de precio [cierre](por defecto AppliedPrice=PRICE_CLOSE).
    • AppliedPrice - tipo de precio [apertura](por defecto AppliedPrice=PRICE_OPEN).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación del trazado gráfico - el color, el espesor, el estilo de línea (la pestaña "Colores");
    • (opcional) dos niveles (por defecto es -25 y +25) - añadir/eliminar un nivel; cambiar el valor, la descripción del nivel, cambiar el estilo de representación de los niveles (la pestaña "Niveles");
    • cambia los límites inferiores (por defecto -100) y superiores (por defecto +100) de la escala de la ventana del indicador único (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se realizará el ajuste en el periodo correspondiente de EMA;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u-3 +1).

 

4.2.2. El índice de la vela japonesa

El índice de la vela japonesa (CSI) - es un indicador de la dinámica de la vela japonesa del periodo q normalizado (dinámica de la vela japonesa del periodo q ajustada y normalizada). Los valores de la dinámica de la vela japonesa del periodo q ajustados se dan como un porcentaje de la escala (intervalo de mapeado [-100, 100]).

Cada valor de la dinámica de la vela japonesa del periodo q ajustado se normaliza por el valor del rango de precio del periodo q (o por la longitud de la vela japonesa del periodo q). La normalización permite que el valor de CSI pueda interpretarse como un grado de sobrecompra (valor positivo) o de sobreventa (valor negativo) en el mercado.

Fórmula del índice de las velas japonesas:

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)    100 * CMtm(price1,pric2,q,r,s,u)
CSI(price1,price2,q,r,s,u) = –––––––––––––––––––-–––-------------––––––––––––– = ––––––––––––––––--––-–––––––––––––
                                    EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)           EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then CSI(price1,price2,q,r,s,u)=0

donde:

  • q - el número de barras del gráfico de precio usado en el cálculo de la dinámica de la vela japonesa del periodo q;
  • price1 - precio [de cierre] al final del periodo q;
  • price2 - precio [de apertura] al inicio del periodo q;
  • cmtm(price1,pric2,q)=price1-price2[q-1] - dinámica de la vela japonesa del periodo q;
  • LL (q) - el mínimo valor del precio más bajo para el periodo q;
  • HH (q) - el máximo valor para el precio más alto para el periodo q;
  • HH(q)-LL(q) - rango de precio del periodo q (la longitud de la vela japonesa del periodo q);
  • CMtm(price1,pric2,q,r,s,u) - tres veces la dinámica de la vela japonesa del periodo q ajustada;
  • EMA (..., r) - primer ajuste - EMA(r) aplicado a:
    1) la dinámica de la vela japonesa del periodo q, 
    2) el rango de precio del periodo q (o la longitud de la vela japonesa del periodo q);
  • EMA (EMA(..., r),s) - el segundo ajuste, EMA(s) aplicada al resultado del primer ajuste;
  • EMA (EMA (EMA (..., r), s), u) - el tercer ajuste, EMA(u) aplicada al resultado del segundo ajuste.

4.2.2.1. CSI(price1,price2,q,r,s,u) - índice de la vela japonesa. Especificación

  • Nombre de archivo: Blau_CSI.mq5
  • Nombre: índice de la vela japonesa del periodo q (dinámica de la vela japonesa del periodo q normalizada; normalización por el valor absoluto de la dinámica de la vela japonesa del periodo q) según William Blau.
  • Parámetros de entrada:
    • q - el periodo por el que se calcula la dinámica de la vela japonesa del periodo q (por defecto q = 1);
    • r - periodo de la primera EMA aplicada a la dinámica de la vela japonesa del periodo q (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • AppliedPrice - tipo de precio [cierre](por defecto AppliedPrice=PRICE_CLOSE).
    • AppliedPrice - tipo de precio [apertura](por defecto AppliedPrice=PRICE_OPEN).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación del trazado gráfico - el color, el espesor, el estilo de línea (la pestaña "Colores");
    • (opcional) dos niveles (por defecto es -25 y +25) - añadir/eliminar un nivel; cambiar el valor, la descripción del nivel, cambiar el estilo de representación de los niveles (la pestaña "Niveles");
    • cambia los límites inferiores (por defecto -100) y superiores (por defecto +100) de la escala de la ventana del indicador único (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se usa el ajuste EMA;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u-3 +1).

 

4.3. Los osciladores ergódicos de las velas japonesas

4.3.1. El oscilador CMI ergódico

Definición del oscilador CMI ergódico:
Ergodic_CMI(price1,pric2,q,r,s,u) = CMI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CMI(price1,pric2,q,r,s,u) ,ul)

donde:

  • Ergodic_CMI() - ergódico - Índice de la dinámica de la vela japonesa CMI(price1,price2,q,r,s,u);
  • SignalLine() -una línea de señal - EMA(ul) aplicada a la ergódica;
  • ul - un periodo EMA de una línea de señal - según William Blau, el valor ul debe ser igual al periodo del último valor significativo (>1) del ergódico EMA.

Ergodic_CMI(price1,pric2,q,r,s,u,ul) - oscilador CMI ergódico. Especificación

  • Nombre de archivo: Blau_Ergodic_CMI.mq5
  • Nombre: El oscilador CMI ergódico (basado en el índice de la dinámica de la vela japonesa) según William Blau.
  • Parámetros de entrada:
    • trazado gráfico #0 - ergódico (índice de la dinámica de la vela japonesa):
      • q - periodo de la dinámica de la vela japonesa (por defecto q = 1);
      • r - periodo de la primera EMA aplicada a la dinámica de la vela japonesa (por defecto r = 20);
      • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
      • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • graphic plot #1 - la línea de señal:
      • ul - periodo de la línea de señal aplicado al ergódico (por defecto ul = 3);
    • AppliedPrice - tipo de precio [cierre](por defecto AppliedPrice=PRICE_CLOSE).
    • AppliedPrice - tipo de precio [apertura](por defecto AppliedPrice=PRICE_OPEN).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación de cada trazado gráfico - el color, grosor, estilo de línea (la pestaña "colores");
    • dos niveles (por defecto -25 y +25) - añadir/eliminar un nivel, cambiar el valor, descripción del nivel, cambiar el estilo de representación de los niveles (la pestaña "Niveles");
    • cambia los límites inferiores (por defecto -100) y superiores (por defecto +100) de la escala de la ventana del indicador único (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se realizará el ajuste en el periodo correspondiente de EMA;
    • ul>0. Si ul = 1 entonces la línea de señal coincide con el ergódico;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u + ul-4 +1).


El código del oscilador CMI ergódico


Como ejemplo, vamos a considerar el indicador Ergodic_CMI (price1,price2,r,s,u,ul):

1) La relación entre las matrices del indicador, los buffers del indicador y los trazados gráficos:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                  // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                // Signal Line: EMA(ul), applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);        // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);        // price array [open]
   SetIndexBuffer(4,CMtmBuffer,INDICATOR_CALCULATIONS);          // q-period Candlestick Momentum
   SetIndexBuffer(5,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsCMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum (absolute value)
   SetIndexBuffer(9,EMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute value)
   SetIndexBuffer(10,DEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(11,TEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)

2) Algoritmo del calculo de cmtm y |cmtm|:

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // applied price [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and |cmtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         AbsCMtmBuffer[i]=0.0; //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[] and AbsCMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      AbsCMtmBuffer[i]=MathAbs(CMtmBuffer[i]);
     }


4.3.2. El oscilador CSI ergódico

El oscilador CSi ergódico se define de la siguiente forma:

Ergodic_CSI(price1,pric2,q,r,s,u) = CSI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CSI(price1,pric2,q,r,s,u) ,ul)

donde:

  • Ergodic_CSI() - Ergodic - índice de la vela japonesa CSI(price1,price2,q,r,s,u);
  • SignalLine() -una línea de señal - EMA(ul) aplicada a la ergódica;
  • ul - un periodo EMA de una línea de señal - según William Blau, el valor ul debe ser igual al periodo del último valor significativo (>1) del ergódico EMA.


4.3.2.1. Ergodic_CSI(price1,pric2,q,r,s,u,ul) - oscilador CSI ergódico. Especificación

  • Nombre de archivo: Blau_Ergodic_CSI.mq5
  • Nombre: El oscilador CSI ergódico (basado en el índice de la vela japonesa) según William Blau.
  • Parámetros de entrada:
    • trazado gráfico #0 - ergódico (índice de la vela japonesa):
      • q - el periodo por el que se calcula la dinámica de la vela japonesa del periodo q (por defecto q = 1);
      • r - periodo de la primera EMA aplicada a la dinámica de la vela japonesa (por defecto r = 20);
      • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
      • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
    • graphic plot #1 - la línea de señal:
      • ul - línea de señal del periodo EMA aplicada al ergódico (por defecto ul = 3);
    • AppliedPrice - tipo de precio [cierre](por defecto AppliedPrice=PRICE_CLOSE).
    • AppliedPrice - tipo de precio [apertura](por defecto AppliedPrice=PRICE_OPEN).
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación de cada trazado gráfico - el color, grosor, estilo de línea (la pestaña "colores");
    • dos niveles (por defecto -25 y +25) - añadir/eliminar un nivel, cambiar el valor, descripción del nivel, cambiar el estilo de representación de los niveles (la pestaña "Niveles");
    • cambia los límites inferiores (por defecto -100) y superiores (por defecto +100) de la escala de la ventana del indicador único (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se realizará el ajuste en el periodo correspondiente de EMA;
    • ul>0. Si ul = 1 entonces la línea de señal coincide con el ergódico;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u + ul-4 +1).


4.3.2.2. El código del oscilador CSI ergódico


En el ejemplo del indicador Ergodic_CSI (price1, price2,r,s,u,ul):

1) La relación entre las matrices del indicador, los buffers del indicador y los trazados gráficos:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);     // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);     // price arrya [open]
   SetIndexBuffer(4,LLBuffer,INDICATOR_CALCULATIONS);         // lowest prices (q bars)
   SetIndexBuffer(5,HHBuffer,INDICATOR_CALCULATIONS);         // highest prices (q bars)
   SetIndexBuffer(6,CMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum
   SetIndexBuffer(7,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA
   SetIndexBuffer(8,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // s-period 2nd EMA
   SetIndexBuffer(9,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // u-period 3rd EMA
   SetIndexBuffer(10,HHLLBuffer,INDICATOR_CALCULATIONS);      // price range (q bars)
   SetIndexBuffer(11,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (price range)
   SetIndexBuffer(12,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (price range)
   SetIndexBuffer(13,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (price range)

2) El algoritmo de cálculo de cmtm y el rango de precio del periodo q: 

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // price type [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and price range (q bars)
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         HHLLBuffer[i]=0.0;    //
         LLBuffer[i]=0.0;      //
         HHBuffer[i]=0.0;      //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // CMtmBuffer[] - q-period Candlestick Momentum
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      // LLBuffer[] - search for the lowest price (q bars)
      // HHBuffer[] - search for the highest price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // HHLLBuffer[] - Price Range (q bars)
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }

5. Tendencia direccional

Los indicadores considerados (ver adjunto):

  1. Blau_HLM.mq5- es un indicador del Cierre Virtual (dinámica alta-baja de combinación del periodo q; dinámica alta-baja de combinación del periodo q ajustada);
  2. Blau_DTI.mq5- índice de tendencia direccional (dinámica alta-baja de combinación del periodo q ajustada y normalizada);
  3. Blau_Ergodic_DTI.mq5- el oscilador DTI ergódico (basado en el índice de tendencia direccional).

Fig. 5.1. Indicadores del índice de tendencia direccional

Fig. 5.1. Indicadores del índice de tendencia direccional

 

5.1. Dinámica alta-baja de combinación

5.1.1. Definiendo la dinámica de la tendencia al alza y la tendencia a la baja

Una de las definiciones de la tendencia Si aumentan los valores de los precios máximos hay una tendencia al alza. Si disminuyen los valores de los precios mínimos hay una tendencia a la baja.

Para calcular la dinámica para los máximos de los precios puede usarse un grupo de indicadores de la dinámica que fueron tratados en el apartado 1:

Mtm( price=High, q, r, s, u )
TSI( price=High, q, r, s, u )
Ergodic( price=High, q, r, s, u )

y para los precios mínimos:

Mtm( price=Low, q, r, s, u )
TSI( price=Low, q, r, s, u )
Ergodic( price=Low, q, r, s, u )

La dinámica de la tendencia al alza o la subida de alta dinámica (HMU) es la diferencia positiva entre el precio máximo del periodo actual y el precio máximo al inicio del rango de precio del periodo q. El valor de la dinámica del periodo q de la tendencia al alza muestra una velocidad relativa del crecimiento del precio máximo para el periodo actual comparado con el precio máximo al inicio del rango del periodo q de las fluctuaciones del precio.

Fórmula de la dinámica del periodo q de la tendencia al alza:

HMU(q) = High - High[q-1], if High - High[q-1] > 0
HMU(q) = 0, if High - High[q-1] <= 0

donde:

  • q - número de periodos de tiempo del gráfico de precio involucrados en el cálculo de la dinámica al alza;
  • High - el precio máximo para el periodo actual;
  • High[q–1] - precio máximo hace (q-1) periodos .

La dinámica de la tendencia a la baja o la bajada de baja dinámica (LMD) es la diferencia positiva entre el precio mínimo del periodo actual y el precio más bajo al inicio del rango del periodo q de las fluctuaciones del precio. El valor de la dinámica del periodo q de la tendencia a la baja muestra una velocidad relativa del decrecimiento del precio mínimo para el periodo actual comparado con el precio más bajo al inicio del rango de precio del periodo q.

Fórmula de la dinámica de la tendencia a la baja del periodo q:

LMD(q) = -(Low - Low[q-1]), if Low - Low[q-1] < 0
LMD(q) = 0, if Low - Low[q-1] >= 0

donde:

  • q - número de periodos de tiempo del gráfico de precio usados para el cálculo de la dinámica la baja;
  • Low - el precio mínimo para el periodo actual;
  • Low [q-1] - el precio mínimo en (q-1) periodos anteriores.

Una dinámica alta-baja combinada (dinámica alta-baja, HLM) - es la diferencia entre la dinámica del periodo q de la tendencia al alza y la dinámica del periodo q de la tendencia a la baja. El signo de la dinámica alta-baja combinada indica la tendencia de los cambios en el precio: una HLM positiva significa una tendencia al crecimiento del precio (tendencia al alza) y una negativa indica una tendencia a la disminución del precio (tendencia a la baja).

Fórmula:

HLM(q) = HMU(q) - LMD(q)

donde:

  • q - es el número de periodos de tiempo del gráfico del precio implicados en el cálculo de las dinámicas de la tendencia al alza y la tendencia a la baja.
  • HMU (q) - la dinámica de la tendencia al alza para el periodo q;
  • LMD (q) - la dinámica de la tendencia a la baja para el periodo q;

Fórmula de la dinámica alta-baja combinada del periodo q ajustada (Cierre virtual):

HLM(q,r,s,u) = EMA(EMA(EMA( HLM(q) ,r),s),u) = EMA(EMA(EMA( HMU(q)-HMD(q) ,r),s),u)

donde:

  • q - es el número de periodos de tiempo del gráfico del precio implicados en el cálculo de las dinámicas de la tendencia al alza y la tendencia a la baja.
  • HMU (q) - la dinámica de la tendencia al alza para el periodo q;
  • LMD (q) - la dinámica de la tendencia a la baja para el periodo q;
  • HLM(q) = HMU(q)-LMD(q) - la dinámica alta-baja combinada del periodo q;
  • EMA (HLM(q),r) - primer ajuste - EMA(r) aplicado a la dinámica alta-baja combinada del periodo q;
  • EMA (EMA(..., r),s) - el segundo ajuste, EMA(s) aplicada al resultado del primer ajuste;
  • EMA (EMA (EMA (..., r), s), u) - el tercer ajuste, EMA(u) aplicada al resultado del segundo ajuste.

La curva del gráfico de la suma acumulada de las dinámicas complejas para los máximos y mínimos se llama un cierre virtual.


5.1.2. HLM(q,r,s,u) - Indicador de cierre virtual. Especificación
  • Nombre de archivo: Blau_HLM.mq5
  • Nombre: Indicador del cierre virtual (dinámica alta-baja combinada del periodo q; dinámica alta-baja combinada del periodo q ajustada) según William Blau.
  • Parámetros de entrada:
    • q - periodo para el que se calcula HLM (por defecto q = 2);
    • r - periodo de la primera EMA aplicado a HLM (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambios de representación del trazado gráfico: color, espesor, tipo de línea (la pestaña "Colores").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se realizará el ajuste en el periodo correspondiente de EMA;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u-3 +1).

 

5.2. Índice de tendencia direccional

5.2.1. La definición del índice de tendencia direccional

El índice de tendencia direccional (Índice de tendencia direccional, DTI) es un indicador de una dinámica alta-baja combinada del periodo q normalizado (HLM normalizado y ajustado). Los valores de HLM ajustados se dan como un porcentaje de la escala (intervalo de visualización [-100, 100]).

Cada valor de HLM ajustado es normalizado por el valor de un HLM ajustado tomado en valor absoluto. La normalización permite que el valor de DTI pueda interpretarse como un grado de sobrecompra (valor positivo) o de sobreventa (valor negativo) en el mercado.

La fórmula del índice de tendencia direccional:

               100 * EMA(EMA(EMA( HLM(q) ,r),s),u)          100 * HLM(q,r,s,u)
DTI(q,r,s,u) = –––––––––––––––––––––––––---––––––– = ––––––––––––––--–––––––––––––––
                 EMA(EMA(EMA( |HLM(q)| ,r),s),u)     EMA(EMA(EMA( |HLM(q)| ,r),s),u)
if EMA(EMA(EMA(|HLM(q)|,r),s),u)=0, then DTI(price,q,r,s,u)=0

donde:

  • q - es el número de periodos de tiempo del gráfico del precio implicados en el cálculo de las dinámicas de la tendencia al alza y la tendencia a la baja.
  • HLM(q) = HMU(q)-LMD(q) - una dinámica del periodo q compleja para los máximos y mínimos;
  • |HLM(q)| - valor absoluto de HLM(q);
  • HLM(q,r,s,u) - HLM(q) ajustado tres veces;
  • EMA (..., r) - primer ajuste - EMA(r) aplicado a:
    1) a HLM (q)
    2) al valor absoluto de HLM (q);
  • EMA (EMA(..., r),s) - el segundo ajuste, EMA(s) aplicada al resultado del primer ajuste;
  • EMA (EMA (EMA (..., r), s), u) - el tercer ajuste, EMA(u) aplicada al resultado del segundo ajuste.
5.2.2. DTI(q,r,s,u) - Índice de tendencia direccional. Especificación
  • Nombre de archivo: Blau_DTI.mq5
  • Nombre: Índice de tendencia direccional (dinámica alta-baja combinada del periodo q ajustada y normalizada) según William Blau.
  • Parámetros de entrada:
    • q - periodo para el que se calcula HLM (por defecto q = 2);
    • r - periodo de la primera EMA aplicado a HLM (por defecto r = 20);
    • s - periodo de la segunda EMA, aplicada al resultado del primer ajuste (por defecto s = 5);
    • u - periodo de la tercera EMA, aplicada al resultado del segundo ajuste (por defecto, u = 3);
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación del trazado gráfico - el color, el espesor, el estilo de línea (la pestaña "Colores");
    • (opcional) dos niveles (por defecto es -25 y +25) - añadir/eliminar un nivel; cambiar el valor, la descripción del nivel, cambiar el estilo de representación de los niveles (la pestaña "Niveles");
    • cambia los límites inferiores (por defecto -100) y superiores (por defecto +100) de la escala de la ventana del indicador único (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se realizará el ajuste en el periodo correspondiente de EMA;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u-3 +1).

 

5.3. El oscilador DTI ergódico

5.3.1. Definición del oscilador DTI ergódico:

Ergodic_DTI(q,r,s,u) = DTI(q,r,s,u)
SignalLine(q,r,s,u,ul) = EMA( Ergodic_DTI(q,r,s,u) ,ul)

donde:

  • Ergodic_DTI() - Ergódico- Índice de tendencia direccional DTI(q,r,s,u);
  • SignalLine() - una señal de línea- una media móvil exponencial del periodo ul aplicado al ergódico;
  • ul - un periodo EMA de una línea de señal - según William Blau, el valor ul debe ser igual al periodo del último valor significativo (>1) del ergódico EMA.
5.3.2. Ergodic_DTI(q,r,s,u,ul) - oscilador DTI ergódico. Especificación
  • Nombre de archivo: Blau_Ergodic_DTI.mq5
  • Nombre: Oscilador DTI ergódico (basado en un índice de tendencia direccional) según William Blau.
  • Parámetros de entrada:
    • trazado gráfico #0 - ergódico (índice de la tendencia direccional):
      • q - periodo para el que se calcula HLM (por defecto q = 2);
      • r - periodo de la primera EMA con relación a HLM (por defecto r = 20);
      • s - periodo de la segunda EMA, con relación a los resultados del primer ajuste (por defecto s = 5);
      • u - periodo de la tercera EMA, con relación al resultado del segundo ajuste (por defecto, u = 3);
    • construcción gráfica #1 - la línea de señal:
      • ul - línea de señal del periodo EMA aplicada al ergódico (por defecto ul = 3);
  • Adicionalmente:
    • mostrado en una ventana separada;
    • cambia el estilo de representación de cada trazado gráfico - el color, grosor, estilo de línea (la pestaña "colores");
    • dos niveles (por defecto -25 y +25) - añadir/eliminar un nivel, cambiar el valor, descripción del nivel, cambiar el estilo de representación de los niveles (la pestaña "Niveles");
    • cambia los límites inferiores (por defecto -100) y superiores (por defecto +100) de la escala de la ventana del indicador único (la pestaña "Escala").
  • Limitaciones:
    • q>0;
    • r>0, s>0, u>0. Si r, s o u son iguales a 1, no se usa el ajuste EMA;
    • ul>0. Si ul = 1 entonces la línea de señal coincide con el ergódico;
    • el tamaño mínimo de la matriz de precios = (q-1 + r + s + u + ul-4 +1).


5,4. El código del oscilador DTI ergódico

El indicador Ergodic_DTI (q,r,s,u,ul):

1) La relación entre las matrices del indicador, los buffers del indicador y los trazados gráficos:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic Line
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,HMUBuffer,INDICATOR_CALCULATIONS);          // q-period Up Trend Momentum
   SetIndexBuffer(3,LMDBuffer,INDICATOR_CALCULATIONS);          // q-period Down Trend Momentum
   SetIndexBuffer(4,HLMBuffer,INDICATOR_CALCULATIONS);          // Composite q-period High/Low Momentum
   SetIndexBuffer(5,EMA_HLMBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsHLMBuffer,INDICATOR_CALCULATIONS);       // Composite q-period High/Low Momentum (absolute values)
   SetIndexBuffer(9,EMA_AbsHLMBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute values)
   SetIndexBuffer(10,DEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute values)
   SetIndexBuffer(11,TEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute values)

2) Algoritmo de cálculo de HLM y |HML|:

//--- calculation of HLM and |HLM|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         HLMBuffer[i]=0.0;     // zero values
         AbsHLMBuffer[i]=0.0;  //
         HMUBuffer[i]=0.0;     //
         LMDBuffer[i]=0.0;     //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of HLMBuffer[], AbsHLMBuffer[], HMUBuffer[], LMDBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      HMUBuffer[i]=High[i]-High[i-(q-1)];    HMUBuffer[i]=(HMUBuffer[i]>0)?HMUBuffer[i]:0;
      LMDBuffer[i]=-1*(Low[i]-Low[i-(q-1)]); LMDBuffer[i]=(LMDBuffer[i]>0)?LMDBuffer[i]:0;
      HLMBuffer[i]=HMUBuffer[i]-LMDBuffer[i];
      AbsHLMBuffer[i]=MathAbs(HLMBuffer[i]);
     }

Conclusión

La primera parte del artículo "Indicadores de William Blau y sistemas de trading en MQL5. Parte 1: Indicadores" proporciona una descripción de los indicadores y osciladores desarrollados en MQL5 a partir del libro "Momentum, Direction, and Divergence" de William Blau.

El uso de estos indicadores y osciladores al tomar decisiones de trading será descrito en la segunda parte del artículo "Indicadores de William Blau y sistemas de trading en MQL5. Parte 2: Sistemas de trading".

 

Los contenidos del archivo adjunto a este artículo ("Blau_Indicators_MQL5_en.zip"):

Archivo Descripción
El archivo incluido. Ubicación: "terminal_data_folder\MQL5\Include"
 WilliamBlau.mqh  
Indicadores. Ubicación: "terminal_data_folder\MQL5\Include"
   Indicadores basados en la dinámica
 Blau_Mtm.mq5  El indicador de la dinámica (dinámica del periodo q, dinámica del periodo q ajustada)
 Blau_TSI.mq5  El índice de fortaleza verdadera (dinámica del periodo q ajustada y normalizada)
 Blau_Ergodic.mq5  Oscilador ergódico (basado en el índice de fortaleza verdadera)
   Indicadores basados en el estocástico
 Blau_TStoch.mq5  Estocástico (estocástico del periodo q, estocástico del periodo q ajustado)
 Blau_TStochI.mq5  Índice estocástico (estocástico del periodo q ajustado y normalizado)
 Blau_TS_Stochastic.mq5  Oscilador TS estocástico (basado en el índice estocástico)
   Indicadores basados en la dinámica estocástica
 Blau_SM.mq5  Dinámica estocástica (dinámica estocástica del periodo q, dinámica estocástica del periodo q ajustada)
 Blau_SMI.mq5  Índice de la dinámica estocástico (dinámica RSI q-estocástica normalizada y ajustada)
 Blau_SM_Stochastic.mq5  Oscilador SM estocástico (basado en el índice de la dinámica estocástico)
   Indicadores basados en una desviación de la tendencia del mercado
 Blau_MDI.mq5  Indicador de la desviación media (desviación media, desviación media ajustada)
 Blau_Ergodic_MDI.mq5  Oscilador MDI ergódico (basado en el indicador de la desviación media)
   Indicadores basados en la convergencia/divergencia de la media móvil:
 Blau_MACD.mq5  Indicador de la convergencia/divergencia de las medias móviles (MACD; MACD ajustado)
 Blau_Ergodic_MACD.mq5  Oscilador MACD ergódico (basado en el indicador MACD)
   Indicadores basados en la dinámica de velas japonesas:
 Blau_CMtm.mq5  El indicador de la dinámica de velas japonesas (dinámica de las velas japonesas del periodo q, dinámica de las velas japonesas del periodo q ajustada)
 Blau_CMI.mq5  Índice de la dinámica de la vela japonesa (dinámica de la vela japonesa del periodo q normalizada y ajustada; normalizado por el valor absoluto de la dinámica de la vela japonesa del periodo q)
 Blau_CSI.mq5  Índice de la vela japonesa (dinámica de la vela japonesa del periodo q normalizada y ajustada; normalizado por la longitud de la vela japonesa del periodo q)
 Blau_Ergodic_CMI.mq5  Oscilador CMI ergódico (basado en el índice de la dinámica de la vela japonesa)
 Blau_Ergodic_CSI.mq5  Oscilador CSI ergódico (basado en el índice de la vela japonesa)
   Indicadores basados en la dinámica combinada
 Blau_HLM.mq5  Indicador de cierre virtual (dinámica alta-baja combinada del periodo q; dinámica alta-baja combinada del periodo q ajustada)
 Blau_DTI.mq5  Índice de una tendencia direccional (dinámica alta-baja combinada del periodo q ajustada y normalizada)
 Blau_Ergodic_DTI.mq5  Oscilador DTI ergódico (basado en el índice de tendencia direccional)


Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/190

Archivos adjuntos |
El histograma del precio (perfil del mercado) y su implementación en MQL5 El histograma del precio (perfil del mercado) y su implementación en MQL5
El perfil del mercado fue desarrollado por un autor realmente brillante, Peter Steidlmayer. Este autor sugirió el uso de la representación alternativa de la información sobre los movimientos "horizontales" y "verticales" del mercado que llevan a un conjunto completamente diferente de modelos. Este autor asumió que hay un pulso subyacente o patrón fundamental en el mercado llamado el ciclo de equilibrio y desequilibrio. En este artículo veremos el histograma del precio, un modelo simplificado del perfil del mercado, y describiré su implementación en MQL5.
Promediación de series de precio para cálculos intermedios sin usar buffers adicionales Promediación de series de precio para cálculos intermedios sin usar buffers adicionales
Este artículo trata sobre los algoritmos tradicionales y otros menos habituales utlizados para la promediación en clases simples y de tipo único. Tienen por finalidad un uso universal en casi todos los desarrollos de indicadores. Espero que las clases que se proponen sean una buena alternativa a las "voluminosas" llamadas de los indicadores técnicos y personalizados.
Cómo intercambiar datos: una DLL para MQL5 en 10 minutos. Cómo intercambiar datos: una DLL para MQL5 en 10 minutos.
No hay muchos programadores que recuerden cómo escribir una simple DLL y cuáles son las características especiales de los distintos tipos de vinculación del sistema. Usando varios ejemplos intentaré mostrar todo el proceso de creación de la DLL en 10 minutos, así como discutir algunos aspectos técnicos de nuestra implementación de la vinculación. Mostraré el proceso paso a paso de la creación de la DLL en Visual Studio con ejemplos de intercambio de distintos tipos de variables (números, matrices, strings, etc.). Además, explicaré cómo proteger su terminal de cliente de errores fatales con las DLL personalizadas.
Ventajas de las señales MQL5 Ventajas de las señales MQL5
El servicio "señales comerciales", aparecido hace poco en MetaTrader 5, permite a los traders copiar las operaciones comerciales de cualquier suministrador de señales. El usuario elige una señal que le interese, se suscribe a ella, y todas las operaciones se repetirán entonces en su cuenta. El suministrador no jugará con desventaja, ya que puede establecer el precio que quiera por la suscripción, recibiendo, así, una cantidad fijada por parte de cada cliente.