Métodos para medir la velocidad del movimiento del precio

26 julio 2019, 08:29
Alexander Fedosov
0
632

Contenido

Introducción

Existen diferentes enfoques para estudiar y analizar los mercados, pero los principales son dos: técnico y fundamental. En el primer caso, se realiza la recopilación, el procesamiento y el estudio de algunos datos numéricos y de las características relacionadas con el mercado: precio, volúmenes, etc. En el segundo, se realiza el análisis de los eventos y noticias, que, a su vez, influyen directa o indirectamente en los mercados. Si en el caso del análisis fundamental, se trata de la interpretación de algún evento respecto a su influencia en el mercado (esta interpretación puede ser influenciada por la opinión o expectativa del mismo interpretador), pues en el caso del análisis técnico, los datos generalmente no tienen varias interpretaciones. Aunque aquí una parte del factor humano también está presente en la estimación de los resultados del análisis técnico.


Problema de percepción

Cuando hablamos del análisis técnico de los mercados, nos referimos a la aplicación de algunos sistemas de estimación en diferentes campos de ciencias exactas, sea la física o las matemáticas. En cuanto a las matemáticas, es obvio que su aplicación es imprescindible en el análisis técnico. Mientras que el uso de diferentes fenómenos físicos en relación a los mercados es más interesante. Por esa razón, en este artículo, vamos a considerar la velocidad (un fenómeno físico bien conocido que representa el movimiento de algo en una unidad de tiempo). En los mercados de monedas y los demás, en cualquier gráfico se puede observar a simple vista, sobre todo durante los períodos de alta volatilidad, no sólo la dirección del precio, así como, también su velocidad. Cualquier persona que estudia el gráfico visualmente es capaz de evaluar y decir si el precio cambia rápidamente o no. Pero es imposible llegar a una conclusión unánime respecto a la velocidad del movimiento durante la observación, debido a la diferencia de la percepción de las personas.

De un ejemplo simple de la vida real nos puede servir el engaño visual, cuando un coche de pequeño tamaño aparentemente se mueve con una velocidad más lenta de la que tiene realmente, mientras que un camión parece que se mueve con una velocidad mayor que tiene en realidad. Por eso, en estos casos se usan los indicadores de velocidad que muestran todo en números. Es que los valores numéricos son iguales absolutamente para cualquier persona.

Métodos para medir la velocidad del movimiento del precio

Antes de considerar diferentes enfoques en la medición de la velocidad del movimiento del precio, vamos a recordar qué es la velocidad.

Definición de la velocidad según Wikipedia:

La velocidad es una magnitud vectorial física que caracteriza la rapidez del desplazamiento y la dirección del movimiento de un punto material respecto al sistema de la referencia seleccionado; por definición, es igual al punto derivado de radio-vector en el tiempo.

¿Cómo se puede aplicar esta característica a los mercados de divisas? La manera más simple es sustituir el movimiento de un punto material por el precio, y definir el tiempo, durante el cual se forma una barra o una vela, como un sistema de referencia. Desde el punto de vista del gráfico de precios, será así:

Fig. 1. Visualización del precio como una vela japonesa en el marco temporal de una hora.

En este caso, una variación simple de la velocidad será la siguiente:

Velocidad media = (Precio de cierre — Precio de apertura) / Hora

Son las observaciones y las conclusiones que podemos hacer respecto al movimiento del precio en el tiempo:

  • Determinamos el número medio de los puntos recorrido por el precio durante una hora. Sin embargo, la medición se realiza dentro de una vela, y eso nos impide obtener una imagen general de la tendencia en este timeframe.
  • No obstante, si convertimos la velocidad desde el número de puntos por hora en el número de puntos por minuto, 5 minutos, etc., obtenemos una información más valiosa sobre el movimiento del precio dentro de esta vela H1.
  • Por eso, hay dos momentos obvios: para determinar la velocidad en los timeframes pequeños es mejor usar los timeframes grandes. Si se mide la velocidad media en el timeframe actual midiendo el movimiento del precio, es mejor usar varias velas.
