English Русский 中文 Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Gráfico líquido

Gráfico líquido

MetaTrader 5Trading | 18 febrero 2015, 10:02
1 486 1
Serhii Shevchuk
Serhii Shevchuk

Introducción

Una vez me he fijado en el echo de que los gráficos con el período H4 y los períodos superiores se ven diferentes con diferentes brokers. La razón consistía en diferentes husos horarios. En algunas ocasiones, determinadas zonas de los gráficos se diferenciaban considerablemente incluso teniendo una diferencia insignificante en los husos horarios. En un gráfico se distinguía perfectamente un patrón de reversa, y en la misma zona del otro gráfico había algo indeterminado.

Entonces se me ha ocurrido la idea de escribir un indicador que va a reconstruir el gráfico H1 de tal manera que a la derecha siempre haya una barra cerrada y terminada en cuanto al tiempo. El período M1 ha sido elegido como la fuente de los precios. Como resultado, el gráfico H1 se redibujaba cada minuto, y en una hora he obtenido 60 variedades del mismo gráfico H1. Su forma fluyente se cambiaba suavemente mostrando los patrones ocultos en los lugares donde no había ninguna alusión a ellos en el gráfico fuente.

Debido al aspecto distintivo del indicador, lo he llamado «gráfico líquido». Dependiendo del modo de su construcción, el gráfico «fluye» (se redibuja) bien cuando aparece una barra nueva del período base, o bien cuando se cambia el valor del desplazamiento estático. En este artículo analizaremos los principios de construcción del «gráfico líquido», escribiremos el indicador y también compararemos la eficacia de la aplicación de esta tecnología para los Asesores Expertos (EAs) que tradean con indicadores y los que tradean con patrones.



1. Principio de construcción

En primer lugar, vamos a aclarar los aspectos de terminología.

Desplazamiento es la diferencia en el tiempo por la que los precios de apertura de las barras del gráfico recibido se diferencian de los precios de apertura de las barras del gráfico fuente.

Período actual es el período del gráfico fuente.

Período base es el período por cuyos precios vamos a formar las barras del gráfico resultante.

El valor del período base no puede superar el valor del período actual. El período actual tiene que dividirse por el período base sin remanente. Cuanto más alta sea la relación del período actual respecto al período base, más variantes del gráfico resultante podremos obtener. Sin embargo, si la proporción es muy alta, los datos históricos del período base pueden ser insuficientes para construir el número necesarios de las barras del gráfico resultante.

Hay tres tipos de construcción.

  • Gráfico con desplazamiento estático (Static Shift o SS).
  • Gráfico con desplazamiento dinámico, modo de apertura (Dynamic Shift, just Open o DSO).
  • Gráfico con desplazamiento dinámico, modo de cierre (Dynamic Shift, expected Close o DSC).

En el modo con desplazamiento estático las horas de apertura de las barras están desplazadas al tiempo establecido. El desplazamiento dinámico en el modo de apertura da el efecto como si la barra acaba de abrirse, y en el modo de cierre - como si va a cerrarse pronto.

Vamos a estudiarlo con más detalles.


1.1. Gráfico con desplazamiento estático

En este modo la hora de apertura de cada barra será desplazada al número de minutos que equivale al número establecido de los períodos base, que vamos a llamar el desplazamiento. De esta manera, si se establece el desplazamiento 0, el gráfico va a repetir el gráfico fuente. El desplazamiento 1, si el período base es de 15 minutos, va a ser igual a 15 minutos. El desplazamiento 2 va a ser igual a 30 minutos, etc.

El desplazamiento no puede superar el valor (k-1), donde k es la relación del período actual al período base. Eso significa que con el período actual H1 y el período base M1 el desplazamiento máximo permitido será igual a 60/1 - 1 = 59 de los períodos base, es decir, 59 minutos. Si el período base es M5, el desplazamiento máximo permitido será igual a 60/5 - 1 = 11 de los períodos base, es decir, 55 minutos.

Las horas de apertura de las barras, para el ejemplo del período actual H1 y desplazamiento de 15 minutos, van a tener los valores 00:15, 01:15, 02:15, etc. Para el período actual M15 y desplazamiento de 1 minutos, las horas de apertura de las barras van a tener los valores 00:31, 00:46, 01:01, etc.

Con los desplazamientos que se encuentran cerca de los valores límites, este gráfico va a diferenciarse muy poco del gráfico fuente. Las diferencias importantes se observan cuando los valores del desplazamiento están más cerca de la mitad del rango permitido.

Gráfico con desplazamiento estático

Fig. 1. Ejemplo de formación de las barras H1 partiendo del período base M15 con el desplazamiento 1


1.2. Gráfico con desplazamiento dinámico, modo de apertura

En este modo el desplazamiento se recuenta cada vez que aparezca una nueva barra del período base. Además, el desplazamiento se calcula de tal manera que el tiempo de existencia de la barra al final del gráfico (los precios más recientes) no supere el valor del período base. En el ejemplo con el período actual H1 y el período base M5, eso tendrá el aspecto como si la barra más derecha se haya abierto no más de hace 5 minutos.

Gráfico con desplazamiento dinámico, inicio de la barra

Fig. 2. Ejemplo de formación de las barras partiendo del período base M15 con el desplazamiento dinámico en modo de apertura


1.3. Gráfico con desplazamiento dinámico, modo de cierre

En este modo el desplazamiento también se recuenta cada vez que aparezca una nueva barra del período base. La única diferencia es que el desplazamiento se calcula de tal manera que el tiempo de existencia de la barra al final del gráfico (los precios más recientes) sea mayor o igual a la diferencia entre el período actual y base. En el ejemplo con el período actual H1 y el período base M5, eso tendrá el aspecto como si la barra más derecha tenga que cerrarse no más que dentro de 5 minutos.

Gráfico con desplazamiento dinámico, fin de la barra

Fig. 3. Ejemplo de formación de las barras partiendo del período base M15 con el desplazamiento dinámico en modo de cierre


2. Conversión de datos

Para convertir los datos históricos tomando en cuenta el desplazamiento establecido, ha sido escrita la función GetRatesLC(). Ella recibe los datos históricos modificados en el array de estructuras del tipo MqlRates, igual que la función CopyRates().

int GetRatesLC(
   int             start_pos    // de dónde copiar
   int             len,         // cuánto copiar
   MqlRates&       rates[],     // array en el que se copian los datos
   ENUM_TIMEFRAMES base_period, // período base
   int&            shift        // desplazamiento
   );

Parámetros

  start_pos

   [in]  Número del primer elemento en el período actual a partir del cual se empieza la conversión y el copiado al Portapapele.

  len

   [in]  Número de elementos a copiar.

  rates[]

   [out]  Array del tipo MqlRates.

  base_period

   [in]  Período base. 

  shift

   [in] [out]  Desplazamiento. Se puede poner los siguientes valores:

Valor Descripción
 -2
 Calcular el desplazamiento en el modo de apertura (inicio de formación de la barra)
 -1
 Calcular el desplazamiento en el modo de cierre (fin de formación de la barra)
 0 ... N
 Aplicar el desplazamiento indicado. Puede adquirir lo valores de 0 a N.
 N = Tcur/Tbase - 1. Donde Tcur es período actual, Tbase es período base.

Tabla 1. Valores admisibles del parámetro shift

Al ejecutar con éxito la función, en shift se pone el valor del desplazamiento calculado, si ha sido transmitido el valor -2 o -1.

