Ejemplo del indicador que construye las líneas de soporte y resistencia

Andrey Kisselyov | 28 junio, 2017


Introducción

Con ayuda de este artículo, el modo de previsión de los niveles de precios más antiguo en el análisis técnico estará disponible para todos quienes desean usarlo en su trabajo. Usted podrá no sólo aplicar el indicador de la construcción de las líneas tendenciales (líneas de soporte y resistencia), sino también comprenderá qué fácil implementar eso. Ahora Usted podrá formular personalmente las condiciones para construir las líneas que considere necesarias, haciendo pequeñas modificaciones en el código del indicador a su medida.

¡ATENCIÓN! La presente descripción, igual que todo lo expuesto en este artículo, no se refiere a las recomendaciones respecto al trading y supone un carácter puramente informativo. El autor no se hace responsable de sus acciones, inclusive las pérdidas o ganancias obtenidas durante el trabajo según la metodología descrita.


Qué son las líneas de soporte y resistencia

Para comprender algo, en primer lugar, es necesario definir el objeto de la investigación. A continuación, se dan las definiciones para las líneas de soporte y resistencia, que según mi opinión, se reflejan completamente su esencia.

La línea de resistencia (Resistance) es una línea del movimiento del precio en un determinado intervalo de tiempo por encima de la cual no sube.

La línea de soporte (Support) es una línea del movimiento del precio en un determinado intervalo de tiempo por debajo de la cual no baja.

La línea de soporte puede ser tanto horizontal, como inclinada en algún lado. Pero el papel de la línea va a cambiar dependiendo de lo que vemos en el gráfico. Vamos a hablar de la línea de soporte. Todo lo dicho será cierto para la líneas de resistencia, con la única diferencia de que son espejadas.
Cuando la línea es horizontal, el precio se encuentra en el margen del precio. El papel que desempeña la línea consiste en la apertura de las órdenes de compra, registro del beneficio de las órdenes de venta.
Cuando la línea va hacia arriba, el precio se encuentra en la tendencia alcista. El papel de la línea es el nivel de la apertura de las órdenes de compra.
Cuando la línea va hacia abajo, el precio está en la tendencia bajista. El papel de la línea es el nivel de la fijación de las órdenes de venta.

Como se puede ver de la definición, cualquiera de estas líneas es una cierta barrera para el movimiento del precio en una dirección determinada. Eso, en su lugar, permite suponer que el precio se aparte de la línea e irá en la dirección necesaria: si es la línea de soporte, entonces irá hacia arriba, si es la línea de resistencia, hacia abajo. Si la línea se ha roto y el precio se ha ido fuera de sus límites, sacamos la conclusión de que la tendencia se ha terminado en esta dirección. Eso no significa que el precio va a cambiar su dirección, pero Usted puede decir con seguridad que la tendencia confronta dificultades en continuar el movimiento. Será lógico vincular la línea de resistencia con el movimiento descendiente del precio, y la línea de soporte, con el movimiento ascendiente. En este caso, las líneas apuntan al trader en qué dirección exactamente se mueve el mercado: arriba o abajo.

También se puede trazar las líneas horizontales. Eso va a significar la presencia del precio en un determinado canal. Por ejemplo, el precio no puede caer por debajo de 1,1545 y no puede subir por encima de 1,1834 en un determinado intervalo de tiempo. Es posible construir también la línea de resistencia en el movimiento ascendiente del precio igualmente que la línea de soporte en el movimiento descendiente, pero en este caso serán las líneas del registro del beneficio para las transacciones abiertas por Usted en la dirección del movimiento del precio. Vamos a considerar la construcción de las líneas inclinadas de soporte y resistencia, así como construiremos los niveles horizontales de soporte y resistencia.


Condiciones de selección del punto inicial para construir la línea inclinada

¿Qué parámetros es necesario coger para construir correctamente las líneas en el gráfico en modo automático?