El momento principal durante la medición de la velocidad de esta manera tan simple es que para las las velas de la profundidad del historial, ella no proporciona ninguna información sobre la dinámica dentro de la vela, simplemente muestra un resultado final promediado. Por ejemplo, teniendo la velocidad media de una vela de una hora, nunca sabremos que inicialmente el precio era alto y disminuyó considerablemente al final de la hora.

Para mayor claridad, mostraré un ejemplo que caracteriza perfectamente las tesis expuestas anteriormente. La figura 2 muestra la vela de una hora y el indicador Average Speed que calcula su velocidad media por minuto. En este caso, es igual a 2,53 puntos por minuto.

Fig. 2 Ejemplo del cálculo de una velocidad media en EURUSD, timeframe H1

Ahora vamos a considerar esta vela detalladamente en el timeframe de 15 minutos.


Fig. 3 Ejemplo del cálculo de una velocidad media en EURUSD, timeframe M15

Como podemos observar en la imagen 3, el movimiento era muy fuerte durante los primeros 15 minutos del intervalo de una hora seleccionado por nosotros ( Average speed mostraba 6,93), pero luego disminuyó considerablemente. Esta claro que si sumamos 4 valores de la velocidad media, obtenemos los mismos 2, 53 puntos por minuto en el timeframe de una hora. Obsérvese que después de dividir una vela en sus componentes, hemos descubierto muchas cosas nuevas sobre la dinámica del movimiento.

Y si dividimos este período horario en intervalos de un minuto, veremos una imagen aún más detallada.

Fig. 4 Ejemplo del cálculo de una velocidad media en EURUSD, timeframe M1

Al considerar las opciones de la medición de la velocidad del movimiento en puntos para el timeframe M1, no hemos mencionado otro método de la medición.

Se trata de la velocidad instantánea del precio, es decir, en el momento actual. Por un lado, sus valores siempre son recientes y actuales al máximo, y por otro, un ejemplo del indicador que funciona con alteraciones del precio a nivel de los ticks es el siguiente:

Fig. 5 Ejemplo del funcionamiento del indicador de la velocidad instantánea del movimiento del precio

Se ve que la estimación de los datos tan caóticos (aunque son recientes al máximo) con el fin de usarlos en los mercados de divisas, es bastante problemática.

Como es sabido, la mayoría de los indicadores son unos u otros precios derivados o sus analizadores. Estos son algunos indicadores bien conocidos que trabajan con la velocidad del movimiento del precio:

  • El indicador Momentum mide la variación del precio de un instrumento financiero en un determinado período de tiempo. Los valores extremamente altos o bajos del indicador Momentum suponen la continuación de la tendencia actual.  Eso quiere decir que unas desviaciones grandes de este indicador representan la velocidad actual alta del precio en la dirección determinada.
  • Indicador de tendencia ADX. Indice del Movimiento Direccional Medio (Average Directional Movement Index) muestra la fuerza de la tendencia actual. En realidad, la velocidad actual media.

Creando estrategias comerciales a base de los métodos de medición

Por eso, el objetivo del testeo de diferentes mediciones de la velocidad del movimiento del precio será dividido en tres grupos principales:

  • La medición estándar, directa de la velocidad media, como una relación del número de puntos pasados durante una unidad de tiempo.
  • La medición de la velocidad usando los ticks como una relación entre el número de puntos pasados y el número de los ticks.
  • La medición de la velocidad indirecta usando los indicadores tendenciales y otros indicadores.

Estrategia comercial №1

Para testear el primer método, que se basa en la medición de la velocidad como un número de puntos transcurridos durante una unidad de tiempo, a través del indicador Average Speed, es necesario insertar un filtro, que muestre la dirección de la tendencia, en la estrategia de la prueba, porque el indicador muestra el número de puntos por unidad de tiempo independientemente de la dirección de la tendencia.

Decidí usar el indicador Coordinated ADX and MACD (CAM) como este filtro. La estrategia comercial será la siguiente:

Parámetro Descripción
Indicador utilizado Average Speed
Indicador utilizado Coordinated ADX and MACD (CAM) 
Timeframe Cualquiera 
Condición de compra El color de la vela es verde, el valor de Average Speed está por encima del límite (predefinido en los parámetros)
Condición de venta El color de la vela es rojo, el valor de Average Speed está por encima del límite (predefinido en los parámetros)
Condiciones de venta  Take Profit/Stop Loss

La situación visual durante la apertura de una posición de compra y venta se muestra en la imagen 6:

Fig. 6 Condiciones de entrada según la estrategia comercial.

La implementación de esta estrategia es la siguiente:

//+------------------------------------------------------------------+
//| Parámetros de entrada del EA                                     |
//+------------------------------------------------------------------+
input string               InpEaComment         =  "Strategy #1"; // EA Comment
input int                  InpMagicNum          =  1111;          // Magic number
input double               InpLot               =  0.1;           // Lots
input uint                 InpStopLoss          =  400;           // StopLoss in points
input uint                 InpTakeProfit        =  500;           // TakeProfit in points
input uint                 InpSlippage          =  0;             // Slippage in points
input ENUM_TIMEFRAMES      InpInd_Timeframe     =  PERIOD_H1;     // Timeframe for the calculation
//--- Parámetros del indicador Average Speed
input int                  InpBars              =  1;             // Days
input ENUM_APPLIED_PRICE   InpPrice             =  PRICE_CLOSE;   // Applied price
input double               InpTrendLev          =  2;             // Trend Level
//--- Parámetros del indicador CAM
input uint                 InpPeriodADX         =  10;            // ADX period
input uint                 InpPeriodFast        =  12;            // MACD Fast EMA period
input uint                 InpPeriodSlow        =  26;            // MACD Slow EMA period
//---
CEngine        engine;
CTrade         trade;
//--- Declaración de las variables y de los manejadores de indicadores
double         lot;
ulong          magic_number;
uint           stoploss;
uint           takeprofit;
uint           slippage;
int            InpInd_Handle1,InpInd_Handle2;
double         avr_speed[],cam_up[],cam_dn[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Verificaciones iniciales
   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
     {
      Print(InpEaComment,": Trade is not allowed!");
      return(INIT_FAILED);
     }
   if(!TerminalInfoInteger(TERMINAL_CONNECTED))
     {
      Print(InpEaComment,": No Connection!");
      return(INIT_FAILED);
     }
//--- Obtención del manejador del indicador Average Speed
   InpInd_Handle1=iCustom(Symbol(),InpInd_Timeframe,"Speed Price\\average_speed",
                          InpBars,
                          InpPrice
                          );
   if(InpInd_Handle1==INVALID_HANDLE)
     {
      Print(InpEaComment,": Failed to get average_speed handle");
      Print("Handle = ",InpInd_Handle1,"  error = ",GetLastError());
      return(INIT_FAILED);
     }
//--- Obtención del manejador del indicador CAM
   InpInd_Handle2=iCustom(Symbol(),InpInd_Timeframe,"Speed Price\\CAM",
                          InpPeriodADX,
                          InpPeriodFast,
                          InpPeriodSlow
                          );
   if(InpInd_Handle2==INVALID_HANDLE)
     {
      Print(InpEaComment,": Failed to get average_speed handle");
      Print("Handle = ",InpInd_Handle2,"  error = ",GetLastError());
      return(INIT_FAILED);
     }
//---
   ArrayInitialize(avr_speed,0.0);
   ArrayInitialize(cam_up,0.0);
   ArrayInitialize(cam_dn,0.0);
   ArraySetAsSeries(avr_speed,true);
   ArraySetAsSeries(cam_up,true);
   ArraySetAsSeries(cam_dn,true);
//--- setting trade parameters
   lot=NormalizeLot(Symbol(),fmax(InpLot,MinimumLots(Symbol())));
   magic_number=InpMagicNum;
   stoploss=InpStopLoss;
   takeprofit=InpTakeProfit;
   slippage=InpSlippage;
//--- 
   trade.SetDeviationInPoints(slippage);
   trade.SetExpertMagicNumber(magic_number);
   trade.SetTypeFillingBySymbol(Symbol());
   trade.SetMarginMode();
   trade.LogLevel(LOG_LEVEL_NO);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!MQLInfoInteger(MQL_TESTER))
      engine.OnTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Si se trata del trabajo en el Simulador de estrategias
   if(MQLInfoInteger(MQL_TESTER))
      engine.OnTimer();

   if(!IsOpenedByMagic(InpMagicNum))
     {
      //--- Obtención de los datos para el cálculo
      if(!GetIndValue())
         return;
      //---
      if(BuySignal())
        {
         //--- Obtenemos precios correctos de StopLoss y TakeProfit en relación al nivel StopLevel
         double sl=CorrectStopLoss(Symbol(),ORDER_TYPE_BUY,0,stoploss);
         double tp=CorrectTakeProfit(Symbol(),ORDER_TYPE_BUY,0,takeprofit);
         //--- Abrimos una posición Buy
         trade.Buy(lot,Symbol(),0,sl,tp);
        }
      else if(SellSignal())
        {
         //--- Obtenemos precios correctos de StopLoss y TakeProfit en relación al nivel StopLevel
         double sl=CorrectStopLoss(Symbol(),ORDER_TYPE_SELL,0,stoploss);
         double tp=CorrectTakeProfit(Symbol(),ORDER_TYPE_SELL,0,takeprofit);
         //--- Abrimos una posición Sell
         trade.Sell(lot,Symbol(),0,sl,tp);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(avr_speed[0]>=InpTrendLev && cam_up[0]!=EMPTY_VALUE)?true:false;
  }
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(avr_speed[0]>=InpTrendLev && cam_dn[0]!=EMPTY_VALUE)?true:false;
  }