Valor devuelto

Número de elementos copiados o el código del error.

Código Descripción
 -1
 Período base inválido
 -2
 Desplazamiento inválido

Tabla 2. Códigos de errores devueltos

A continuación, se muestra el código de la función GetRatesLC() desde el archivo liquidchart.mqh.

int GetRatesLC(int start_pos,int len,MqlRates &rates[],ENUM_TIMEFRAMES base_period,int& shift)
  {
   //--- cuantos períodos base caben en el período actual  
   int k=PeriodSeconds()/PeriodSeconds(base_period);
   if(k==0)
      return(-1);//período base inválido
   //---
   MqlRates r0[];
   ArrayResize(rates,len);
   if(CopyRates(_Symbol,_Period,start_pos,1,r0)<1)
      return(0);// no hay datos
   //---
   int sh;
   if(shift>=0)
     {
      //--- desplazamiento fijo
      if(shift<k)
         sh=shift;
      else
         return(-2);//--- desplazamiento inválido   
     }
   else if(shift==-1)
     {
      //--- hay que calcular el desplazamiento (dinámico, inicio de formación de la barra)
      sh=int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period));
     }
   else if(shift==-2)
     {
      //--- hay que calcular el desplazamiento (dinámico, fin de formación de la barra)
      sh=1+int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period));
      if(sh>=k)
         sh = 0;
     }
   else
      return(-2);//desplazamiento inválido       
   //--- hora de apertura de la barra del período base a partir de la cual se empieza a formarse la barra del período actual
   //--- respecto al tiempo tO se hace la sincronización de las horas de apertura de las barras
   datetime tO;
   //--- hora de cierre de la barra formada, es decir la hora de apertura de la última barra del período base en la serie
   datetime tC;
   tO=r0[0].time+sh*PeriodSeconds(base_period);
   if(tO>TimeCurrent())
      tO-=PeriodSeconds();
   tC=tO+PeriodSeconds()-PeriodSeconds(base_period);
   if(tC>TimeCurrent())
      tC=TimeCurrent();
   int cnt=0;
   while(cnt<len)
     {
      ArrayFree(r0);
      int l=CopyRates(_Symbol,base_period,tC,k,r0);
      if(l<1)
         break;
      //--- la hora de la barra con el índice (l-1) no siempre corresponde a tC
      //--- si la barra con la hora tC no existe, puede ser la barra más cercana
      //--- en cualquier caso, yo asigno su hora a la hora tC
      tC=r0[l-1].time;
      //--- ahora hay que comprobar si tO tiene un valor correcto y corregir si hace falta.
      while(tO>tC)
         tO-=PeriodSeconds();
      //--- aquí las horas tO y tC ya tienen los valores actuales para la barra a formar  
      int index=len-1-cnt;
      rates[index].close=0;
      rates[index].open=0;
      rates[index].high=0;
      rates[index].low=0;
      rates[index].time=tO;
      for(int i=0; i<l; i++)
         if(r0[i].time>=tO && r0[i].time<=tC)
           {
            if(rates[index].open==0)
              {
               rates[index].open= r0[i].open;
               rates[index].low = r0[i].low;
               rates[index].high= r0[i].high;
                 }else{
               if(rates[index].low > r0[i].low)
                  rates[index].low=r0[i].low;
               if(rates[index].high < r0[i].high)
                  rates[index].high=r0[i].high;
              }
            rates[index].close=r0[i].close;
           }
      //--- establecimiento de la hora de cierre de la barra siguiente en el ciclo
      tC=tO-PeriodSeconds(base_period);
      //
      cnt++;
     }
   if(cnt<len)
     {
      //-- hay menos datos que hacen falta, desplazamos al inicio del búfer
      int d=len-cnt;
      for(int j=0; j<cnt; j++)
         rates[j]=rates[j+d];
      for(int j=cnt;j<len;j++)
        {
         //--- llenamos con ceros los elementos no utilizados del array
         rates[j].close=0;
         rates[j].open=0;
         rates[j].high=0;
         rates[j].low=0;
         rates[j].time=0;
        }
     }
   shift = sh;  
   return(cnt);
  }

Cabe mencionar unos momentos importantes.

  • La función no devuelve los volúmenes de tick. Se debe al hecho de que en el modo DSC la función nunca devolverá el volumen que es igual a uno, como sucede cuando se abre la barra. Es absolutamente lógico. Pero si su EA utiliza el volumen de tick igual a uno como la señal sobre la formación de nueva barra, nunca lo recibirá. Este modo se utiliza en el EA Moving Average de los ejemplos estándar. Usted puede insertar adicionalmente en la función el cálculo de los volúmenes de tick, pero no va a funcionar correctamente a 100%. Para que no haya confusiones, yo no calculo los volúmenes de tick en absoluto.
  • La función devuelve el número de barras solicitado pero eso no significa que el intervalo de tiempo entre la primera y la última barra va a ser conmensurable con el intervalo correspondiente de tiempo en el gráfico fuente. En el intervalo continuo de datos históricos, sí que va a haber correspondencia. Pero si en este intervalo aparecen los días del fin de semana, en el límite pueden aparecer las «barras fantasmas».

En la imagen de abajo se muestra el ejemplo de una «barra fantasma». Esta barra ha salido del primer minuto del 27 de octubre que ha llegado a parar en la barra con la hora de apertura de 23:01 del 26 de octubre. Hay que tener en cuenta que después de estas barras el gráfico del indicador será desplazado hacia la izquierda en relación al gráfico fuente. Las barras con la hora correspondiente a la hora fuente (por ejemplo, 21:00 -> 21:01) van a tener otros índices.

Barra fantasma

Fig. 4. Barra fantasma del 2014.10.26 a las 23:01



3. Implementación del indicador

Vamos a escribir el indicador que muestra el «gráfico líquido» en la ventana adicional. Este indicador tiene que trabajar en los tres modos: desplazamiento estático, desplazamiento dinámico en el modo de apertura de la barra y desplazamiento dinámico en el modo de cierre de la barra. Además, el indicador debe tener los elementos de control para poder cambiar los modos y el valor de desplazamiento sin tener que abrir el diálogo de modificación de parámetros.

Para empezar, vamos a necesitar la función GetRatesLC() desde el archivo liquidchart.mqh. Vamos a llamarla desde la función RefreshBuffers(), la que a se vez se llama desde OnCalculate. También se puede llamarla OnChartEvent, si se ha cambiado el modo o desplazamiento y hace falta recalcular los búferes del indicador. La función OnChartEvent va a procesar los clics sobre los botones y cambiar los valores del desplazamiento y del modo.

Parámetros de entrada del indicador:

input ENUM_TIMEFRAMES   BaseTF=PERIOD_M1;       // LC Base Period
input int               Depth=100;              // Depth, bars
input ENUM_LC_MODE      inp_LC_mode=LC_MODE_SS; // LC mode
input int               inp_LC_shift=0;         // LC shift

donde Depth es el número de barras del gráfico resultante, y ENUM_LC_MODE es el tipo que describe los modos de construcción del indicador:

enum ENUM_LC_MODE
  {//modo de construcción
   LC_MODE_SS=0,  // Static Shift
   LC_MODE_DSO=1, // Dynamic Shift, just Open
   LC_MODE_DSC=2  // Dynamic Shift, expected Close
  };
