Descargar MetaTrader 5

Método de construcción de los niveles de resistencia y apoyo con los recursos de MQL5

26 enero 2016, 08:23
Aleksandr Teleguz
0
1 134

Índice

  1. Introducción
  2. Propósito del artículo
  3. Información breve sobre los métodos presentados anteriormente para la construcción de los niveles de apoyo y resistencia
  4. Principio de localización de los extremos
  5. Función de localización de la barra-extremo con el índice menor (primera barra) Ext_1
  6. Función general de localización de todos los extremos subsecuentes Ext_2
  7. Procesando los resultados
  8. Ejemplo de un indicador que representa los niveles de apoyo y resistencia
  9. Conclusión

Introducción

Primero voy a hablar un poco de la historia de lo que suponen las línea de apoyo y resistencia, cómo se construyen, y cómo las uso al comerciar.

Todas las figuras de tendencia, las líneas y modelos suponen una combinación de líneas de apoyo y resistencia, que constituyen la base del indicador clásico de tendencia. La línea de resistencia (Resistance) se construye según los precios máximos, que aparecen cuando los tráders ("toros") dejan de comprar divisa a un precio alto y comienzan a cerrar las posiciones abiertas de compra. El precio del instrumento financiero reacciona a este retroceso hasta que no aparezca una situación análoga entre los "osos", es decir, la línea de apoyo (Support) se construye conforme a los precios mínimos.

De esta forma, se puede suponer que los puntos del máximo se forman cuando la divisa se ha sobrecomprado, y los puntos del mínimo, cuando se ha sobrevendido. Precisamente por eso, para construir las líneas de apoyo y resistencia yo uso un indicador estándar del paquete MetaTrader, Relative Strength Index (RSI), desarrollado y publicado por John Wilder en 1978. Este indicador determina las zonas de sobrecompra y sobreventa de la divisa.

Yo uso el indicador RSI con un periodo 8; el valor establecido no es el resultado de mis observaciones, este orden de RSI lo recomendó Eric L. Nyman en un libro llamado "La pequeña enciclopedia del tráder" para todos los periodos del gráfico, con la excepción del periodo de días y superior. La verdad es que estoy muy satisfecho con los resultados de mi indicador al trabajar con RSI(8).

Existen dos opiniones divergentes sobre si merece la pena tener en cuenta las "sombras" de las velas (precios High y Low) a la hora de buscar los precios máximos y mínimos. Yo las suelo tener en cuenta al buscar los puntos extremos, y comparo precisamente los precios High y Low. Si usted no quiere tenerlos en cuenta, entonces puede simplemente introducir cambios poco significativos en el código del indicador mostrado más abajo.

El comercio usando las líneas de apoyo y resistencia puede tener lugar tanto fuera de los límites de estas líneas, como al fluctuar el precio dentro de la figura formada con estas líneas.

Comercio con ruptura de los niveles de apoyo y resistencia

Fig. 1. Señal de compra

Yo considero que el segundo método no es efectivo, en especial si el "retroceso" del precio de una de las líneas juega un rol fundamental en la toma de decisiones comerciales. En el dibujo №1 se muestra precisamente el caso cuando el precio, después de un "retroceso" desde la línea de resistencia no alcanza la línea de apoyo, se vuelve y "rompe" la línea de resistencia, esta situación hace la señal de compra más fuerte. Analizando los ángulos de inclinación con respecto al eje temporal, determinamos la dirección general de la tendencia, y cuando el precio del instrumento financiero cruza una de las líneas, este hecho nos permite llegar a la conclusión de que la tendencia actual se ha reforzado o ha virado. A veces, antes de cruzar, por ejemplo, la línea de apoyo, el precio llega solo hasta la mitad de la línea de resistencia (este factor refuerza la señal comercial).

Existe una plataforma para reconocer las figuras y los modelos de tendencia: Autochartist. Como experimento, he estado comerciando en una cuenta demo durante dos meses con señales que llegaban al darse el "retroceso" del precio desde el nivel de apoyo y resistencia: una mayoría aplastante de las operaciones en este caso se cerró con pérdidas, lo que no se puede decir sobre las operaciones que llegaban al darse la "ruptura" de niveles.