Puesto que la línea de resistencia no permite al precio subir, es más lógico construirla en los picos, y la línea de soporte que no permite que el precio caiga, en los valles. Sin alambicar demasiado, vamos a aplicar el indicador Fractal de Bill Williams del terminal MetaTrader 5 y veremos los puntos posibles de construcción sobre el gráfico. En el gráfico podemos ver qué fractal tenemos que coger como punto inicial del cálculo. Para la línea de resistencia es de desear que sea el fractal superior en el gráfico, por encima del cual no haya ningún fractal y que el precio no suba por encima de él. Para la línea de soporte, respectivamente, será el fractal más bajo, por debajo del cual no haya fractales en el gráfico. Aquí se considera no todo el gráfico, sino sólo la parte que vemos y la que vamos a analizar. De eso se deduce una cierta condición que podemos aplicar en la construcción: el fractal superior debe estar por encima de dos fractales adyacentes, y el fractal inferior, por debajo e sus «vecinos». Pues bien, ya tenemos un punto de referencia.

Condiciones de selección del segundo punto para construir la línea inclinada

Puesto que cualquier línea debe construirse como mínimo a base de 2 puntos, tenemos que formalizar las reglas de selección del segundo punto para nuestras líneas de soporte y resistencia.

¿Qué criterios vamos a aplicar a la selección del segundo punto? En primer lugar, podemos coger el segundo fractal que va después de nuestro primer punto: eso mostrará la línea más cercana. Pero podemos usar otras reglas de la selección, por ejemplo, el punto más alto en el gráfico, la línea a través del cual el precio todavía no ha atravesado hacia arriba para la línea de resistencia (o el punto más bajo en el gráfico la línea a través del cual el precio todavía no ha atravesado hacia abajo para la línea de soporte). Usted puede determinar sus propias reglas para seleccionar el segundo punto. Pero nosotros nos quedamos con el segundo fractal más cercano que usaremos para construir las líneas de soporte y resistencia.  

selección de puntos para construir las líneas


Condiciones para el reseteo de las líneas y la búsqueda de nuevos puntos de construcción para la línea inclinada

Ya tenemos los puntos de construcción de las líneas. Ahora estaría bien determinar cuando nuestras líneas se terminan. Para la línea de resistencia, sería natural coger la ruptura hacia arriba como la condición de su terminación, y para la línea de soporte, la ruptura hacia abajo. Y como a veces el precio rompe las líneas en varios puntos y luego se rebota, establecemos el error hasta el que la línea no va a considerarse rota. Esto nos servirá de un cierto seguro contra la cancelación falsa de las líneas.

Además, hay que tomar en cuenta que el precio a veces se va muy lejos del nivel y no vuelve hacia la línea durante largo tiempo. En los ajustes, vamos a establecer el largo máximo permitido de la línea en barras. Eso nos dará la posibilidad de empezar a trazar nueva línea si de repente la anterior «se queda colgada en el aire». Puesto que el movimiento del precio no puede tener 2 líneas de resistencia y 2 líneas de soporte a la vez, es lógico suponer que una vez formada la línea, ella seguirá actuando hasta que no sea rota.  Por consiguiente, vamos a buscar las condiciones para la construcción de una línea nueva ya después de su terminación.

En cuanto se rompa la línea actual, esperamos a que se forman las condiciones para el trazado de la línea nueva. Para cada línea, le vamos a asignar su propio búfer y vamos a formar cada una de ellas por separado. Eso permitirá observar cómo van a luchar los toros y los osos. Por consecuencia, para el primer punto podemos seleccionar el fractal más alto (para la resistencia) y el fractal más bajo (para el soporte). El segundo punto será el siguiente punto similar: alto (para la resistencia) o bajo (para el soporte). Las condiciones para la construcción están listas. Nos queda implementar todos eso en forma del código del indicador. Vamos a escribirlo.

Ejemplo de implementación de la construcción de las líneas a base del indicador para las líneas inclinadas

Lo primero que vamos a hacer es crear una plantilla según los ajustes estándar. Luego creamos dos búferes: para la resistencia y el soporte Introducimos los ajustes Pips_ (valor por el que ha sido rota la línea) y MaxBars (el largo máximo permitido de la línea). Pues, con eso el procedimiento automático de la creación del indicador se ha terminado. Luego empieza un trabajo creativo muy cuidadoso.