Los parámetros inp_LC_mode y inp_LC_shift se duplican con las variables LC_mode y LC_shift, respectivamente. Eso se hace para que se pueda cambiar sus valores pulsando los botones. No vamos a considerar el dibujo y el procesamiento del clic de los botones ya que eso entra en el tema de este artículo. Vamos a analizar la función RefreshBuffers() con más detalles.
bool RefreshBuffers(int total,
                    double &buff1[],
                    double &buff2[],
                    double &buff3[],
                    double &buff4[],
                    double &col_buffer[])
  {
   MqlRates rates[];
   ArrayResize(rates,Depth);
//---
   int copied=0;
   int shift=0;
   if(LC_mode==LC_MODE_SS)
      shift = LC_shift; //desplazamiento estático
   else if(LC_mode==LC_MODE_DSO)
      shift = -1;       //calcular el desplazamiento (inicio de formación de la barra)
   else if(LC_mode==LC_MODE_DSC)
      shift = -2;       //calcular el desplazamiento (fin de formación de la barra)
   else
      return(false);
//---
   copied=GetRatesLC(0,Depth,rates,BaseTF,shift);
//---
   if(copied<=0)
     {
      Print("No hay datos");
      return(false);
     }
   LC_shift = shift;
   refr_keys();
//--- inicializaremos los búfers con valores vacíos
   ArrayInitialize(buff1,0.0);
   ArrayInitialize(buff2,0.0);
   ArrayInitialize(buff3,0.0);
   ArrayInitialize(buff4,0.0);
//---
   int buffer_index=total-copied;
   for(int i=0;i<copied;i++)
     {
      buff1[buffer_index]=rates[i].open;
      buff2[buffer_index]=rates[i].high;
      buff3[buffer_index]=rates[i].low;
      buff4[buffer_index]=rates[i].close;
      //---
      if(rates[i].open<=rates[i].close)
         col_buffer[buffer_index]=1;//alcista o doji
      else
         col_buffer[buffer_index]=0;//bajista
      //
      buffer_index++;
     }
//
   return(true);
  }

Primero hay que pasar el valor necesario de la variable shift a la función GetRatesLC(), dependiendo del modo que se usa. En el modo estático va a ser la copia del parámetro LC_shift, en el modo de apertura o cierre de la barra va a ser -1 o -2, respectivamente. Después de la ejecución con éxito, GetRatesLC() devolverá en la variable shift el valor actual del desplazamiento. Será recalculado ose quedará como antes. En cualquier caso, asignamos su valor a la variable LC_shift y redibujamos los elementos gráficos usando la función refr_keys().

Después de eso, actualizamos OHLC y el color de las barras en los búferes de indicadores.

El código completo del indicador se encuentra en el archivo liquid_chart.mq5. Una vez iniciado el indicador, tendrá el siguiente aspecto:

Indicador Liquid Chart, desplazamiento 0

Fig. 5. Indicador Liquid Chart

Vamos a hablar un poco sobre los elementos de control.

  • El botón SS cambia el indicador en el modo del desplazamiento estático. En este modo los botones con flechas estarán activos, se utilizan para establecer el valor necesario del desplazamiento.
  • El botón DSO pasa el indicador en el modo del desplazamiento dinámico, inicio de formación de la barra. En este modo el desplazamiento se calcula, no se puede cambiar su valor manualmente.
  • El botón DSC pasa el indicador en el modo del desplazamiento dinámico, fin de formación de la barra. En este modo tampoco se puede cambiar el valor del desplazamiento manualmente.

En el modo SS, con el valor del desplazamiento igual a 0, el indicador repite exactamente los valores del gráfico fuente. Intente cambiar el desplazamiento y verá como el gráfico se reconstruye. Con el valor igual a 28, ya se notan las diferencias notables. En vez de los «carriles» mal expresados aparecerá el «martillo» bien notable. ¿Ha llegado la hora de comprar?

Indicador Liquid Chart, desplazamiento 28

Fig. 6. Indicador Liquid Chart, desplazamiento estático 28

Pase el indicador en el modo DSO, y a la derecha siempre habrá una barra recién formada. Y en el modo DSC habrá una barra a la que le queda no más de un período base para cerrarse.


4. Creación del Asesor Experto

Vamos a crear dos EAs. El primero va a tradear por las medias móviles, el segundo por el patrón de la «barra pin».

Como la base vamos a coger el EA Moving Average que forma parte del conjunto estándar de ejemplos (carpeta Experts\Examples\Moving Average). De esta manera, tendremos la posibilidad de comparar los resultados de optimización de dos estrategias completamente diferentes para comprender en qué ocasiones tiene sentido el uso del desplazamiento dinámico o estático.


4.1. EA que tradea por las medias móviles

En primer lugar, vamos a aclarar los parámetros de entrada. Al principio son cuatro:

input double MaximumRisk    = 0.1// Maximum Risk in percentage
input double DecreaseFactor = 3;    // Descrease factor
input int    MovingPeriod   = 12;   // Moving Average period
input int    MovingShift    = 6;    // Moving Average shift

A resultas de la optimización, aparecerán otros tres parámetros:

input ENUM_TIMEFRAMES  BaseTF=PERIOD_M1;  // LC Base Period
input bool             LC_on = true;      // LC mode ON
input int              LC_shift = 0;      // LC shift

El parámetro LC_on va a ser necesario si hace falta comprobar el funcionamiento correcto de GetRatesLC(). La combinación (LC_on == true && LC_shift == 0) tiene que dar el mismo resultado que (LC_on == false).

Para actualizar el EA Moving Average hecho con el uso del desplazamiento, primero hay que adjuntar el archivo liquidchart.mqh y sustituir las funciones CopyRates() por las funciones GetRatesLC() para los casos cuando el uso del desplazamiento está activado (parámetro de entrada LC_on es igual a true):

   int copied;
   if(LC_on==true)
     {
      int shift = LC_shift;
      copied=GetRatesLC(0,2,rt,BaseTF,shift);
     }
   else
      copied = CopyRates(_Symbol,_Period,0,2,rt);
   if(copied!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }

Eso hay que hacer en dos lugares: en la función CheckForOpen() y CheckForClose(). Además, nos vemos obligados a rechazar el uso de los handles del indicador, vamos a calcular las medias móviles «manualmente». Para eso tenemos la función CopyMABuffer():

int CopyMABuffer(int len,double &ma[])
  {
   if(len<=0)
      return(0);
   MqlRates rates[];
   int l=len-1+MovingPeriod;
   int copied;
   if(LC_on==true)
     {
      int shift = LC_shift;
      ArrayResize(rates,l);
      copied=GetRatesLC(MovingShift,l,rates,BaseTF,shift);
     }
   else
      copied=CopyRates(_Symbol,_Period,MovingShift,l,rates);
//      
   if(copied<l)
      return(0);
//
   for(int i=0;i<len;i++)
     {
      double sum=0;
      for(int j=0;j<MovingPeriod;j++)
        {
         if(LC_on==true)
            sum+=rates[j+i].close;
         else
            sum+=rates[copied-1-j-i].close;
        }
      ma[i]=sum/MovingPeriod;
     }
   return(len);
  }

En el búfer ma[] ella devuelve el número solicitado de valores de la media móvil, o 0 si por alguna razón no se ha podido obtenerlos.

Otro momento importante es el control de la apertura de las barras. En la versión estándar del EA Moving Average eso está implementado basándose en el valor de los volúmenes de tick:

   if(rt[1].tick_volume>1)
      return;