Las líneas de apoyo y resistencia también se usan para determinar la aceleración o la ralentización de las tendencias. El aumento del ángulo de inclinación de la línea de tendencia en la tendencia del toro significa que se está acelerando. Al comenzar dicha aceleración, es lícito esperar que la tendencia continúe. El aumento del ángulo de inclinación de la línea en la tendencia del oso significa, al contrario, que se está ralentizando. En la tendencia del toro, interviene como línea de tendencia la línea de apoyo (construida con los precios Bajos), en la tendencia del oso, interviene como línea de tendencia la línea de resistencia (construida con los precios Altos).

Ralentización de la tendencia del toro

Fig.2. Ralentización de la tendencia del toro

Ralentización de la tendencia del oso

Fig.3. Ralentización de la tendencia del oso

La ralentización de las tendencias significa que en breve puede tener lugar su viraje.


Propósito del artículo

El análisis de figuras gráficas formadas por las líneas de apoyo y resistencia es uno de los métodos más antiguos de análisis técnico. En virtud de mi experiencia en el comercio en el mercado de divisas, podría añadir que el método mencionado más arriba no solo es antiguo, sino eficaz. Pienso que lo usan muchos tráders. La construcción de las líneas de apoyo y resistencia de forma manual con los recursos de MetaTrader 5 no supone esfuerzo para un tráder que sepa la teoría, lo que no se puede decir sobre la creación de los programas que construyen estas líneas de forma automática.

En este artículo quiero proponerle un método propio de construcción de las líneas de apoyo y resistencia, que se puede implementar tanto con los recursos de MQL5, como con los de MQL4. Espero que esta información le resulte de utilidad.


Información breve sobre los métodos presentados anteriormente para la construcción de los niveles de apoyo y resistencia

La mayor parte del tiempo, las cotizaciones de las parejas de divisas fluctúan dentro de los límites de las líneas de apoyo y resistencia, este hecho es la base del artículo de Gleb Slobodov sobre los métodos de construcción de las líneas. Como resultado, tenemos dos niveles horizontales que definen el diapasón de fluctuación de los precios, la ruptura de uno de los cuales nos da precisamente la señal de compra o venta. Sin embargo, el principio de construcción propuesto tiene una serie de defectos:

  • La cantidad de barras analizadas se selecciona de forma manual. El diapasón de precios depende de este parámetro, y en consecuencia, los valores de los niveles de apoyo y resistencia.
  • El progreso de la construcción de los niveles no está automatizado por completo, lo que implica que se excluye la posibilidad de crear un sistema comercial automático.
  • Usando este método, obtenemos niveles horizontales, que no nos permiten analizar la dirección y la fuerza de la tendencia.

El indicador de niveles de apoyo y resistencia usado en la estrategia comercial de Ígor Gerasko también define los niveles horizontales.

En este artículo quiero presentarle el principio de construcción de las líneas de tendencia de apoyo y resistencia, que permiten determinar la dirección de la tendencia, la formación de los modelos y figuras de tendencia. Las líneas se construyen según los puntos extremos mínimos y máximos.


Principio de localización de los extremos

Determinar los precios máximos y mínimos en el intervalo de tiempo indicado no supone ninguna dificultad. Aquí es importante elegir el segmento del gráfico a analizar (intervalo de tiempo), que cambia constantemente y por eso puede ser establecido manualmente. Para encontrar este sector del gráfico de divisas, voy a utilizar el indicador Relative Strength Index (RSI), que entra en el paquete estándar de indicadores del terminal MetaTrader 5.

Según los niveles del indicador RSI se determinan los niveles de sobrecompra y sobreventa, precisamente en esos momentos el gráfico de nuestra pareja de divisas se desvía de su dirección (tendencia) y tiene lugar el "retroceso" de los precios, precisamente aquí se formarán nuestros extremos, en estos intervalos vamos a buscar los precios máximos y mínimos.

Como nivel de sobreventa voy a adoptar un valor del indicador RSI igual a 35; como el de sobrecompra, un valor de 65 (los niveles inferior y superior equidistan del medio RSI = 50). El periodo del indicador RSI es igual a 8.

Aquí es necesario destacar que con no poca frecuencia, al darse una tendencia fuerte, por ejemplo, ascendente, RSI cruza varias veces el nivel superior, pero no llega hasta el inferior. Resulta imprescindible corregir el nivel que no corresponde a la dirección de la tendencia.

