English Русский 中文 Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Estrategia de trading basada en la dirección y velocidad del movimiento de los precios

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

MetaTrader 4Ejemplos | 10 mayo 2016, 17:45
5 595 1
Alexander Fedosov
Alexander Fedosov

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:

  • El área entre los niveles 40 y 60 se considera una zona plana (zona lateral). No hay ninguna tendencia si el precio está en esta zona. Vamos a asignar el índice 0 al movimiento que no presenta ninguna tendencia.

Zonas de movimientos del precio de compra:

  • Zona 60-70; es un posible inicio de un movimiento hacia arriba. Vamos a asignar el índice 1 a este movimiento.
  • Zona 70-80; el movimiento tiene una tendencia alcista más clara. El movimiento empieza a ser más rápido. Le asignamos el índice 2.
  • Zona 80-90; el movimiento tiene una dirección estable. Se ha alcanzado la velocidad. Le asignamos el índice 3.
  • Zona 90-100. Por regla general, este es un movimiento unidireccional muy fuerte y sin ninguna reversión. Se produce con poca frecuencia. El índice de este movimiento será el 4.

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

  • Zona 30-40. El movimiento empieza a dirigirse hacia abajo. Índice -1.
  • Zona 20-30. El movimiento empieza a ser más rápido. Índice -2.
  • Zona 10-20. Dirección hacia abajo estable. Índice -3.
  • Zona 0-10. Zona de un movimiento unidireccional fuerte. Índice -4.

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.

  • El primer criterio consiste en comparar el histograma actual y el anterior. Si el histograma actual es superior al anterior, existe una posible aceleración del crecimiento del precio. Este va a ser el índice de velocidad 1.
  • El segundo criterio consiste en comparar 3 barras colindantes (desde la barra cero hasta la segunda barra). Podemos hablar de un incremento de la aceleración si el valor de cada barra supera el valor de la barra anterior. El índice de velocidad es igual a 2.
  • Existe otra comparación parecida de 4 barras que consiste en comprobar si cada una de la barras es inferior a la barra siguiente. Es el índice de velocidad 3.
  • Comparar las últimas 5 barras con la barra actual para comprobar si van en la misma dirección. Es el índice de velocidad 4.

Caída.

  • Del mismo modo. Comparar la barra actual con la anterior. Si la barra actual es inferior a la anterior, el índice de velocidad es igual a -1.
  • Comparar 3 barras y comprobar si cada una de las barras es inferior a la anterior. Es el índice -2.
  • Comparar 4 barras. Es el índice -3.
  • Comparar 5 barras. Es el índice -4.

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:

  • Como puede suponer, la pelota es el precio.
  • La persona que lanza la pelota representa los participantes en el mercado que han iniciado la tendencia.
  • La fuerza de gravitación que causa la aceleración de la gravedad representa los traders que se han unido después del inicio de la tendencia.
  • El agua representa los importantes factores que influyen en el cambio de dirección.
  • El principio de Arquímedes representa las posiciones cerradas que pertenecen a los que iniciaron la tendencia.

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.


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

Archivos adjuntos |
trading.mqh (48.16 KB)
tester.mq4 (11.59 KB)
Enrique Enguix
Enrique Enguix | 13 jul. 2020 en 07:45
Very thanks! Magnificent explanation!
Price Action. Automatización de la estrategia de la barra interna (Inside Bar) Price Action. Automatización de la estrategia de la barra interna (Inside Bar)
Este artículo describe el desarrollo de un Asesor Experto en MetaTrader 4 basado en la estrategia de la barra interna, incluyendo los principios de detección de la barra interna, así como las reglas para establecer las órdenes pendientes y las órdenes Stop. Se proporcionan también los resultados de la prueba y la optimización.
Definir las condiciones del trading mediante los niveles de soporte y resistencia y el movimiento del precio Definir las condiciones del trading mediante los niveles de soporte y resistencia y el movimiento del precio
Este artículo describe cómo se puede utilizar el movimiento del precio y el seguimiento de los niveles de soporte y resistencia para entrar al mercado en el momento oportuno. También se describe un sistema de trading que combina de manera efectiva las características anteriores para determinar las condiciones del trading. Se explica el código MQL4 correspondiente que se puede utilizar en los Asesores Expertos basados en estos conceptos de trading.
Comprobación estadística del sistema de gestión de dinero de Labouchere Comprobación estadística del sistema de gestión de dinero de Labouchere
Este artículo aborda las propiedades estadísticas del sistema de gestión de dinero de Labouchere. Se considera que es menos agresivo que el sistema de tipo Martingala, ya que en lugar de duplicar las apuestas se incrementan en una cantidad determinada.
Mejorar la calidad del código mediante la prueba unitaria Mejorar la calidad del código mediante la prueba unitaria
Incluso en los programas más sencillos surgen a menudo errores que parecen increíbles. "¿Cómo he podido escribir esto?" es la primera pregunta que nos viene a la mente cuando surge este tipo de errores. "¿Cómo puedo evitarlo?" es la segunda pregunta, pero con menos frecuencia. Es imposible crear un código exento al cien por cien de errores, especialmente en los proyectos grandes, pero es posible utilizar técnicas para detectarlos a tiempo. Este artículo describe cómo se puede mejorar la calidad del código MQL4 con la ayuda del conocido método de pruebas unitarias (Unit Testing).