En nuestra caso no hay volúmenes de tick por eso para el control de la apertura de las barras vamos a escribir la función newbar():

bool newbar(datetime t)
  {
   static datetime t_prev=0;
   if(t!=t_prev)
     {
      t_prev=t;
      return(true);
     }
   return(false);
  }

El principio de funcionamiento es muy sencillo: se compara la hora de la apertura de la barra con su valor anterior. Vamos a sustituir la comprobación del volumen de tick por la llamada a la función newbar() en dos lugares: en la función CheckForOpen() y CheckForClose():

   if(newbar(rt[1].time)==false)
      return;

El código completo del EA hecho se encuentra en el archivo moving_average_lc.mq5.


4.2. EA que tradea por el patrón de la «barra pin»

La Barra Pin, o la Barra de Pinocho es un patrón de tres barras. La barra central tiene que tener una sombra larga, así llamada «la nariz», que indica en la posible reversa del movimiento del precio. Las barras que quedan a los lados se se denaminan «los ojos». Sus extremos no tienen que sobresalir de la sombra de la barra central. Este patrón es bastante popular entre los traders que tradean con los patrones de velas.

Nuestra barra pin tiene que cumplir las siguientes condiciones (para el giro del movimiento del precio hacia abajo):

  • La barra r[0] tiene que ser alcista.
  • La barra r[2] tiene que ser bajista.
  • El mayor de los valores del precio A y C no debe superar B, donde A y C son los valores High de las barras r[0] y r[2], respectivamente, y B es el precio High de la barra r[1].
  • El cuerpo de la barra central, es decir el módulo de diferencia Open-Close (en la figura - OC) de la barra r[1], no debe superar el número de puntos establecido en el parámetro externo.
  • La sombra de la barra central, es decir la diferencia entre el precio High y el valor mayor de los valores Open y Close de la barra r[1], no debe ser menor del número de puntos establecido en el parámetro externo.
  • La correlación de la sombra de la barra central a su cuerpo no debe ser menor del valor establecido en el parámetro externo.

Vamos a comprobar el patrón en el momento de la apertura de la barra r[3].

Barra Pin

Fig. 7. Patrón «Barra Pin»

El código que define la presencia de la barra pin para la reversa hacia abajo tendrá el siguiente aspecto:

   if(r[0].open<r[0].close && r[2].open>r[2].close && r[1].high>MathMax(r[0].high,r[2].high))
     {
     //--- ojos de la barra pin superior
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(r[1].high-MathMax(r[1].open,r[1].close))/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(1);
     }

Lo mismo pasa para la reversa hacia arriba. Entonces, la función de la comprobación de la presencia de la barra pin es la siguiente:

int IsPinbar(MqlRates &r[])
  {
   //--- en el array r[] tiene que haber 4 valores
   if(ArraySize(r)<4)
      return(0);
   if(r[0].open<r[0].close && r[2].open>r[2].close && r[1].high>MathMax(r[0].high,r[2].high))
     {
      //--- los ojos de la barra pin superior
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(r[1].high-MathMax(r[1].open,r[1].close))/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(1);
     }
   else if(r[0].open>r[0].close && r[2].open<r[2].close && r[1].low<MathMin(r[0].low,r[2].low))
     {
      //--- ojos de la barra pin inferior
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(MathMin(r[1].open,r[1].close)-r[1].low)/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(-1);
     }
   return(0);
  }

El array de los datos históricos traspasado no puede tener menos de cuatro elementos. En caso de detectar la barra pin superior (es decir, la barra pin que supone la reversa hacia abajo), la función devolverá el valor 1. En caso de detectar la barra pin inferior (se supone la reversa hacia arriba), la función devolverá el valor -1. Si no se encuentra ninguna barra pin, la función devuelve 0. Además, la función utiliza los siguientes parámetros de entrada:

input uint   inp_pb_min_shdw     = 40;    // Pinbar min shadow, point
input uint   inp_pb_max_OC       = 20;    // Pinbar max OC, point
input double inp_pb_min_ratio    = 2.0;   // Pinbar shadow to OC min ratio

Vamos a eligir la estrategia más simple para tradear por la barra pin. Si se supone la reversa hacia abajo, vamos a vender, si es hacia arriba, vamos a comprar. Normalmente, también se requiere la confirmación de indicadores. Pero en esta ocasión no vamos a utilizarlos para mantener la integridad del experimento. Vamos a usar exclusivamente la barra pin

Que el EA que tradea por el patrón «barra pin» se base en nuestro EA que tradea por las medias móviles. Primero, hay que eliminar de él la función CopyMABuffer(), así como su llamada desde las funciones CheckForOpen() y CheckForClose(). El número de los datos históricos solicitados se aumenta de dos a cuatro y para la comprobación de la apertura de la barra nueva vamos a usar la hora de la barra r[3]:

   int copied;
   if(LC_on==true)
   {
      int shift = LC_shift;
      copied=GetRatesLC(0,4,rt,BaseTF,shift);
   }
   else
      copied = CopyRates(_Symbol,_Period,0,4,rt);
   if(copied!=4)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(newbar(rt[3].time)==false)
      return;

La comprobación de la señal para la apertura de la posición va a tener el siguiente aspecto:

   int pb=IsPinbar(rt);
   if(pb==1)       // barra pin superior
      signal=ORDER_TYPE_SELL; // sell conditions
   else if(pb==-1) // barra pin inferior
      signal=ORDER_TYPE_BUY// buy conditions

Para cerrar la posición por la barra pin opuesta:

   if(type==(long)POSITION_TYPE_BUY && pb==1)
      signal=true;
   if(type==(long)POSITION_TYPE_SELL && pb==-1)
      signal=true;

Aquí hay que tener presente que si las condiciones de los parámetros de entrada son estrictas, la barra pin va a encontrarse bastante raramente. Por eso si cerramos la posición sólo por la barra pin opuesta, corremos el riesgo de perder el beneficio, o incluso cerrarse con pérdidas.

Entonces, añadiremos los niveles Take Profit y Stop Loss. Vamos a establecerlos usando los parámetros externos inp_tp_pp inp_sl_pp, respectivamente:

   double sl=0,tp=0,p=0;
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(signal==ORDER_TYPE_SELL)
   {
     p=bid;
     if(inp_sl_pp!=0)
       sl=NormalizeDouble(ask+inp_sl_pp*_Point,_Digits);
     if(inp_tp_pp!=0)
       tp=NormalizeDouble(ask-inp_sl_pp*_Point,_Digits);
   } else {
     p=ask;
     if(inp_sl_pp!=0)
       sl=NormalizeDouble(bid-inp_sl_pp*_Point,_Digits);
     if(inp_tp_pp!=0)
       tp=NormalizeDouble(bid+inp_sl_pp*_Point,_Digits);
   }
   CTrade trade;
   trade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),p,sl,tp);

Si el valor de inp_tp_pp o inp_sl_pp es igual a cero, el nivel correspondiente de Take Profit o de Stop Loss no va a establecerse.

Pues, las modificaciones están completadas, el EA está hecho. El código completo se encuentra en el archivo pinbar_lc.mq5.


5. Optimización de los Asesores Expertos

