Estrategia de trading basada en la dirección y velocidad del movimiento de los precios

Alexander Fedosov | 10 mayo, 2016

Introducción

Se sabe muy bien que al moverse el precio, todos los mercados financieros tienen algún tipo de movimiento cíclico en forma de onda, que primero aumenta y luego disminuye. Se puede ver esto claramente en los gráficos con períodos de tiempo mayores. La naturaleza sinusoidal indica que el precio tiene una cierta persistencia. De lo contrario, se vería como un zigzag; fuertes movimientos hacia arriba y abajo en intervalos de tiempo cortos. Vamos a tratar de averiguar por qué ocurre este fenómeno y cómo se puede utilizar en el trading.


Inicio y persistencia del precio

Se puede caracterizar cualquier movimiento en nuestro mundo por su dirección, aceleración y velocidad. Esto se aplica también a los mercados financieros. De esto se desprende una regla importante que dice que un precio que se mueve con fuerza en una dirección nunca se detiene de manera inmediata. Se puede comparar esto con un tren: cuando un tren que a toda velocidad frena, la distancia de frenado puede llegar hasta un kilómetro.

Entonces, ¿cuándo empieza una tendencia? Cuando cambia el punto de vista de la mayoría de los participantes en el mercado por cualquier motivo, ya sea un cambio de política global, el cambio de factores importantes que influyen en el mercado o las noticias. De ahí se forma una opinión colectiva y empieza la tendencia. Los participantes en el mercado están cada vez más convencidos de que el movimiento está ganando fuerza y que seguirá así. Tiene una dirección, una aceleración y una velocidad determinada, ya que los grandes protagonistas entran al mercado con posiciones muy grandes. En este punto, aquellos que entraron al principio del movimiento y le dieron impulso y velocidad empiezan a ganar. Otros traders entran al mercado más tarde y con precios menos atractivos. Pero a diferencia de los primeros, intentan utilizar la dirección del movimiento del precio.

Se acaba la tendencia al producirse cambios. ¿Por qué sigue el precio moviéndose en la misma dirección? ¿Por qué no cambia de repente? Esto se debe a que aquellos que estaban acelerando y empujando el precio en esta dirección, empiezan a cerrar sus posiciones, haciendo desaparecer la tendencia. Y aquellos que sólo estaban "siguiendo la corriente", siguen creyendo que no ha cambiado nada y tratan incluso de mover el precio. Pero este "tren" no sólo se ha parado, sino que empieza a moverse en la dirección contraria y aquí termina la historia.


La idea del trading y cómo evitar que nos pille el "tren"

La idea de usar el movimiento y la rentabilidad está basada en el análisis de la tendencia actual en profundidad, es decir, su magnitud y duración.

Usaremos indicadores clásicos para representar un ejemplo: RSI (índice de fuerza relativa) y AC (Aceleración/Deceleración).

1. Las condiciones para entrar al mercado

Usaremos el primer indicador para medir la magnitud y profundidad del movimiento actual del precio.

Vamos a establecer los niveles para determinar la distancia y la profundidad:

Fig. 1 Niveles del oscilador RSI

Fig. 1 Niveles del oscilador RSI

Criterios para evaluar la profundidad del movimiento del precio:

Zonas de movimientos del precio de compra:

Vamos a asignar del mismo modo los índices de los precios de venta:

Podemos describir estas condiciones en MQL4 de la siguiente manera:

//--- determining buy index
   double rsi=iRSI(Symbol(),tf,period,PRICE_CLOSE,0);
   index_rsi = 0;
   if(rsi>90.0) index_rsi=4;
   else if( rsi > 80.0 ) 
   index_rsi = 3;
   else if( rsi > 70.0 ) 
   index_rsi = 2;
   else if( rsi > 60.0 ) 
   index_rsi = 1;
   else if( rsi < 10.0 ) 
   index_rsi = -4;
   else if( rsi < 20.0 ) 
   index_rsi = -3;
   else if( rsi < 30.0 ) 
   index_rsi = -2;
   else if( rsi < 40.0 ) 
   index_rsi = -1;

Usaremos el indicador AC de Bill William para medir la velocidad y la aceleración del movimiento actual.

Fig. 2 El indicador AC

Fig. 2 El indicador AC

Criterios para evaluar la velocidad:

Incremento.

Caída.

Esta sería su implementación en MQL4:

double ac[];
   ArrayResize(ac,5);
   for(int i=0; i<5; i++)
      ac[i]=iAC(Symbol(),tf,i);

   index_ac=0;
//--- buy signal
   if(ac[0]>ac[1])
      index_ac=1;
   else if(ac[0]>ac[1] && ac[1]>ac[2])
      index_ac=2;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3])
      index_ac=3;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3] && ac[3]>ac[4])
      index_ac=4;
//--- sell signal
   else if(ac[0]<ac[1])
      index_ac=-1;
   else if(ac[0]<ac[1] && ac[1]<ac[2])
      index_ac=-2;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3])
      index_ac=-3;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3] && ac[3]<ac[4])
      index_ac=-4;