Al iniciar el indicador, comprobamos donde estamos. Si el indicador se inicia por primera vez, determinamos el inicio como la segunda barra para no contar las dos primeras en las que no pueden formarse los fractales por definición. Según Bill Williams, el fractal es un pico (valle) que está por encima (por debajo) de dos picos (valles) adyacentes a la izquierda y dos a la derecha. 

Si nuestro indicador ya ha sido iniciado, calculamos el indicador desde la última barra calculada.

   int limit=prev_calculated;
   if(limit>3)limit-=3;
   if(limit<2)limit=2;

No vamos a copiar el búfer desde el indicador Fractal de Bill Williams, sino escribiremos un par de funciones que van a comprobar si nuestra barra es un fractal o no. No olvidemos resguardarnos de los errores del acceso al búfer: activamos el procesamiento en caso de los valores no planeadas.

bool up(const double &h[],int q)
  {
// comprobamos la barra por la presencia de dos barras como mínimo después de ella, 
// si después de nuestra barra hay menos de dos barras, según las reglas no puede considerarse como fractal
// en este caso devolvemos false, sin seguir verificando
   if(q>=ArraySize(h)-2)return(false);
// comprobamos la barra por la presencia de dos barras como mínimo antes de ella, 
// si antes de nuestra barra hay menos de dos barras, según las reglas no puede considerarse como fractal
// en este caso devolvemos false, sin seguir verificando
   if(q<2)return(false);
//--- comprobamos si nuestra barra es un fractal Si es así, devolvemos true
   if(h[q]>=h[q-1])
      if(h[q]>=h[q-2])
         if(h[q]>h[q+1])
            if(h[q]>h[q+2])
               return(true);
// si hemos superado todas las comprobaciones y todavía seguimos en el bloque, la barra no es un fractal, devolvemos false
   return(false);
  }
//+------------------------------------------------------------------+
bool down(const double &h[],int q)
  {
// en este bloque todo es lo mismo que en el anterior
   if(q>=ArraySize(h)-2)return(false);
   if(q<2)return(false);
   if(h[q]<=h[q-1])
      if(h[q]<=h[q-2])
         if(h[q]<h[q+1])
            if(h[q]<h[q+2])
               return(true);
   return(false);
  }

Luego, hay que encontrar 1 barra en el array HIGH y comprobarla según nuestros parámetros. Si los parámetros corresponden, la recordamos y buscamos el punto 2 para construir la línea. De los contrario, vamos a la otra barra.

for(int w=limit;w<rates_total;w++)
  {
   if(up(high,w))                  // comprobamos la presencia del fractal en esta barra
     {
      if(r1==0)r1=w;               // si es fractal y no tenemos el 1 pico, establecemos el 1 pico
     }
  }

Después de encontrar el primer fractal, buscamos el siguiente. Además, hay que recordar que debe ser más bajo que nuestra primera barra, y por tanto, si es más alto, hay que pasar un nuevo valor al 1 fractal.

if(high[w]>=high[r1])r1=w;                   // comparamos con el primer pico. Si el fractal es más alto, consideramos este pico como el primero
else
   {
    r2=w;                                    // hemos obtenido el valor del segundo pico     
    speedr=(high[r2]-high[r1])/(r2-r1);      // hemos calculado la velocidad de la línea
    w=r1-1;                                  // volvemos para dibujar nueva línea
   }

Después de encontrar el segundo fractal que corresponde a todas nuestras exigencias, calculamos la velocidad del movimiento de la línea y procedemos a su construcción a partir del primer fractal (después de volver hacia él). Para evitar los errores que inevitablemente se acumulan durante la construcción desde el punto anterior, nosotros vamos a considerar la línea a partir del comienzo de su construcción. Por tanto, el error de la construcción en cada punto no va a superar el error del indicador. Inmediatamente comprobamos si la línea ha sido rota según nuestras condiciones, y si es así, esperamos nueva construcción. Cabe mencionar que la comprobación de la ruptura se realiza solamente después del segundo fractal. El comportamiento del precio entre los fractales no nos interesa. Para la línea de soporte, los cálculos son los mismos.