Para evaluar la efectividad de los gráficos con desplazamiento para diferentes estrategias, vamos a utilizar la optimización de los EAs con la posterior comparación de los mejores resultados. Los parámetros más importantes serán el beneficio, la reducción (drawdown) y el número de los trades. El EA que tradea por las medias móviles servirá de ejemplo para una estrategia de indicadores, y el EA que tradea por el patrón «barra pin» va a representar una estrategia sin indicadores.

Para la optimización vamos a utilizar las cotizaciones del servidor MetaQuotes-Demo para un intervalo de medio año. En el experimento van a participar los pares de EURUSD, GBPUSD y USDJPY. El depósito inicial es de 3000 USD, con apalancamiento de 1:100. El modo de prueba es «todos los ticks». El modo de optimización - rápida (algoritmo genético), Balance Max.


5.1. Análisis de los resultados de la optimización del EA que tradea por las medias móviles

Vamos a comparar los resultados de la optimización del EA durante su trabajo en diferentes modos: sin desplazamiento, con desplazamiento estático y desplazamiento dinámico (DSO y DSC).

La prueba se realiza para los pares EURUSD, GBPUSD y USDJPY, en el intervalo 2014.04.01 - 2014.10.25 (el último medio año). Período H1.

Parámetros de entrada del EA:

Parámetro
Valor
 Maximum Risk in percentage
 0.1
 Decrease factor
 3.0
 Moving Average period
 12
 Moving Average shift
 6
 BaseTF
 1 Minute
 LC_on
 true
 LC_shift
 0

Tabla 3. Parámetros de entrada del EA Moving Average LC

5.1.1. Optimización del EA en el modo sin desplazamiento

Parámetros a optimizar:

Parámetro
 Inicio  Paso Stop
 Moving Average period
 12
 1
 90
 Moving Average shift
 6
 1
 30

Tabla 4. Parámetros de optimización del EA Moving Average LC en el modo sin desplazamiento

Gráfico de optimización del EA en el modo sin desplazamiento, EURUSD:

Optimización en el modo sin desplazamiento, EURUSD

Fig. 8. Optimización del EA Moving Average LC en el modo sin desplazamiento, EURUSD

Los mejores resultados:

 Resultado
 Beneficio Drawdown %
Total de trades
MovingPeriod MovingShift
 3796,43  796,43  16,18  111  24  12
 3776,98  776,98  17,70  77  55
 22
 3767,45  767,45  16,10  74  59
 23
 3740,38  740,38  15,87  78  55
 17
 3641,16  641,16  15,97  105  12
 17

Tabla 5. Los mejores resultados de optimización del EA Moving Average LC en el modo sin desplazamiento, EURUSD

Gráfico de optimización del EA en el modo sin desplazamiento, GBPUSD:

Optimización en el modo sin desplazamiento, GBPUSD

Fig. 9. Optimización del EA Moving Average LC en el modo sin desplazamiento, GBPUSD

Los mejores resultados:

 Resultado  Beneficio Drawdown %
 Total de trades
 MovingPeriod MovingShift
 4025,75  1025,75  8,08  80  18
 22
 3857,90  857,90  15,04  74  55
 13
 3851,40  851,40  18,16  80  13
 24
 3849,48  849,48  13,05  69  34
 29
 3804,70  804,70  16,57  137  25
 8

Tabla 6. Los mejores resultados de optimización del EA Moving Average LC en el modo sin desplazamiento, GBPUSD

Gráfico de optimización del EA en el modo sin desplazamiento, USDJPY:

Optimización en el modo sin desplazamiento, USDJPY

Fig. 10 Optimización del EA Moving Average LC en el modo sin desplazamiento, USDJPY

Los mejores resultados:

Resultado
Beneficio
Drawdown %
Total de trades
 MovingPeriod  MovingShift
5801,63 2801,63 11,54 48
65
23
5789,17 2789,17 14,03 50
44
27
5539,06 2539,06 17,14 46
67
27
5331,34 2331,34 15,05 61
70
9
5045,19 2045,19 12,61 48
83
15

Tabla 7. Los mejores resultados de optimización del EA Moving Average LC en el modo sin desplazamiento, USDJPY

5.1.2. Optimización del EA en el modo de desplazamiento estático

Parámetros a optimizar:

Parámetro
 Inicio  Paso Stop
 Moving Average period
 12
 1
 90
 Moving Average shift
 6
 1
 30
 LC_shift  1  1  59

Tabla 8. Parámetros de optimización del EA Moving Average LC en el modo de desplazamiento estático

Gráfico de optimización del EA en el modo de desplazamiento estático, EURUSD:

Optimización en el modo de desplazamiento estático, EURUSD

Fig. 11. Optimización del EA Moving Average LC en el modo de desplazamiento estático, EURUSD

Los mejores resultados:

Resultado
Beneficio
 Drawdown %
 Total de trades
MovingPeriod
MovingShift
LC_shift
 4385,06
 1385,06
 12,87  100  32  11  8
 4149,63
 1149,63
 14,22  66  77  25  23
 3984,92
 984,92
 21,52  122  12  11  26
 3969,35
 969,35
 16,08  111  32  11  24
 3922,95
 922,95
 12,29  57  77  25  10

Tabla 9. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento estático, EURUSD

Gráfico de optimización del EA en el modo de desplazamiento estático, GBPUSD:

Optimización en el modo de desplazamiento estático, GBPUSD

Fig. 12 Optimización del EA Moving Average LC en el modo de desplazamiento estático, GBPUSD

Los mejores resultados:

 Resultado  Beneficio Drawdown %
Total de trades
 MovingPeriod  MovingShift LC_shift
 4571,07  1571,07  14,90  79  12
 25
 42
 4488,90  1488,90  15,46  73  12
 25
 47
 4320,31  1320,31  9,59  107  12
 16
 27
 4113,47  1113,47  10,96  75  12
 25
 15
 4069,21  1069,21  15,27  74  12
 25
 50

10. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento estático, GBPUSD

Gráfico de optimización del EA en el modo de desplazamiento estático, GBPUSD:

Optimización en el modo de desplazamiento estático, USDJPY

Fig. 13 Optimización del EA Moving Average LC en el modo de desplazamiento estático, USDJPY

Los mejores resultados:

Resultado
Beneficio
Drawdown %
Total de trades
MovingPeriod
 MovingShift LC_shift
 6051,39  3051,39  15,94  53
 76
 12
 31
 5448,98  2448,98  10,71  54
 44
 30
 2
 5328,15  2328,15  11,90  50
 82
 13
 52
 5162,82  2162,82  10,46  71
 22
 26
 24
 5154,71  2154,71  14,34  54
 75
 14
 58

11. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento estático, USDJPY

5.1.3. Optimización del EA en el modo de desplazamiento dinámico

Parámetros de optimización:

Parámetro
 Inicio  Paso Stop
 Moving Average period
 12
 1
 90
 Moving Average shift
 6
 1
 30
 LC_shift  -2  1  -1

Tab. 12. Parámetros de optimización del EA Moving Average LC en el modo de desplazamiento dinámico

Gráfico de optimización del EA en el modo de desplazamiento dinámico, EURUSD:

Optimización en el modo de desplazamiento dinámico, EURUSD

Fig. 14 Optimización del EA Moving Average LC en el modo de desplazamiento dinámico, EURUSD

Los mejores resultados:

Resultado
Beneficio
Drawdown %
Total de trades
MovingPeriod
MovingShift
LC_shift
 3392,64  392,64  27,95  594  15  13  -2
 3140,26  140,26  23,35  514  12  17  -2
 2847,12  -152,88  17,04  390  79  23  -1
 2847,12  -152,88  17,04  390  79  12  -1
 2826,25  -173,75  20,12  350  85  22  -1

Tab. 13. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento dinámico, EURUSD

Gráfico de optimización del EA en el modo de desplazamiento dinámico, GBPUSD:

Optimización en el modo de desplazamiento dinámico, GBPUSD

Fig. 15 Optimización del EA Moving Average LC en el modo de desplazamiento dinámico, GBPUSD

Los mejores resultados:

 Resultado Beneficio
 Drawdown %
Total de trades
MovingPeriod
 MovingShift LC_shift
 5377,58  2377,58  19,73  391  12
 26
 -2
 3865,50  865,50  18,18  380  23
 23
 -2
 3465,63  465,63  21,22  329  48
 21
 -2
 3428,99  428,99  24,55  574  51
 16
 -1
 3428,99  428,99  24,55  574  51
 15
 -1

Tab. 14. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento dinámico, GBPUSD

Gráfico de optimización del EA en el modo de desplazamiento dinámico, USDJPY:

Optimización en el modo de desplazamiento dinámico, USDJPY

Fig. 16 Optimización del EA Moving Average LC en el modo de desplazamiento dinámico, USDJPY

Los mejores resultados:

Resultado
Beneficio
Drawdown %
 Total de trades
MovingPeriod
MovingShift
 LC_shift
 6500,19  3500,19  17,45  244
 42
 28
 -2
 6374,18  3374,18  19,91  243
 54
 24
 -2
 6293,29  3293,29  19,30  235
 48
 27
 -2
 5427,69  2427,69  17,65  245
 90
 8
 -2
 5421,83  2421,83  16,30  301
 59
 12
 -2

Tab. 15. Los mejores resultados de optimización del EA Moving Average LC en el modo de desplazamiento dinámico, USDJPY

5.2. Análisis de los resultados de la optimización del EA que tradea por el patrón «barra pin»

Vamos a comparar los resultados de la optimización del EA durante su trabajo en diferentes modos: sin desplazamiento, con desplazamiento estático y desplazamiento dinámico (DSO y DSC). La prueba se realiza para los pares EURUSD, GBPUSD y USDJPY, en el intervalo 2014.04.01 - 2014.10.25. Período H1.

Parámetros de entrada del EA:

 Parámetro Valor
Maximum Risk in percentage
0.1
Descrease factor
3.0
Pinbar min shadow, points
40
Pinbar max OC, points
110
Pinbar shadow to OC min ratio
1.4
SL, points (0 for OFF)
150
TP, points (0 for OFF)
300
LC Base Period
1 Minute
LC mode ON
true
LC shift
0

Tab. 16. Parámetros de entrada del EA Pinbar LC:

Vamos a optimizar los parámetros que caracterizan la geometría de la barra pin. Se trata de la longitud de la «nariz», relación entre la longitud de la «nariz» y el cuerpo de la barra central, así como el tamaño máximo del cuerpo. Además, vamos a optimizar los niveles Take Profit y Stop Loss.


5.2.1. Optimización del EA en el modo sin desplazamiento

Parámetros de optimización:

 Parámetro  Inicio  Paso  Stop
Pinbar min shadow, points
100
20
400
Pinbar max OC, points
20
20
100
Pinbar shadow to OC min ratio
1
0.2
3
SL, points (0 for OFF)
150
50
500
TP, points (0 for OFF)
150
50
500

Tab. 17. Parámetros de optimización del EA Pinbar LC en el modo sin desplazamiento

Gráfico de optimización del EA en el modo sin desplazamiento, EURUSD:

Optimización sin desplazamiento, EURUSD

Fig. 17 Optimización del EA Pinbar LC en el modo sin desplazamiento, EURUSD

Los mejores resultados:

Resultado
Beneficio
 Drawdown %
 Total de trades
 Pinbar min shadow
 Pinbar max OC
 Pinbar shadow
to OC min ratio
 SL  TP
 3504,59
 504,59
 9,82
 33
 100
 60
 1.8
 450
 500
 3428,89
 428,89
 8,72
 21
 120
 60
 2.8
 450
 350
 3392,37
 392,37
 9,94
 30
 100
 60
 2,6
 450
 250
 3388,54
 388,54
 9,93
 31
 100
 80
 2,2
 450
 300
 3311,84
 311,84
 6,84
 13
 140
 60
 2,2
 300
 450

Tab. 18. Los mejores resultados de optimización del EA Pinbar LC en el modo sin desplazamiento, EURUSD

Gráfico de optimización del EA en el modo sin desplazamiento, GBPUSD:

Optimización sin desplazamiento, GBPUSD

Fig. 18 Optimización del EA Pinbar LC en el modo sin desplazamiento, GBPUSD

Los mejores resultados:

Resultado
Beneficio
 Drawdown %
 Total de trades
 Pinbar min shadow
 Pinbar max OC
 Pinbar shadow
to OC min ratio
 SL  TP
 3187,13
 187,13
 11,10
 13
 160
 60
 2,6
 500
 350
 3148,73
 148,73
 3,23
 4
 220
 40
 2,8
 400
 400
 3142,67
 142,67
 11,27
 17
 160
 100
 1,8
 500
 350
 3140,80
 140,80
 11,79
 13
 180
 100
 2
 500
 500
 3094,20
 94,20
 1,62
 1
 260
 60
 1,6
 500
 400

Tab. 19. Los mejores resultados de optimización del EA Pinbar LC en el modo sin desplazamiento, GBPUSD

Gráfico de optimización del EA en el modo sin desplazamiento, USDJPY:

Optimización sin desplazamiento, USDJPY

Fig. 19 Optimización del EA Pinbar LC en el modo sin desplazamiento, USDJPY

Los mejores resultados:

Resultado
Beneficio
 Drawdown %
 Total de trades
 Pinbar min shadow
 Pinbar max OC
 Pinbar shadow
to OC min ratio
 SL  TP
 3531,99
 531,99
 9,00
 6
 160
 60
 2.2
 450
 500
 3355,91
 355,91
 18,25
 16
 120
 60
 1,6
 450
 400
 3241,93
 241,93
 9,11
 4
 160
 40
 2,8
 450
 500
 3180,43
 180,43
 6,05
 33
 100
 80
 1,8
 150
 450
 3152,97
 152,97
 3,14
 6
 160
 80
 2,8
 150
 500

Tab. 20. Los mejores resultados de optimización del EA Pinbar LC en el modo sin desplazamiento, USDJPY

5.2.2. Optimización del EA en el modo de desplazamiento estático

Parámetros de optimización:

 Parámetro  Inicio  Paso  Stop
 Pinbar min shadow, points
 100
 20
 400
 Pinbar max OC, points
 20
 20
 100
 Pinbar shadow to OC min ratio
 1
 0.2
 3
 SL, points (0 for OFF)
 150
 50
 500
 TP, points (0 for OFF)
 150
 50
 500
 LC shift
 1  1  59

Tab. 21. Parámetros de optimización del EA Pinbar LC en el modo de desplazamiento estático

Gráfico de optimización del EA en el modo de desplazamiento estático, EURUSD:

Optimización en el modo de desplazamiento estático, EURUSD

Fig. 20 Optimización del EA Pinbar LC en el modo de desplazamiento estático, EURUSD