Si disponemos de los índices de profundidad de los movimientos, así como su velocidad, podemos formular y clasificar algunas condiciones para entrar al mercado.

Estas son las condiciones de entrada al mercado:

//--- buy signal
if(index_rsi==1 && index_ac>=1) //possible buy movement
if(index_rsi==2 && index_ac>=1) //weak buy movement
if(index_rsi==3 && index_ac==1) //weak buy movement
if(index_rsi==3 && index_ac>=2) //moderate buy movement
if(index_rsi==4 && index_ac>=1) //strong buy movement

//--- sell signal  
if(index_rsi==-1 && index_ac<=-1) //possible sell movement
if(index_rsi==-2 && index_ac<=-1) //weak sell movement
if(index_rsi==-3 && index_ac==-1) //weak sell movement
if(index_rsi==-3 && index_ac<=-2) //moderate sell movement
if(index_rsi==-4 && index_ac<=-1) //strong sell movement

//--- flat 
if(index_rsi==0) 


2. Las condiciones para salir del mercado

Hemos definido y clasificado los parámetros de entrada. Para explicar cómo se han formulado las condiciones de salida del mercado, voy a utilizar la siguiente analogía.

Piense, por ejemplo, en una pelota de goma para niños. Y vamos a pensar en lo que pasaría si lanzamos esta pelota al agua desde un punto muy alto. Primero caerá y aumentará su velocidad debido a la aceleración de la gravedad. Después choca contra el agua. Pero tiene bastante velocidad para sumergirse hasta cierta profundidad y perderá velocidad que llega a tener un valor negativo. La pelota está expuesta al efecto del principio de Arquímedes, que la empuja hacia la superficie.

Vamos a ver ahora este ejemplo:

Los dos principales factores que determinan la rentabilidad del mercado son los siguientes:

  1. Determinar a tiempo el momento en el cual fue lanzada la pelota al agua y comprar y vender.
  2. Cerrar una posición cuando la pelota entra en el agua y se ralentiza su movimiento.

Es muy difícil determinar la duración y la distancia de caída de la pelota ya que no podemos ver a una persona lanzando una pelota al agua en los mercados financieros. Sólo podemos ver la velocidad y la dirección de la pelota.

Ya hemos descrito la profundidad del movimiento del precio y los criterios de evaluación de la velocidad.

Vamos a definir ahora las condiciones de salida:

//--- possible downward reversal
if(index_rsi>2 && index_ac<0) 

Si el precio dejó de crecer después de mucho tiempo, su aceleración se vuelve negativa (hacia abajo). Esto indica un posible cambio de tendencia.

//--- possible upward reversal
if(index_rsi<-2 && index_ac>0) 

Al igual que en el ejemplo: la pelota estaba cayendo durante mucho tiempo, pero se cayó en el agua que la empujó hacia fuera en la dirección opuesta. Esto indica que es el momento de cerrar posiciones.


3. Aumentar la eficiencia de entrada y salida

Se sabe que algunos de los indicadores en el trading aumentan su velocidad de respuesta a los cambios de tendencia en períodos más largos. Sin embargo, aparecen más señales falsas.

Otra forma de hacerlo consiste en no utilizar períodos más cortos para el cálculo, sino en hacer el seguimiento en varios períodos de tiempo.

Fig. 3 Tendencia en distintos períodos de tiempo en base a señales RSI y AC

Fig. 3 Tendencia en distintos períodos de tiempo en base a señales RSI y AC

La figura muestra claramente la tendencia del movimiento del precio gracias a nuestros criterios y a los indicadores RSI y AC. Vamos a verlo en detalle.

Movimiento y velocidad en M1: movimiento fuerte, el índice AC es 4, el índice de profundidad RSI es 2. M5 tiene la misma profundidad pero la velocidad es igual a 1. M15 tiene el mismo movimiento, pero es menos evidente que en los gráficos de los períodos inferiores. En cuanto a los gráficos de 30 minutos y una hora, se nota claramente que M30 ya tiene una señal y que H1 tiene una ralentización e incluso una posible señal de inversión de tendencia.

Podemos sacar una conclusión importante a partir de este ejemplo:

Si consideramos únicamente H1, colocaremos una orden de venta a la espera de la inversión de la tendencia. Pero si hacemos el análisis en un período de tiempo más corto, la señal sería falsa.


4. Implementación de la estrategia de trading en forma de un Asesor Experto

El código del Asesor Experto:

//+------------------------------------------------------------------+
//|                                                       tester.mq4 |
//|                                                Alexander Fedosov |
//+------------------------------------------------------------------+
#property copyright "Alexander Fedosov"
#property strict
#include <trading.mqh>      //Support library for trade operations
//+------------------------------------------------------------------+
//| Parameters                                                       |
//+------------------------------------------------------------------+
input int             SL = 40;               // Stop loss
input int             TP = 70;               // Take profit
input bool            Lot_perm=true;         // Lot of balance?
input double          lt=0.01;               // Lot
input double          risk = 2;              // Risk of deposit, %
input int             slippage= 5;           // Slippage
input int             magic=2356;            // Magic number
input int             period=8;              // RSI indicator period
input ENUM_TIMEFRAMES tf=PERIOD_CURRENT;     // Working timeframe
int dg,index_rsi,index_ac;
trading tr;
//+------------------------------------------------------------------+
//| Expert Advisor initialization function                           |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- determining variables for auxiliary class of trading functions
//--- language for displaying errors, Russian of by default.
   tr.ruErr=true;
   tr.Magic=magic;
   tr.slipag=slippage;
   tr.Lot_const=Lot_perm;
   tr.Lot=lt;
   tr.Risk=risk;