Búsqueda de los puntos extremos

Fig.4. Zona de búsqueda de barras-extremos

En la imagen adjunta más arriba, he marcado con las cifras 1, 2, 3 y 4 las zonas de búsqueda de las barras-extremos: primera, segunda, tercera y cuarta, respectivamente. Dado que antes de que se atraviese el límite inferior (RSI = 35), el indicador RSI, partiendo de la barra actual, entra en la zona de sobrecompra (RSI >= 65) tres veces, entonces serán también tres los segmentos de tiempo en los que se busca el primer extremo. A continuación, se determinan por orden las zonas de búsqueda de las tres barras subsiguientes.

En las zonas 1 y 3 buscaré las barras con los precios mayores, y en las barras 2 y 4, con los precios menores. Como resultado, otenemos 4 puntos extremos, si los unimos con un haz, entonces obtendremos un canal ascendente de precios.

Fig.5. Canal ascendente

Fig.5. Canal ascendente

Si ha prestado atención, entonces seguro que habrá notado que ha habido pocas barras para la búsqueda de mínimos, solo 4 (2 para cada zona). Debido a que predomina la tendencia ascendente, el indicador RSI apenas ha tocado el nivel mínimo, mientras que el indicador se ha encontrado más allá del nivel RSI = 65 prácticamente el mismo tiempo que en el canal 35 < RSI < 65. Por eso el indicador cuyo código he adjuntado en este artículo, para encontrar los niveles №2 y 4 va a usar el nivel RSI, colocado más cerca de la mitad (hacia 50). Si será el nivel superior o inferior de RSI, depende de cómo haya sido el primer extremo (mínimo o máximo).

Para cada pareja de divisas y cada periodo del gráfico, los valores RSI y las magintudes de la desviación consecuente de uno de ellos se toman de forma experimental, y yo considero esto un defecto de mi sistema para determinar los extremos.


Función de localización de la barra-extremo con el índice menor (primera barra) Ext_1

La función de localización de extremos, a la que he llamado "Ext_1", tiene los parámetros siguientes:

int Ext_1(double low,      //Nivel RSI inferior, nivel de sobreventa
          double high,     //Nivel RSI superior, nivel de sobrecompra
          int bars,        //cantidad de barras analizadas, para no copiar en la matriz datos innecesarios
                           //bars que se pueden establecer = 300
          int h_rsi,       //manejador del indicador RSI
          string symbol,   //símbolo del gráfico
          float distans,   //distancia de la desviación de uno de los niveles del indicador
                           //permite determinar los límites de la búsqueda de la primera barra-extremo
          ENUM_TIMEFRAMES period_trade) //periodo del gráfico

Los dos primeros parámetros de entrada son los parámetros del propio indicador RSI. No cumplen ningún papel en el cálculo de la línea del indicador, y se usan en él solo para que sea más cómoda la valoración visual del valor de la línea de indicador (su ubicación con respecto a los datos de los niveles). Yo uso estos niveles para determinar los intervalos de los precios entre los que voy a buscar los valores máximos y mínimos. Los parámetros "low" y "high" reciben los valores de las variables externas correspondientes, establecidas en el código del indicador a nivel global:

input double Low_RSI = 35.0; // Nivel RSI inferior para localizar los extremos
input double High_RSI= 65.0; // Nivel RSI superior para localizar los extremos

El parámetro de entrada "bars" define la cantidad de elementos copiados a las matrices, que contienen los precios de las barras "Low" y "High", así como los valores del indicador RSI:

double m_rsi[],m_high[],m_low[];                              //inicialización de las matrices
int h_high = CopyHigh(symbol, period_trade, 0, bars, m_high); //llenamos la matriz de los precios máximos de las velas
int h_low = CopyLow(symbol, period_trade, 0, bars, m_low);    //llenamos la matriz de los precios mínimos de las velas
if(CopyBuffer(h_rsi, 0, 0, bars, m_rsi)<bars)                 //llenamos la matriz con los datos del indicador RSI
{
   Print("No se ha logrado copiar el búfer del indicador!");
}

Массивы m_rsi[],m_high[] и m_low[] tienen un orden inverso de indexación:

ArraySetAsSeries(m_rsi,true); 
ArraySetAsSeries(m_high,true); 
ArraySetAsSeries(m_low,true);