ResistanceBuffer[w]=high[r1]+speedr*(w-r1);               // para que el error sea mínimo, calculamos a partir del pico
if(w>r2)                                                  // comprobamos si la línea ha sido rota o no
if(high[w]>ResistanceBuffer[w]+Pips_*_Point){r1=0;r2=0;}

Pues, este aspecto tiene el indicador con diferentes ajustes.

ind1

ind2

ind3

Son varias indicadores en el gráfico a la vez.

ind4

ind5

Selección de los puntos para construir los niveles horizontales de soporte y resistencia.

Para construir los niveles horizontales, necesitaremos sólo un punto. Eso nos facilitará la tarea. Existen muchas opciones para seleccionar los puntos de construcción. Mostraré sólo unas de ellas:

  • niveles de Fibonacci del cálculo del día anterior (barra);
  • niveles de Fibonacci teniendo en cuenta ATP medio del día, a base del diapasón medio de los precios del día pasado;
  • número máximo de fractales en un diapasón determinado;
  • acumulación de los máximos o mínimos, precios de apertura o de cierre de las barras en un diapasón determinado;
  • niveles de acumulaciones de los volúmenes para un precio determinado (perfil del mercado);
  • nivel de la reversa de precios en la base de figuras;
  • etc.

Usted puede agregar aquí cualquier condición que considere necesaria pero lo principal consiste en lo siguiente: estamos buscando la condición según la cual el precio se rebota de uno u otro nivel. Y si la frecuencia de la activación de esta condición es mayor, nuestra línea horizontal de soporte y resistencia será más eficaz. Como ejemplo vamos a considerar la primera versión de la construcción. Vamos a coger el movimiento del precio en el transcurso del día.

movimiento del día

Como podemos ver, el precio ya sube, ya baja. El extremo del día siempre representa un nivel del que el precio se ha rebotado y ha ido a otra dirección. Muy raras veces ocurre que el precio termina su movimiento del día en el máximo o el mínimo. Por consiguiente, podemos considerar cualquier máximo del día como nivel de resistencia, y el mínimo, como nivel de soprte.

Puesto que en nuestro caso el nivel se forma al final del día de trading, vamos a usarlo el siguiente día de trading, como una referencia para las acciones comerciales. Pero el mercado no se queda parado y el precio cambia constantemente su dirección y el diapasón. Nosotros implementamos la posibilidad de ver varios niveles calculados respecto a los precios del día anterior. Bajo el día anterior, se supone la barra anterior en algún gráfico del timeframe mayor que usamos para tradear. Por consiguiente, la opción de la selección del timeframe debe estar implementada en el indicador. A los cálculos les vamos a añadir un coeficiente que nos permita mover las líneas para uno u otro lado respecto a los precios del día anterior. Usaremos su propio coeficiente para cada nivel. Vamos a escribir nuestro indicador.

Ejemplo de implementación del indicador de los niveles horizontales de soporte y resistencia

Primero, creamos un indicador con propiedades estándar. Lo vamos a llamar igual como el anterior, sólo añadimos la letra H al final, lo que significará que es «horizontal». Especificamos el timeframe en el que vamos a coger los datos, 3 coeficientes para cada par de líneas, 7 búferes para trazar los niveles.

Cuando empezamos a escribir, hay que tomar en cuenta que los datos en el timeframe mayor los vamos a coger en tres búferes separados: para el tiempo, los máximos y los mínimos. Escribimos la función del copiado de los datos a nuestros arrays, sin olvidar aumentar su tamaño si hace falta.

void array_copy(int b_)
  {
   ArrayResize(time_tf,b_);                         // cambiamos el tamaño del búfer según los datos existentes
   ArrayResize(high_tf,b_);
   ArrayResize(low_tf,b_);

   int total=b_-bars_tf;                            // calculamos qué copiado de datos hace falta realizar

   CopyTime(_Symbol,Period_TF,0,total,time_tf)      // copiamos los datos que faltan al array
   CopyHigh(_Symbol,Period_TF,0,total,high_tf);
   CopyLow(_Symbol,Period_TF,0,total,low_tf);

   bars_tf=b_;                                      // recordamos el tamaño del array y la cantidad de datos
  }

Los datos han sido recibidos, hay que procesarlos e introducir los cálculos en los arrays.Puesto que todos los cálculos de los datos van a ser idénticos, sería lógico introducir los cálculos en la misma función y pasar los datos a ella.