Los mejores resultados:

Resultado
Beneficio
 Drawdown %
 Total de trades
 Pinbar min shadow
 Pinbar max OC
 Pinbar shadow
to OC min ratio
 SL  TP  LC shift
 4843,54
 1843,54
 10,14
 19
 120
 80
 1,6
 500
 500
 23
 4714,81
 1714,81
 10,99
 28
 100
 100
 1,6
 500
 500
 23
 4672,12
 1672,12
 10,16
 18  120
 80
 1,8
 500
 500
 23
 4610,13
 1610,13
 9,43
 19
 120
 80
 1,6
 450
 450
 23
 4562,21
 1562,21
 13,94
 27
 100
 100
 1,6
 500
 400
 25

Tab. 22. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento estático, EURUSD

Gráfico de optimización del EA en el modo de desplazamiento estático, GBPUSD:

Optimización en el modo de desplazamiento estático, GBPUSD

Fig. 21 Optimización del EA Pinbar LC en el modo de desplazamiento estático, GBPUSD

Los mejores resultados:

Resultado
Beneficio
 Drawdown %
 Total de trades
 Pinbar min shadow
 Pinbar max OC
 Pinbar shadow
to OC min ratio
 SL  TP  LC shift
 4838,10
 1838,10
 5,60
 34
 100
 40
 2,4
 450
 500
 24
 4797,09
 1797,09
 5,43
 35
 100
 40
 2,6
 400
 500
 24
 4755,57
 1755,57
 7,36
 42
 100
 100
 2
 400
 500
 24
 4725,41
 1725,41
 8,35
 45
 100
 80
 1
 400
 500
 24
 4705,61
 1705,61
 8,32
 41
 100
 100
 2
 450
 500
 24

Tab. 23. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento estático, GBPUSD

Gráfico de optimización del EA en el modo de desplazamiento estático, GBPUSD:

Optimización en el modo de desplazamiento estático, USDJPY

Fig. 22 Optimización del EA Pinbar LC en el modo de desplazamiento estático, USDJPY

Los mejores resultados:

Resultado
Beneficio
 Drawdown %
 Total de trades
 Pinbar min shadow
 Pinbar max OC
 Pinbar shadow
to OC min ratio
 SL  TP  LC shift
 4108,83
 1108,83
 6,45
 9
 140
 40
 1,4
 500
 450
 55
 3966,74
 966,74
 7,88
 12
 140
 60
 2,8
 450
 500
 45
 3955,32
 955,32
 9,91
 21
 120
 80
 2
 500
 500
 45
 3953,80
 953,80
 6,13
 10
 140
 60
 2,8
 450
 450
 47
 3944,33
 944,33
 6,42
 6
 160
 100
 2,6
 500
 400
 44

Tab. 24. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento estático, USDJPY

5.2.3. Optimización del EA en el modo de desplazamiento dinámico

Parámetros de optimización:

 Parámetro  Inicio  Paso  Stop
 Pinbar min shadow, points
 100
 20
 400
 Pinbar max OC, points
 20
 20
 100
 Pinbar shadow to OC min ratio
 1
 0.2
 3
 SL, points (0 for OFF)
 150
 50
 500
 TP, points (0 for OFF)
 150
 50
 500
 LC shift
 -2  1  -1

Tab. 25. Parámetros de optimización del EA Pinbar LC en el modo de desplazamiento dinámico

Gráfico de optimización del EA en el modo de desplazamiento dinámico, EURUSD:

Optimización en el modo de desplazamiento dinámico, EURUSD

Fig. 23 Optimización del EA Pinbar LC en el modo de desplazamiento dinámico, EURUSD

Los mejores resultados:

Resultado
Beneficio
 Drawdown %
 Total de trades
 Pinbar min shadow
 Pinbar max OC
 Pinbar shadow
to OC min ratio
 SL  TP  LC shift
 4185,65
 1185,65
 13,22
 49
 200
 100
 1,8
 450
 500
 -2
 4011,80
 1011,80
 13,75
 49
 200
 100
 2
 400
 500
 -2
 3989,28
 989,28
 12,01
 76
 140
 20
 1,2
 350
 200
 -1
 3979,50
 979,50
 16,45
 157
 100
 20
 1
 450
 500
 -1
 3957,25
 957,25
 16,68
 162
 100
 20
 1
 400
 500
 -1

Tab. 26. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento dinámico, EURUSD

Gráfico de optimización del EA en el modo de desplazamiento dinámico, GBPUSD:

Optimización en el modo de desplazamiento dinámico, GBPUSD

Fig. 24 Optimización del EA Pinbar LC en el modo de desplazamiento dinámico, GBPUSD

Los mejores resultados:

Resultado
Beneficio
 Drawdown %
 Total de trades
 Pinbar min shadow
 Pinbar max OC
 Pinbar shadow
to OC min ratio
 SL  TP  LC shift
 4906,84
 1906,84
 10,10
 179
 120
 40
 1,8
 500
 500
 -2
 4316,46
 1316,46
 10,71
 151
 120
 20
 2,4
 450
 500
 -1
 4250,96
 1250,96
 12,40
 174
 120
 40
 1,8
 500
 500
 -1
 4040,82
 1040,82
 12,40
 194
 120
 60
 2
 500
 200
 -2
 4032,85
 1032,85
 11,70
 139
 140
 40
 2
 400
 200
 -1

Tab. 27. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento dinámico, GBPUSD

Gráfico de optimización del EA en el modo de desplazamiento dinámico, USDJPY:

Optimización en el modo de desplazamiento dinámico, USDJPY

Fig. 25 Optimización del EA Pinbar LC en el modo de desplazamiento dinámico, USDJPY

Los mejores resultados:

Resultado
Beneficio
 Drawdown %
 Total de trades
 Pinbar min shadow
 Pinbar max OC
 Pinbar shadow
to OC min ratio
 SL  TP  LC shift
 5472,67
 2472,67
 13,01
 138
 100
 20
 2,4
 500
 500
 -1
 4319,84
 1319,84
 15,87
 146
 100
 20
 2,2
 400
 500
 -1
 4259,54
 1259,54
 19,71
 137
 100
 20
 2,4
 500
 500
 -2
 4197,57
 1197,57
 15,98
 152
 100
 20
 1
 350
 500
 -1
 3908,19
 908,19
 16,79
 110
 120
 40
 3
 400
 400
 -1

Tab. 28. Los mejores resultados de optimización del EA Pinbar LC en el modo de desplazamiento dinámico, USDJPY


6. Comparación de los resultados de optimización

Para construir la tabla comparativa, vamos a seleccionar los valores máximos del beneficio, reducción y el número de los trades de cada una de las tablas de los mejores resultados. Al lado del valor recibido en el modo de desplazamiento estático y dinámico apuntaremos por cuántos por cientos se ha cambiado este valor respecto al valor del modo sin desplazamiento.


6.1. EA que tradea por las medias móviles

Beneficio:

  Sin desplazamiento
 Desplazamiento
estático
Desplazamiento
dinámico
 EURUSD
 796,43
 1385,06 (+74%)
 392,64 (-51%)
 GBPUSD
 1025,75
 1571,07 (+53%)
 2377,58 (+132%)
 USDJPY
 2801,63
 3051,39 (+9%)
 3500,19 (+25%)