Como ya he dicho, cuando predomina la tendencia del toro, la línea del indicador RSI, que tiene un diapasón de valores de 0 a 100, la mayoría del tiempo tendrá un valor de > 50. En los momentos en los que se forma el punto del mínimo, el valor RSI estará menos alejado de la mitad (50), que al formarse el punto del máximo. Por eso, al producirse el primer cruzamiento de uno de los niveles del indicador (low o high), se debe desplazar el otro nivel más cerca del centro. La magnitud de la desviación es determinada por el parámetro de entrada "distans", al que se le asigna el valor de la variable externa correspondiente:

input float Distans=13.0;    // Desviación del nivel RSI 

El parámetro de entrada "h_rsi" de la función "Ext_1" recibe el valor del manejador del indicador RSI, obtenido al inicializarse el indicador con la ayuda de la función iRSI():

h_RSI=iRSI(Trade_Symbol,Period_Trade,Period_RSI,PRICE_CLOSE);  //retornamos el manejador del indicador RSI

Las variables Trade_Symbol y Period_Trade se inicializan a nivel global y contienen información sobre la pareja de divisas y el periodo del gráfico, respectivamente. La variable Period_RSI contiene el valor del periodo del indicador RSI, establecido en los parámetros externos de mi indicador:

input uchar Period_RSI =8;   // Periodo RSI

Una vez hayamos creado y llenado las matrices que contienen los precios de las barras low y high, así como los valores del indicador RSI que corresponden a estas barras, podemos proceder a la búsqueda del primer extremo. Para determinar dónde se encontrará el primer extremo (en la línea de apoyo o en la de resistencia) y detener el análisis de las barras en el momento adecuado, necesitaremos dos variables del tipo bool:

bool ext_max = true;    //las variables del tipo bool se usan para detenerse en el momento oportuno
bool ext_min = true;    //análisis de las barras

El valor ext_max = true permite realizar la búsqueda del extremo máximo, el valor ext_min = true, por consiguiente, permite realizar la búsqueda del extremo mínimo. Es decir, al darse el primer cruzamiento de la línea del indicador RSI con uno de los niveles (low o high) el valor de una de las variables del tipo bool cambia a false, y el cruzamiento del nivel RSI, cuyo análisis de barras está desactivado, significa que la cantidad necesaria de barras ha sido analizada, y el primer extremo ya ha sido localizado. 

Si al realizar el análisis de la primera barra, el valor del indicador RSI está fuera de los límites, entonces lo más probable es que no haya finalizado la formación del diapasón de precios en el que hay que buscar el extremo, por lo que no tiene mucho sentido analizarlo. Se debe evitar el análisis de este tipo de barras. En la imagen mostrada más abajo he destacado el intervalo de precios en el que no se realiza análisis (preste atención a la posición de la línea del indicador RSI con respecto al nivel superior):

Desactivar el análisis en el diapasón de precios incompleto

Fig.6. Desactivar el análisis en el diapasón de precios incompleto

Para implementar un algoritmo de funcionamiento de este tipo, necesitaremos crear otra variable más del tipo bool:

bool flag=false;

Para determinar los precios máximos y mínimos entre las barras analizadas, hay que crear las siguientes variables del tipo double:

double min = 100000.0;  //variables para detectar los precios máximos y mínimos
double max = 0.0;       //...

El ciclo completo para la búsqueda de la barra con el primer extremo tendrá el aspecto siguiente:

for(int i=0;i<bars;i++) //ciclo de barras
{
   double rsi = m_rsi[i];                                   //obtenemos los valores del indicador RSI
   double price_max = NormalizeDouble(m_high[i], digits);   //precios High
   double price_min = NormalizeDouble(m_low[i], digits);    //precios Low de la barra elegidа
   if(flag==false) //condiciones para evitar la búsqueda del extremo en una tendencia incompleta
   {
      if(rsi<=low||rsi>=high) //si las primeras barras están en las zonas de sobrecompra o sobreventa,
         continue;            //entonces pasamos a la barra siguiente
      else flag = true;       //si no, continuamos el análisis  
   }
   if(rsi<low) //si se ha localizado el cruzamiento de RSI con el nivel low
   {
      if(ext_min==true) //si RSI no ha cruzado aún el nivel high
      {
        if(ext_max==true) //si todavía no se ha desactivado la búsqueda del extremo máximo,
        {
           ext_max=false;     //entonces desactivamos la búsqueda del extremo máximo
           if(distans>=0) high=high-distans; //cambiamos el nivel high, conforme al cual
        }                                    //se realizará después la búsqueda de la segunda barra
        if(price_min<min) //buscamos y guardamos el índice de la primera barra
        {                 //comparando los precios de las velas Low
           min=price_min;
           index_bar=i;
        }
      }
      else break; /*Salimos del ciclo, puesto que ya se ha desactivado la búsqueda del extremo mínimo,
                    eso significa que ya se ha localizado el máximo*/
   }
   if(rsi>high) //a continuación, el algoritmo es el mismo, solo que en la búsqueda del extremo máximo
   {
      if(ext_max==true)
      {
        if(ext_min==true)
        {
           ext_min=false;
           if(distans>=0) low=low+distans;
        }
        if(price_max>max)
        {
           max=price_max;
           index_bar=i;
        }
      }
      else break; /*Salimos del ciclo, puesto que ya se ha desactivado la búsqueda del extremo máximo,
                    eso significa que ya se ha localizado el mínimo*/
   }
}


Función general de localización de todos los extremos subsecuentes Ext_2

En calidad de parámetros de entrada, esta función recibirá los mismos parámetros que la función Ext_1, más tres parámetros importantes:

  1. El parámetro que contiene el enlace a la estructura en la que se contendrán los índices de las barras-extremos. Es imprescindible para determinar el índice de la barra desde la que se comenzará la búsqueda del extremo.
  2. El número ordinal de la barra-extremo que debe ser encontrado (toma valores de 2 a 4). Es necesario, propiamente, para elegir de la estructura el índice de la barra necesaria, así como para determinar en qué línea (apoyo o resistencia) va a localizarse el extremo buscado.
  3. El parámetro del tipo bool, que determina en qué línea (apoyo o resistencia) se encuentra la primera barra-extremo. Si no sabemos eso, no se podrá determinar por el número ordinal en qué línea se debe localizar la barra buscada.
int Ext_2(double low,    //nivel RSI inferior, nivel de sobreventa
          double high,   //nivel RSI superior, nivel de sobrecompra
          int bars,      //cantidad de barras analizadas, para no copiar en la matriz datos innecesarios
          int h_rsi,     //manejador del indicador RSI
          string symbol, //símbolo del gráfico
          st_Bars &bars_ext,//estructura que contiene los índices de las barras encontradas
          char n_bar,    //número ordinal de la barra que debe ser encontrada (2, 3 o 4)
          float distans, //distancia para la desviación de uno de los niveles del indicador
          bool first_ext,//tipo de la primera barra
          ENUM_TIMEFRAMES period_trade)//periodo del gráfico

A nivel global, creamos una variable del tipo de estructura que deberá contener los índices de las 4 barras-extremos:

struct st_Bars //incialización de la estructura
  {
   int               Bar_1;
   int               Bar_2;
   int               Bar_3;
   int               Bar_4;
  };

st_Bars Bars_Ext; //declaración de la variable del tipo de estructura

Para determinar la línea del indicador en el que se encontrará el extremo buscado, hay que crear de forma preliminar dos variables del tipo bool:

bool high_level= false; //variables para determinar el tipo de barra buscadaа
bool low_level = false; //...

Si el número ordinal de la barra-extremo buscada es igual a 2 o 4, y la primera barra-extremo se encuentra en la línea de apoyo, entonces la barra buscada debe encontrarse en la línea de resistencia y, por consiguiente, se deberán analizar las barras en las que el valor RSI es mayor o igual al nivel superior (parámetro high). Si el número ordinal de la barra-extremo buscada es igual a 3, y la primera barra-extremo se encuentra en la línea de apoyo, entonces la barra buscada debe encontrarse también en esta línea. Si la primera barra-extremo se encuentra en la línea de resistencia, entonces la posición de la barra buscada se determina por analogía.