//+------------------------------------------------------------------+
//| Obtención de los valores actuales de los indicadores             |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle2,0,0,1,cam_up)<1 ||
          CopyBuffer(InpInd_Handle2,1,0,1,cam_dn)<1 || 
          CopyBuffer(InpInd_Handle1,0,0,1,avr_speed)<1
          )?false:true;
  }
//+------------------------------------------------------------------+
//| Verificando si la posición está abierta con el magic             |
//+------------------------------------------------------------------+
bool IsOpenedByMagic(int MagicNumber)
  {
   int pos=0;
   uint total=PositionsTotal();
//---
   for(uint i=0; i<total; i++)
     {
      if(SelectByIndex(i))
         if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
            pos++;
     }
   return((pos>0)?true:false);
  }
//+------------------------------------------------------------------+
//| Select a position on the index                                   |
//+------------------------------------------------------------------+
bool SelectByIndex(const int index)
  {
   ENUM_ACCOUNT_MARGIN_MODE margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
//---
   if(margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      ulong ticket=PositionGetTicket(index);
      if(ticket==0)
         return(false);
     }
   else
     {
      string name=PositionGetSymbol(index);
      if(name=="")
         return(false);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+

Estrategia comercial №2

Para implementar la estrategia comercial del segundo método de la medición de la velocidad del movimiento del precio, usamos la idea del EA  Price Impulse. Básicamente, ella consiste en la apertura de las posiciones comerciales cuando el precio se altera a una determinada cantidad de puntos, tomando en consideración el número especificado de los ticks gastado en eso.

Parámetro Descripción
Timeframe Cualquiera 
Condición de compra Número de puntos del precio transcurridos durante un determinado número de los ticks.
Condición de venta Número de puntos del precio transcurridos durante un determinado número de los ticks.
Condiciones de venta  Take Profit/Stop Loss

La implementación de esta estrategia se muestra a continuación. Como se puede observar, en las configuraciones hay dos parámetros que se encargan de la estimación de la velocidad del movimiento del precio:

//+------------------------------------------------------------------+
//| Parámetros de entrada del EA                                     |
//+------------------------------------------------------------------+
input string               InpEaComment         =  "Strategy #2"; // EA Comment
input int                  InpMagicNum          =  1111;          // Magic number
input double               InpLots              =  0.1;           // Lots
input uint                 InpStopLoss          =  400;           // StopLoss in points
input uint                 InpTakeProfit        =  500;           // TakeProfit in points
input ENUM_COPY_TICKS      tick_flags           =  TICKS_INFO;    // Ticks causados por los cambios de Bid y/o Ask
input int                  InpPoints            =  15;            // El precio debe pasar NNN puntos
input uchar                InpTicks             =  15;            // Después de XXX ticks

//--- arrays para recibir ticks
MqlTick        tick_array_curr[];            // array de ticks obtenido en el tick actual
MqlTick        tick_array_prev[];            // array de ticks obtenido en el tick anterior
ulong          tick_from=0;                  // si el parámetro tick_from=0, se dan los últimos ticks tick_count
uint           tick_count=15;                // número de los ticks que es necesario obtener
//---
double         ExtStopLoss=0.0;
double         ExtTakeProfit=0.0;
double         ExtPoints=0.0;
bool           first_start=false;
long           last_trade_time=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!m_symbol.Name(Symbol()))              // sets symbol name
      return(INIT_FAILED);

   tick_count+=InpTicks;                     // solicitamos "tick_count" + "después de XXX ticks"
   ExtStopLoss=InpStopLoss*Point();
   ExtTakeProfit=InpTakeProfit*Point();
   ExtPoints=InpPoints*Point();
   first_start=false;
//--- solicitamos los ticks (primer llenado)
   int copied=CopyTicks(Symbol(),tick_array_curr,tick_flags,tick_from,tick_count);
   if(copied!=tick_count)
      first_start=false;
   else
     {
      first_start=true;
      ArrayCopy(tick_array_prev,tick_array_curr);
     }
   m_trade.SetExpertMagicNumber(InpMagicNum);
   m_trade.SetTypeFillingBySymbol(Symbol());
   m_trade.SetMarginMode();
   m_trade.LogLevel(LOG_LEVEL_NO);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- verificamos la primera inicialización
   int copied=-1;
   if(!first_start)
     {
      copied=CopyTicks(Symbol(),tick_array_curr,tick_flags,tick_from,tick_count);
      if(copied!=tick_count)
         first_start=false;
      else
        {
         first_start=true;
         ArrayCopy(tick_array_prev,tick_array_curr);
        }
     }
//--- solicitamos los ticks
   copied=CopyTicks(Symbol(),tick_array_curr,tick_flags,tick_from,tick_count);
   if(copied!=tick_count)
      return;
   int index_new=-1;
   long last_time_msc=tick_array_prev[tick_count-1].time_msc;
   for(int i=(int)tick_count-1;i>=0;i--)
     {
      if(last_time_msc==tick_array_curr[i].time_msc)
        {
         index_new=i;
         break;
        }
     }
//---
   if(index_new!=-1 && !IsOpenedByMagic(InpMagicNum))
     {
      int shift=(int)tick_count-1-index_new-InpTicks;   // desplazamiento en el array de ticks actual
      shift=(shift<0)?0:shift;
      if(tick_array_curr[tick_count-1].ask-tick_array_curr[shift].ask>ExtPoints)
        {
         //--- abrimos BUY
         double sl=(InpStopLoss==0)?0.0:tick_array_curr[tick_count-1].ask-ExtStopLoss;
         double tp=(InpTakeProfit==0)?0.0:tick_array_curr[tick_count-1].ask+ExtTakeProfit;
         m_trade.Buy(InpLots,m_symbol.Name(),tick_array_curr[tick_count-1].ask,
                     m_symbol.NormalizePrice(sl),
                     m_symbol.NormalizePrice(tp));
         last_trade_time=tick_array_curr[tick_count-1].time_msc;
        }
      else if(tick_array_curr[shift].bid-tick_array_curr[tick_count-1].bid>ExtPoints)
        {
         //--- abrimos SELL
         double sl=(InpStopLoss==0)?0.0:tick_array_curr[tick_count-1].bid-ExtStopLoss;
         double tp=(InpTakeProfit==0)?0.0:tick_array_curr[tick_count-1].bid+ExtTakeProfit;
         m_trade.Sell(InpLots,m_symbol.Name(),tick_array_curr[tick_count-1].bid,
                      m_symbol.NormalizePrice(sl),
                      m_symbol.NormalizePrice(tp));
         last_trade_time=tick_array_curr[tick_count-1].time_msc;
        }
     }
   ArrayCopy(tick_array_prev,tick_array_curr);
//---
  }