void f1(double k_fibo,int q,int r,const datetime &time_[],double &b1[],double &b2[])
  {
   for(int w=q;w<r;w++)
     {
      int b=f2(time_[w]);         // buscamos la hora de la barra actual en el array del timeframe mayor
      double h=high_tf[b];        // obtenemos el máximo
      double l=low_tf[b];         // obtenemos el mínimo
      double hl=h-l;              // encontramos el diapasón del movimiento
      b1[w]=h-hl*k_fibo;          // introducimos el valor calculado en el búfer del soporte
      b2[w]=l+hl*k_fibo;          // introducimos el valor calculado en el búfer de la resistencia
     }
  }

Puesto que los diapasones de tiempo no son iguales, necesitamos encontrar la hora de la barra del array actual en el array de tiempo del array mayor. Lo haremos en el siguiente fragmento del código.

int f2(datetime t_)
  {
   int b_=ArrayBsearch(time_tf,t_);      // buscamos la barra con el procedimiento estándar de la búsqueda en los arrays ordenados
   if(time_tf[b_]>t_)b_--;               // si se devuelve la hora de la barra cercana con la hora mayor, la reducimos a 1
   return(MathMax(0,b_-1));              // no olvidamos devolver la barra teniendo en cuenta las limitaciones por el mínimo
  }

Pues, éste es el indicador que nos va a dibujar los niveles necesarios de soporte y resistencia respecto a los precios del día anterior.
   int limit=prev_calculated;
   if(limit>0)limit--;

   int bar=Bars(_Symbol,Period_TF);
   if(bars_tf==0 || bar>bars_tf)array_copy(bar);

   f1(0.5,limit,rates_total,time,buffer7,buffer7);           // dibujamos la mediana
   f1(K_Fibo_1,limit,rates_total,time,buffer1,buffer2);      // dibujamos los niveles para el coeficiente 1
   f1(K_Fibo_2,limit,rates_total,time,buffer3,buffer4);      // dibujamos los niveles para el coeficiente 2
   f1(K_Fibo_3,limit,rates_total,time,buffer5,buffer6);      // dibujamos los niveles para el coeficiente 3

Pues así, sin complicaciones, hemos obtenido el indicador de los niveles horizontales de soporte y resistencia. En el gráfico, tendrá el siguiente aspecto.

Como podemos observar en la captura de pantalla, el precio se aparta de los niveles construidos por el indicador. Durante bastante tiempo, uno de ellos nos servía de soporte. El ajuste de los niveles más eficaces es la cuestión de la técnica y optimización de los parámetros de un sistema de trading concreto.

Niveles de soporte y resistencia a base de las medias móviles

Podía pensarse que el tema ya estaba agotado: ¿qué más se puede decir además de las líneas tendenciales horizontales de soporte y resistencia?

Preste atención en los indicadores a base de las medias móviles. Claro que entre los primeros mencionaremos Moving Average, luego — Bollinger Bands y Envelopes, que forman parte del conjunto estándar del terminal. Parece que estos indicadores están hechos para mostrar los niveles de soporte y resistencia en el gráfico. Abrimos las propiedades del indicador en la pestaña «Niveles» y escribimos ahí un par de niveles con el signo menos y otro par con el signo más. Obtenemos aproximadamente la siguiente imagen:

Obtenemos los mismos resultados para los demás indicadores. El precio «ve» los niveles y se aparta de ellos, igual como de los niveles de soporte y resistencia habituales.

Conclusión

Al final, me gustaría remarcar una particularidad importante de los niveles de soporte y resistencia. Después de que el precio rompa el nivel, la línea de soporte se convierte muy a menudo en la línea de resistencia, y al revés. El trabajo de los niveles de soporte y resistencia requiere las señales adicionales para abrir las transacciones en una u otra dirección, ya que Usted no sabe exactamente qué pasará con el precio cuando se alcance este nivel. Pero en el momento cuando se acerca a un nivel, hay que estar muy atento. El desarrollo de la estrategia del trabajo a base de los niveles no es el tema del presente artículo.


Gracias por su atención.