if(n_bar!=3)
{
   if(first_ext==true)//si el primer punto ha sido el máximo
   {
      low_level=true;//entonces este deberá ser el mínimo
      if(distans>=0) low=low+distans; //si es necesario, desplazamos el nivel RSI inferior
   }
   else //si es el mínimo
   {
      high_level = true;
      if(distans>=0) high=high-distans; //si es necesario, desplazamos el nivel RSI superior
   }
}
else
{
   if(first_ext==false)//si el primer punto ha sido el mínimo
   {
      low_level=true;//entonces este deberá ser también el mínimo
      if(distans>=0) high=high-distans; //si es necesario, desplazamos el nivel RSI superior
   }
   else //si es el máximo
   {
      high_level = true;
      if(distans>=0) low=low+distans; //si es necesario, desplazamos el nivel RSI inferior
   }
}

Otra variable más del tipo bool es necesaria para determinar el momento cuando el extremo buscado es localizado y se debe finalizar el análisis de barras.

bool _start = false;    

Cambiamos el valor de esta variable a true, cuando encontramos en la historia el diapasón necesario de barras para el análisis. El análisis de barras finaliza si _start = true, y cuando low_level = true la línea de indicador RSI cruza el nivel high, y cuando high_level = true la línea de indicador RSI cruza el nivel low.

if(_start==true && ((low_level==true && rsi>=high) || (high_level==true && rsi<=low)))
  break; //salimos del ciclo, si el segundo extremo ya ha sido localizado, y RSI ya ha cruzado el nivel opuesto

El ciclo de búsqueda de la barra-extremo tiene el siguiente aspecto:

for(int i=bar_1;i<bars;i++) //analizamos las barras restantes
{
   rsi=m_rsi[i];
   price_max = NormalizeDouble(m_high[i], digits);
   price_min = NormalizeDouble(m_low[i], digits);
   if(_start==true && ((low_level==true && rsi>=high) || (high_level==true && rsi<=low)))
   {
      break; //salimos del ciclo, si el segundo extremo ya ha sido localizado, y RSI ya ha cruzado el nivel opuesto
   }
   if(low_level==true) //si buscamos el extremo mínimo
   {
      if(rsi<=low)
      {
         if(_start==false) _start=true;
         if(price_min<min)
         {
            min=price_min;
            index_bar=i;
         }
      }
   }
   else //si buscamos el extremo máximo
   {
      if(rsi>=high)
      {
         if(_start==false) _start=true;
         if(price_max>=max)
         {
            max=price_max;
            index_bar=i;
         }
      }
   }
}

La variable bar_1 contiene el índice de la barra-extremo anterior, que se calcula con la ayuda del operador switch:

switch(n_bar) //encontramos el índice de la barra anterior
{
   case 2: bar_1 = bars_ext.Bar_1; break;
   case 3: bar_1 = bars_ext.Bar_2; break;
   case 4: bar_1 = bars_ext.Bar_3; break;
}

Para saber en qué línea del indicador (apoyo o resistencia) se encuentra la primera barra-extremo, basta con obtener su índice y el valor del indicador RSI en la barra con el índice obtenido:

bool One_ext(st_Bars &bars_ext, //variable del tipo de estructura para obtener el índice de la primera barra
             string symbol,     //símbolo del gráfico
             int h_rsi,         //manejador del indicador
             double low,        //nivel de sobrecompra establecido de RSI (también se puede usar el nivel high)
             ENUM_TIMEFRAMES period_trade) //periodo del gráfico
  {
   double m_rsi[];               //inicialización de la matriz de datos del indicador
   ArraySetAsSeries(m_rsi,true); //orden de indexación
   CopyBuffer(h_rsi,0,0,bars_ext.Bar_1+1,m_rsi); //llenar la matriz con los datos RSI
   double rsi=m_rsi[bars_ext.Bar_1]; //determinamos el valor RSI en la barra con el primer extremo
   if(rsi<=low)                      //si el valor es menor al extremo inferior,
      return(false);                 //entonces el primer extremo fue el mínimo
   else                              //si no,
   return(true);                     //entonces fue el máximo
  }

Procesando los resultados

Ahora sabemos los índices de las cuatro barras y los precios (low o high) que les corresponden. Para llenar las matrices que corresponderán al valor de las líneas de indicador en cada barra, hay que obtener las ecuaciones de las dos rectas que corresponden a las líneas de apoyo y resistencia. La ecuación de la recta que todos conocemos tiene el aspecto siguiente: y = kx + b. En nuestro caso, "x" es el índice de la barra, "y" es el precio (para la línea de apoyo es el precio low de la vela, para la línea de resistencia, el precio high de la vela).