//+------------------------------------------------------------------+
//| Verificando si la posición está abierta con el magic             |
//+------------------------------------------------------------------+
bool IsOpenedByMagic(int MagicNumber)
  {
   int pos=0;
   uint total=PositionsTotal();
//---
   for(uint i=0; i<total; i++)
     {
      if(SelectByIndex(i))
         if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
            pos++;
     }
   return((pos>0)?true:false);
  }
//+------------------------------------------------------------------+
//| Select a position on the index                                   |
//+------------------------------------------------------------------+
bool SelectByIndex(const int index)
  {
   ENUM_ACCOUNT_MARGIN_MODE margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
//---
   if(margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      ulong ticket=PositionGetTicket(index);
      if(ticket==0)
         return(false);
     }
   else
     {
      string name=PositionGetSymbol(index);
      if(name=="")
         return(false);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+

Estrategia comercial №3

Para crear una estrategia comercial que meda la velocidad del movimiento del precio indirectamente, es necesario seleccionar un indicador tendencial, así como, un filtro que confirme sus posibles señales. Para estos propósitos, fue decidido escoger el indicador de tendencia  Trend direction and force, y la media móvil de Hull HMA Color como filtro. Las señales de compra y venta en la imagen 7 se muestra más abajo.

Fig. 7 Condiciones de entrada según la estrategia comercial.

Parámetro Descripción
Indicador utilizado Trend direction and force
Indicador utilizado HMA Color
Timeframe M30 y superiores
Condición de compra El valor de Trend direction and fast está por encima del límite (la línea se colorea en azul), la media móvil de Hull crece y se colorea en azul.
Condición de venta El valor de Trend direction and fast está por debajo del límite (la línea se colorea en rojo), la media móvil de Hull cae y se colorea en rojo.
Condiciones de venta  Take Profit/Stop Loss


Testeando los métodos para medir la velocidad del movimiento de precios

Para probar tres estrategias seleccionadas, es necesario aclarar las condiciones para testearlas.

  • Intervalo: Último año (En el momento de la escritura del artículo es 01.01.2019 — 26.05.2019)
  • Par de divisas: EURUSD.
  • Modo del trading: Sin retardo (Las estrategias presentadas no están relacionadas con las de alta frecuencia, de modo que el impacto de los retardos sería muy pequeño). 
  • Testeo: OHLC на М1 (El testeo previo en los ticks reales resultó casi indistinguible de este modo). 
  • Depósito inicial: 1000 USD.
  • Apalancamiento: 1:500.
  • Servidor: MetaQuotes-Demo.
  • Cotizaciones: de 5 dígitos.

El objetivo del testeo no consiste en buscar el mejor ajuste en el historial, sino en descubrir la tendencia general y el acierto de diferentes enfoques en el cálculo y procesamiento de la velocidad del movimiento del precio. Por eso, para cada una de las estrategias comerciales, serán propuestos los mejores resultados de la optimización y su evaluación usando los parámetros del informe. 

Estrategia comercial №1

Después de testear la primera estrategia basada en la medición clásica de la velocidad del precio, tenemos los siguientes resultados de los cuales he seleccionado el mejor TOP 20:

Fig. 8 Veinte mejores resultados de la optimización de la estrategia comercial №1

Basándose en estos resultados, se puede concluir que, en estas condiciones comerciales, la estrategia comercial muestra los mejores resultados en los timeframes pequeños con valores pequeños deTake Profit y Stop Loss. Es decir, cuando se encuentra una señal, su potencial del movimiento pequeño. En este caso, el valor del ratio de Sharpe (consulte el artículo  Matemáticas de trading. Cómo estimar los resultados de trade para informarse de este indicador y de los demás) es bajo, y eso no está muy bien. Luego, ejecuté el mejor resultado en el Simulador de estrategias y obtube el siguiente informe.


Fig. 9 Resultado de la mejor optimización de la estrategia comercial №1

Durante el testeo con el lote constante de 0.1, se puede observar que el incremento es casi de un 100%, pero el ratio de Sharpe es sólo 0.33 y su valor Z-Score es igual a -0.16. Eso significa que en la negociación no hay equilibrio y que ha sido en esta prueba más bien aleatorio que sistemático. 

Estrategia comercial №2

Para testear la siguiente estrategia, debido a su particularidad, es necesario alterar una condición de la prueba:

  • Testeo: reemplazar OHLC en М1 (El testeo previo en los ticks reales resultó casi indistinguible de este modo) por " Every ticks based on real ticks".

Pues bien, aquí tenemos las mejores veinte opciones de la optimización de esta estrategia:

Fig. 10 Veinte mejores resultados de la optimización de la estrategia comercial №2

Aquí, por termino medio, los valores del ratio de Sharpe son más altos que en la primera estrategia, y además, han sido obtenidos mejores resultados con un número moderado de los puntos para un número mínimo de los ticks. También se observa que el sistema es bastante selectivo, en lo que indica una gran cantidad de transacciones. Vamos a testear el mejor resultado de la optimización y veremos su informe.


Fig. 11 Resultado de la mejor optimización de la estrategia comercial №2

Pues sí, en este caso, el ratio de Sharpe no está tan mal, porque apenas con 10 transacciones se ha alcanzado un beneficio más de un 30%.

Estrategia comercial №3 

En esta estrategia, volveremos a las condiciones iniciales del testeo. Aquí, vamos a verificar el trading usando los indicadores que determinan el movimiento del precio y su velocidad de forma indirecta.

Además, veremos los mejores resultados de la optimización de la estrategia comercial actual:

Fig. 12 Veinte mejores resultados de la optimización de la estrategia comercial №3

La mayoría de los resultados son muy parecidos, eso significa que dos últimos parámetros de la optimización no afectan mucho el resultado final. Al mismo tiempo, el valor medio del ratio de Sharpe está cerca de 0.2, y eso tampoco impresiona mucho. Naturalmente, el mejor resultado de la optimización está fuera del orden general pero, igual como en las estrategias anteriores, haremos un backtest en él.


Fig. 13 Resultado de la mejor optimización de la estrategia comercial №3

A pesar de casi un 100% del incremento del depósito y un ratio de Sharpe apreciable (eso se nota por el hecho de que eran necesarias 52 transacciones para alcanzar el nivel actual del beneficio, y los resultados más próximos son casi dos veces menores), Z-Score muestra la dependencia negativa entre las transacciones. La dependencia negativa, en su lugar, significa que una transacción ganadora probablemente será seguida por una transacción perdedora, y viceversa.

Conclusiones

Después de testear tres enfoques en la medición de la velocidad del movimiento del precio y después de analizar los resultados tanto de los mejores resultados de la optimización, como de otras optimizaciones, ha sido revelado que, en el primer enfoque, el mejor resultado de la optimización no ha mostrado equilibrio en la estrategia comercial. Mientras que otros dos métodos han mostrado los resultados mejores: el ratio de Sharpe es mayor y hay presencia de la dependencia negativa entre las transacciones. Obviamente, las estrategias de prueba no abarcan toda la variedad de los métodos o enfoques en la medición de la velocidad del precio, pero este artículo describe unos de los métodos del trading más evidentes y fáciles de entender para el uso de la propia idea del análisis técnico.

Fin del artículo

Al final del articulo se adjunta el archivo comprimido con todos los ficheros mencionados ordenados por las carpetas. Por eso, para un trabajo correcto basta con colocar la  carpeta MQL5 en la raíz del terminal. Para abrir el directorio raíz del terminal que contiene la carpeta MQL5, pulse en la combinación  Ctrl+Shift+D MetaTarder 5 o utilice el menú contextual, tal como se muestra en la imagen 14.


Fig. 14 Abrir la carpeta MQL5 en el directorio raíz del terminal MetaTrader 5

Programas usados en el artículo:

#
 Nombre
Tipo
Descripción
1
Strategy_1.mq5 Asesor Experto  EA de la estrategia comercial №1
2 Strategy_2.mq5 Asesor Experto  EA de la estrategia comercial №2
3 Strategy_3.mq5 Asesor Experto   EA de la estrategia comercial №3
4 Engine.mqh Biblioteca  Biblioteca de funciones comerciales.
 5 Average Speed  Indicador   Se usa en la estrategia comercial №1
 6 CAM  Indicador    Se usa en la estrategia comercial №1
 7 Trend direction and force  Indicador    Se usa en la estrategia comercial №3
 8 HMA_color  Indicador   Se usa en la estrategia comercial №3


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

Archivos adjuntos |
MQL5.zip (734.69 KB)
Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte VII): Eventos de activación de órdenes StopLimit, preparación de la funcionalidad para los eventos de modificación de órdenes y posiciones Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte VII): Eventos de activación de órdenes StopLimit, preparación de la funcionalidad para los eventos de modificación de órdenes y posiciones