//--- number of attempts.
   tr.NumTry=5;
//--- determining decimal places on the current chart
   dg=tr.Dig();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Main calculation function                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
   depth_trend();
   speed_ac();
//--- check for presence of open orders
   if(OrdersTotal()<1)
     {
      //--- check of buy conditions
      if(Buy())
         tr.OpnOrd(OP_BUY,tr.Lots(),Ask,SL*dg,TP*dg);
      //--- check of sell conditions
      if(Sell())
         tr.OpnOrd(OP_SELL,tr.Lots(),Bid,SL*dg,TP*dg);
     }
//--- are there open orders?
   if(OrdersTotal()>0)
     {
      //--- check and close sell orders which meet closing conditions.
      if(Sell_close())
         tr.ClosePosAll(OP_SELL);
      //--- check and close buy orders which meet closing conditions.
      if(Buy_close())
         tr.ClosePosAll(OP_BUY);
     }

  }
//+------------------------------------------------------------------+
//| Function for determining the trend depth                         |
//+------------------------------------------------------------------+
void depth_trend()
  {
//--- determining buy index
   double rsi=iRSI(Symbol(),tf,period,PRICE_CLOSE,0);
   index_rsi = 0;
   if(rsi>90.0) index_rsi=4;
   else if(rsi>80.0)
      index_rsi=3;
   else if(rsi>70.0)
      index_rsi=2;
   else if(rsi>60.0)
      index_rsi=1;
   else if(rsi<10.0)
      index_rsi=-4;
   else if(rsi<20.0)
      index_rsi=-3;
   else if(rsi<30.0)
      index_rsi=-2;
   else if(rsi<40.0)
      index_rsi=-1;
  }
//+------------------------------------------------------------------+
//| Function for determining the trend speed                         |
//+------------------------------------------------------------------+
void speed_ac()
  {
   double ac[];
   ArrayResize(ac,5);
   for(int i=0; i<5; i++)
      ac[i]=iAC(Symbol(),tf,i);

   index_ac=0;
//--- buy signal
   if(ac[0]>ac[1])
      index_ac=1;
   else if(ac[0]>ac[1] && ac[1]>ac[2])
      index_ac=2;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3])
      index_ac=3;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3] && ac[3]>ac[4])
      index_ac=4;
//--- sell signal
   else if(ac[0]<ac[1])
      index_ac=-1;
   else if(ac[0]<ac[1] && ac[1]<ac[2])
      index_ac=-2;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3])
      index_ac=-3;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3] && ac[3]<ac[4])
      index_ac=-4;
  }
//+------------------------------------------------------------------+
//| Function for checking buy conditions                             |
//+------------------------------------------------------------------+
bool Buy()
  {
   bool res=false;
   if((index_rsi==2 && index_ac>=1) || (index_rsi==3 && index_ac==1))
      res=true;
   return (res);
  }
//+------------------------------------------------------------------+
//| Function for checking sell conditions                            |
//+------------------------------------------------------------------+
bool Sell()
  {
   bool res=false;
   if((index_rsi==-2 && index_ac<=-1) || (index_rsi==-3 && index_ac==-1))
      res=true;
   return (res);
  }
//+------------------------------------------------------------------+
//| Function for checking buy position closing conditions            |
//+------------------------------------------------------------------+
bool Buy_close()
  {
   bool res=false;
   if(index_rsi>2 && index_ac<0)
      res=true;
   return (res);
  }
//+------------------------------------------------------------------+
//| Function for checking sell position closing conditions           |
//+------------------------------------------------------------------+
bool Sell_close()
  {
   bool res=false;
   if(index_rsi<-2 && index_ac>0)
      res=true;
   return (res);
  }

Hemos llevado a cabo una pequeña optimización mediante sólo dos parámetros: tf (período de tiempo de trabajo) y period (período del indicador RSI).

Y hemos obtenido los siguientes resultados en M15:


Fig. 4 Resultados de la prueba del Asesor Experto con los datos del historial

¡Atención! Esta es sólo una versión demo. No se recomienda su uso con las pruebas y las cuentas reales.

Conclusión

Identificar el inicio y el final de una tendencia es una de las tareas más complicadas para los traders de todo el mundo, puesto que es imposible predecir el comportamiento del mercado.

Pero sí que se pueden determinar los momentos para entrar y salir en la tendencia actual y por consiguiente obtener beneficios importantes. Y la idea de determinar la velocidad del movimiento y hacer su seguimiento dinámico puede ser muy útil en este sentido.

Le deseo mucho éxito con sus operaciones.