Para encontrar los valores de los coeficientes "k" y "b", basta con sustiruir los valores correspondientes de las dos barras-extremos conocidas en la ecuación de la recta y combinar las expresiones obtenidas en el sistema de ecuaciones. Como resultado de la solución del sistema obtendremos las siguientes expresiones:

K=(price_2-price_1)/(_bar2-_bar1);  //encontramos el coeficiente K
B=price_1-K*_bar1;                  //encontramos el coeficiente B

donde

double K,B;

estas son las variables globales "K" y "B", que corresponden a los valores de los coeficientes "k" y "b" de la ecuación de la recta;

int _bar1,_bar2;

estos son los índices de las barras ubicados en una línea;

double price_1,price_2;

estos son los precios low de las barras correspondientes, si hay que determinar "K" y "B" para la línea de apoyo, o bien los precios high de las barras correspondientes, si hay que determinar "K" y "B" para la línea de resistencia.

La función presentada más abajo, establece los valores de las variables globales "K" y "B" para la línea de apoyo, si el parámetro "_line" es igual a false, y para la línea de resistencia, si el parámetro "_line" es igual a true:

void Level(bool _line,              //parámetro que determina la línea de (resistencia/apoyo), cuyos coeficientes hay que encontrar
           bool _first_ext,         //tipo del primer extremo (un parámetro que ya le es conocido)
           st_Bars &bars_ext,       //estructura que contiene los índices de las barras
           string _symbol,          //símbolo
           ENUM_TIMEFRAMES _period) //periodo del gráfico
  {
   int bars=Bars_H;           //cantidad de barras analizadas
   double m_high[],m_low[];         //inicialización de las matrices
   ArraySetAsSeries(m_high,true);   //las matrices se indexan desde el primer elemento
   ArraySetAsSeries(m_low,true);    //...
   int h_high = CopyHigh(_symbol, _period, 0, bars, m_high); //llenamos la matriz de los precios máximos de las velas
   int h_low = CopyLow(_symbol, _period, 0, bars, m_low);    //llenamos la matriz de los precios mínimos de las velas
   double price_1,price_2;
   int _bar1,_bar2;
   int digits=(int)SymbolInfoInteger(_symbol,SYMBOL_DIGITS);//cantidad de decimales después de la coma del símbolo actual
   if(_line==true)                                          //si es necesaria la línea de resistencia
     {
      if(_first_ext==true) //si el primer extremo es el máximo
        {
         price_1 = NormalizeDouble(m_high[bars_ext.Bar_1], digits);
         price_2 = NormalizeDouble(m_high[bars_ext.Bar_3], digits);
         _bar1 = bars_ext.Bar_1;
         _bar2 = bars_ext.Bar_3;
        }
      else                                                  //si es el mínimo
        {
         price_1 = NormalizeDouble(m_high[bars_ext.Bar_2], digits);
         price_2 = NormalizeDouble(m_high[bars_ext.Bar_4], digits);
         _bar1 = bars_ext.Bar_2;
         _bar2 = bars_ext.Bar_4;
        }
     }
   else                                                     //si es necesaria la línea de apoyo
     {
      if(_first_ext==true) //si el primer extremo es el máximo
        {
         price_1 = NormalizeDouble(m_low[bars_ext.Bar_2], digits);
         price_2 = NormalizeDouble(m_low[bars_ext.Bar_4], digits);
         _bar1 = bars_ext.Bar_2;
         _bar2 = bars_ext.Bar_4;
        }
      else                                                  //si es el mínimo
        {
         price_1 = NormalizeDouble(m_low[bars_ext.Bar_1], digits);
         price_2 = NormalizeDouble(m_low[bars_ext.Bar_3], digits);
         _bar1 = bars_ext.Bar_1;
         _bar2 = bars_ext.Bar_3;
        }
     }
   K=(price_2-price_1)/(_bar2-_bar1);  //encontramos el coeficiente K
   B=price_1-K*_bar1;                  //encontramos el coeficiente B
  }

La ecuación de la recta tiene el aspecto: y = kx + b, como valores del eje "y" se usa el precio del instrumento financiero, como valores del eje "x", el índice de la barra. Si usamos como valores del eje "x" la cantidad de segundos transcurridos desde el 1 de enero de 1970, entonces, en la zona de los festivos, el gráfico de la recta mostrará resultados "caóticos", por eso he usado los índices de las barras.