En anteriores artículos comenzamos a crear una gran biblioteca multiplataforma cuyo objetivo es simplificar la creación de programas para las plataformas MetaTrader 5 y MetaTrader 4. En la sexta parte, enseñamos a la biblioteca a trabajar con posiciones en las cuentas de compensación. En esta parte, implementaremos el seguimiento de los eventos de activación de órdenes StopLimit y prepararemos la funcionalidad necesaria para monitorear la modificación de órdenes y posiciones.

Estimación del índice de fractalidad, exponente de Hurst y posibilidad de predecir series temporales financieras Estimación del índice de fractalidad, exponente de Hurst y posibilidad de predecir series temporales financieras

La búsqueda y el estudio del comportamiento fractal de los datos financieros supone que, tras un comportamiento aparentemente caótico de la series temporales económicas, se ocultan y operan unos mecanismos estables del comportamiento colectivo de los participantes. En la bolsa, estos mecanismos pueden llevar a la aparición de una dinámica de precios que determina y describe las propiedades específica de las series de precios. En el trading, sería interesante tener indicadores que pudieran estimar los parámetros de la fractilidad de manera estable y eficaz, en una escala y un intervalo de tiempo que fuesen útiles en la práctica.

Creando un EA gradador multiplataforma (Parte II): Cuadrícula en el rango en la dirección de la tendencia Creando un EA gradador multiplataforma (Parte II): Cuadrícula en el rango en la dirección de la tendencia

Hoy trataremos de desarrollar un EA gradador para trabajar en el rango en la dirección de la tendencia. Será usado para los instrumentos de Forex o para los mercados de materias primas. Según las pruebas, nuestro EA gradador demostraba las ganancias desde el año 2018. El mal consiste en que demostraba pérdidas constantes de 2014 a 2018.

Comprendemos la "memoria" del mercado usando la diferenciación y el análisis entrópico Comprendemos la "memoria" del mercado usando la diferenciación y el análisis entrópico

El área de la aplicación de la diferenciación fraccionada es bastante amplia. Por ejemplo, los algoritmos del aprendizaje automático normalmente reciben una serie diferencial en la entrada. El problema es que es necesario mostrar los datos nuevos de acuerdo con la historia existente para que el modelo del aprendizaje automático pueda reconocerlos. En este artículo, se considera un enfoque original en la diferenciación de una serie temporal, además, se muestra el ejemplo de un sistema comercial auto-optimizable a base de una serie diferencial obtenida.