Tab. 29. Comparación de los valores máximos del beneficio a base de las tablas de los mejores resultados de optimización del EA Moving Average LC

Drawdown:

  Sin desplazamiento
 Desplazamiento
estático
Desplazamiento
dinámico
 EURUSD
 17,7
 21,52 (+22%)   
 27,95 (+58%)      
 GBPUSD
 18,16
 15,46 (-15%)
 24,55 (+35%)
 USDJPY
 17,14
 15,94 (-7%)
 19,91 (+16%)

Tab. 30. Comparación de los valores máximos de la reducción a base de las tablas de los mejores resultados de optimización del EA Moving Average LC

Total de trades:

  Sin desplazamiento
 Desplazamiento
estático
Desplazamiento
dinámico
 EURUSD
 111
 122 (+10%)     
 594 (+435%)       
 GBPUSD
 137
 107 (-22%)
 574 (+319%)
 USDJPY
 61
 71 (+16%)
 301 (+393%)

Tab. 31. Comparación de los valores máximos del número de trades a base de las tablas de los mejores resultados de optimización del EA Moving Average LC

Lo primero que salta a la vista es el aumento significante de los puntos de entrada en el modo de desplazamiento dinámico. Sin embargo, el drawdown también se ha aumentado bastante, y para el par EURUSD el beneficio ha bajado el doble.

El modo de desplazamiento estático conviene mucho mejor para este EA. Vemos la bajada del drawdown para GBPUSD y USDJPY, y un importante aumento del beneficio para EURUSD y GBPUSD.


6.2. EA que tradea por el patrón «barra pin»

Beneficio:

  Sin desplazamiento
 Desplazamiento
estático
Desplazamiento
dinámico
 EURUSD
504,59
1843,54 (+265%)
1185,65 (+135%)
 GBPUSD
187,13
1838,10 (+882%)
1906,84 (+919%)
 USDJPY
531,99
1108,83 (+108%) 2472,67 (+365%)

Tab. 32. Comparación de los valores máximos del beneficio a base de las tablas de los mejores resultados de optimización del EA Pinbar LC

Drawdown:

  Sin desplazamiento
 Desplazamiento
estático
Desplazamiento
dinámico
 EURUSD
9,94
13,94 (+40%)
16,68 (+68%)
 GBPUSD
11,79
8,35 (-29%)
12,4 (+5%)
 USDJPY
18,25
9,91 (-46%)
19,71 (+8%)

Tab. 33. Comparación de los valores máximos de la reducción a base de las tablas de los mejores resultados de optimización del EA Pinbar LC

Total de trades:

  Sin desplazamiento
 Desplazamiento
estático
Desplazamiento
dinámico
 EURUSD
33
28 (-15%)
162 (+391%)
 GBPUSD
17
45 (+165%)
194 (+1041%)
 USDJPY
33
21 (-36%)
152 (+361%)

Tab. 34. Comparación de los valores máximos del número de trades a base de las tablas de los mejores resultados de optimización del EA Pinbar LC

Aquí también observamos el aumento considerable del número de los trades en el modo de desplazamiento dinámico. Pero el aumento del drawdown tan importante como se veía para Moving Average LC, aquí se ve sólo para el par EURUSD. Para el resto de los pares el drawdown ha crecido ligeramente, unos 5-8%.

En el modo de desplazamiento estático la optimización ha mostrado el beneficio más moderado para GBPUSD y USDJPY. A pesar de eso, vemos la reducción del drawdown más notable para los mismos pares, y al revés, su aumento para EURUSD. En total, el modo de desplazamiento estático se ve menos atractivo para este EA.


Conclusión

En este artículo hemos considerado los principios de la construcción de un «gráfico líquido» y hemos comparado la influencia de sus modos de trabajo en los resultados de la optimización de los EAs que utilizan la estrategia de indicadores y la estrategia sin indicadores.

De aquí podemos deducir los siguiente:

  • El modo de desplazamiento estático conviene mejor para los EAs que utilizan las estrategias de indicadores (por ejemplo, los que tradean por las medias móviles). Asegura la entrada en el mercado más precisa, lo que lleva a la reducción del drawdown y al aumento del beneficio.
  • El modo de desplazamiento dinámico resulta más conveniente para los EAs que utilizan los patrones en el trading. Aumenta considerablemente el número de los puntos de entrada, pero por otro lado se aumenta también el drawdown.
  • El modo de desplazamiento dinámico en combinación con la Gestión del Capital bien organizada puede asegurar unos resultados bastante buenos.
  • El modo de desplazamiento estático, a pesar de ser bastante atractivo para las estrategias de indicadores, tiene un importante inconveniente. Es que el tamaño del desplazamiento que garantiza el mejor resultado es una variable más en la lista de los parámetros de entrada que hay que adivinar.

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

Archivos adjuntos |
liquid_chart.mq5 (27.15 KB)
pinbar_lc.mq5 (18.61 KB)
liquidchart.mqh (8.32 KB)
Jose Francisco Casado Fernandez
Jose Francisco Casado Fernandez | 3 mar. 2015 en 21:10
Muy interesante. Mis felicitaciones por el desarrollo. Saludos.
Recetas de estadística para el trader - Hipótesis Recetas de estadística para el trader - Hipótesis
En este artículo se estudia un concepto básico de la matemática estadística, la "hipótesis". Con ejemplos, aplicando métodos de matemática estadística, investigaremos y comprobaremos diferentes hipótesis. Se hacen generalizaciones de los datos reales con ayuda de métodos no paramétricos. Al procesar los datos, se usa el paquete Statistica la biblioteca portable de análisis numérico ALGLIB MQL5.
Trabajo con el SGBD MySQL desde MQL5 (MQL4) Trabajo con el SGBD MySQL desde MQL5 (MQL4)
Este artículo está dedicado al desarrollo de la interfaz entre MQL y SGBD MySQL. En el artículo se consideran las soluciones prácticas que existen en actualidad y se propone la versión más cómoda de ejecución de la biblioteca para el trabajo con SGBD. El artículo contiene la descripción detallada de las funciones, estructura de la interfaz, se dan los ejemplos y se describen algunas detalles a la hora de trabajar con MySQL. En cuanto a la solución de programa, han sido adjuntados los archivos con bibliotecas dinámicas, documentación y los ejemplos de los scripts para los lenguajes MQL4 y MQL5.
Principios de formación de precios en el mercado bursátil tomando de ejemplo la Sección de Derivados de la Bolsa de Moscú Principios de formación de precios en el mercado bursátil tomando de ejemplo la Sección de Derivados de la Bolsa de Moscú
En este artículo se describe la teoría de la formación de precios en la bolsa y la especifidad de los cálculos de compensación (Clearing) de la Sección de Derivados de la Bolsa de Moscú. La información que se expone en el artículo será interesante tanto para los traders principiantes que desean obtener su primera experiencia bursátil operando con derivados financieros, como para los traders experimentados que consideran la posibilidad de negociar en la plataforma bursátil centralizada.
Recetas MQL5 - procesamiento de eventos personalizados del gráfico Recetas MQL5 - procesamiento de eventos personalizados del gráfico
En este artículo vamos a estudiar varios aspectos sobre la confección de proyectos y el procesamiento de los eventos personalizados del gráfico en el entorno MQL5. Se propondrá un ejemplo de aproximación para la clasificación de eventos. Asimismo, se muestra el código de programa de la clase de evento y la clase de procesador de eventos personalizados.