Desde la función "OnCalculate", la función "Level" se llama dos veces: la primera vez, antes de llenar la matriz para la línea de resistencia, la segunda, para llenar la matriz con los valores de los precios para la línea de apoyo:

for(int i=0;i<Bars_H;i++)
{
   resistanceBuffer[i]=NormalizeDouble(K*i+B,Dig);
}
Level(false,First_Ext,Bars_Ext,Trade_Symbol,Period_Trade); //obtenemos los coeficientes K y B para la línea de apoyo
for(int i=0;i<Bars_H;i++)
{
   supportBuffer[i]=NormalizeDouble(K*i+B,Dig);
}

Ejemplo de un indicador que representa los niveles de apoyo y resistencia

El resultado del funcionamiento del indicador, que usa todas las funciones mostradas más arriba, y que construye las líneas de apoyo y resistencia, tendrá el aspecto siguiente:

Resultado del funcionamiento del indicador

Fig.7. Resultado del funcionamiento del indicador

El indicador está construido de tal forma, que después de formar la nueva barra-extremo, los valores de las matrices de las líneas de apoyo y resistencia pueden ser cambiados, y entonces los niveles se redibujarán de forma automática. Sin embargo, si calculamos y memorizamos el ángulo de inclinación de una de las líneas con respecto al eje temporal del gráfico, y a continuación lo comparamos con el nuevo ángulo de inclinación de esta misma línea, entonces podemos llegar a la conclusión de que la tendencia sobre la que hablábamos al inicio del artículo se acelera y ralentiza.

El código completo del indicador se encuentra en el archivo adjunto a este artículo.


Conclusión

Ciertamente, resulta más sencillo construir de forma manual este tipo de líneas, puesto que para ello no hay necesidad de elegir los parámetros del indicador para cada símbolo y periodo. Sin embargo, este indicador puede servir como parte principal o como uno de los componentes de una estrategia implementada en un sistema comercial automático. Una vez recibidos los datos de las líneas del indicador, es posible analizar su ángulo de inclinación, la dirección de la tendencia y definir la figura gráfica formada por estas líneas. Y todo esto, en conclusión, da la posibilidad de analizar la fuerza de la señal de compra o de venta, y de comerciar tanto dentro del canal de precios, como en las "rupturas" de las líneas de apoyo y resistencia.

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

Archivos adjuntos |
s_rind.mq5 (34.78 KB)
Cómo elegir correctamente un producto para comprar en el Mercado. Guía paso a paso Cómo elegir correctamente un producto para comprar en el Mercado. Guía paso a paso

En esta guía paso a paso, se describen las recomendaciones y consejos que pueden ayudarle a entender y decidir qué producto debe comprar en el Mercado. En este artículo intentaremos entender cómo encontrar un producto adecuado, cómo cribar lo que no necesitamos, cómo determinar la efectividad de un producto y en qué medida le será necesario a usted mismo.

Cómo elegir correctamente una señal comercial para alquilar en el Mercado. Guía paso a paso Cómo elegir correctamente una señal comercial para alquilar en el Mercado. Guía paso a paso

En esta guía paso a paso se profundiza en el servicio de señales comerciales, en su estudio y en la selección sistemática para el posterior alquiler.

Recetas MQL5 - Escribiendo nuestra propia profundidad de mercado Recetas MQL5 - Escribiendo nuestra propia profundidad de mercado

Este artículo enseñará a los lectores a trabajar de forma programática con la profundidad de mercado, también describirá el principio de funcionamiento de la clase CMarketBook, que ampliará de forma orgánica la biblioteca estándar de clases MQL5 y proporcionará métodos cómodos para trabajar con la profundidad del mercado.

Experto comercial universal: Los modos comerciales de las estrategias (Parte 1) Experto comercial universal: Los modos comerciales de las estrategias (Parte 1)

Cada escritor de expertos, independientemente de su nivel de preparación, se encuentra todos los días con las mismas tareas comerciales y problemas algorítmicos, que debe resolver de una forma u otra para organizar un proceso comercial fiable. Este artículo describe las capacidades del motor comercial CStrategy, capaz de ocuparse de la resolución de estas tareas y de proporcionar al usuario mecanismos cómodos para describir sus ideas sobre trading.