Gráfico Líquido

6 fevereiro 2015, 10:05
Serhii Shevchuk
0
2 430

Introdução

Uma vez, eu reparei que os gráficos com o tempo igual ou superior a H4 parecia ser diferente em cada corretora. A razão por trás disso era que as corretores estão localizadas em diferentes fusos horários. Em alguns casos, certas partes dos mesmos gráficos eram significativamente diferentes, apesar da pequena diferença entre os fusos horários. Enquanto em um gráfico havia um padrão de reversão distinto na mesma parte do outra não havia qualquer padrão preciso.

Assim, passou em minha cabeça escrever um indicador que redesenhe o gráfico H1, de modo que haja sempre uma barra de fechamento completa à direita. O período M1 foi escolhido como a fonte dos preços. Como resultado, um gráfico horário era redesenhado a cada minuto e em uma hora eu tinha 60 variedades do mesmo gráfico horário. Sua forma foi mudando de uma forma suave e fluida revelando padrões escondidos que o padrão inicial não tinha sequer um sinal sobre isso.

Eu chamei este indicador de "gráfico líquido" devido a sua aparência específica. Dependendo do modo da plotagem, o "fluxo" do gráfico é redesenhado quando uma nova barra do período base aparece ou quando o valor do deslocamento estático fica alterado. Neste artigo vamos considerar os princípios de plotagem do "gráfico líquido", em seguida, escreverei um indicador e compararei a eficiência da utilização desta tecnologia através da negociação do Expert por indicadores e por padrões.



1. Princípios da Plotagem

Antes de começar, vamos definir os termos.

Shift ou Deslocamento é a diferença entre os preços de abertura das barras do gráfico resultante e os preços de abertura das barras do gráfico fonte.

Período gráfico atual é o tempo do gráfico de origem.

Período gráfico de base é um período de tempo com os preços que vamos usar para a formação das barras do gráfico resultante.

O período base não pode exceder ao atual. O período atual deve ser dividido pelo período de base, sem sobra. Quanto maior a relação entre o período atual para o de base, mais variações diferentes do gráfico resultante é possível obter. No entanto, se a relação for muito grande, então os dados históricos sobre o período de tempo de base podem não ser suficientes para desenhar o número necessário de barras do gráfico resultante.

Existem três tipos de plotar um gráfico.

  • Gráfico com um deslocamento estático (Static Shift ou SS).
  • Gráfico com um deslocamento dinâmico do modo de abertura (>Dynamic Shift, just Open ou DSO).
  • Gráfico com um deslocamento dinâmico do modo de fechamento (Dynamic Shift, expected Close ou DSC).

No modo de deslocamento estático, os tempos de abertura das barras são deslocadas pelo tempo definido. O deslocamento dinâmico no modo de abertura faz com que ele aparente ser uma barra que acabou de abrir e no modo de fechamento, como se a barra será fechada em breve.

Vamos dar uma olhada mais de perto.


1.1. Gráfico com Deslocamento estático

Neste modo, o tempo de cada barra de abertura é deslocada pelo número de minutos equivalente ao número do conjunto de períodos gráficos de base. Vamos chamá-lo de shift ou deslocamento. Desta forma, se o deslocamento do conjunto for igual a 0, então, o gráfico será exatamente o mesmo que a fonte. Deslocamento 1, desde que o período de tempo de base de 15 minutos seja igual a 15 minutos. O deslocamento 2 é igual a 30 minutos e assim por diante.

O deslocamento não pode ser superior a (k-1), onde k é uma razão entre o período de tempo atual e o de base. Isso significa que, com o período do gráfico atual em H1 e a opção básica em M1, o deslocamento máximo permitida é de 60/1 - 1 = 59 períodos de base, que é de 59 minutos. Se o período de base for M5, então, o deslocamento máximo permitido é de 60/5 - 1 = 11 períodos de base, que é de 55 minutos.

O tempo de abertura das barras para o período atual H1 e o deslocamento de 15 minutos, é 00:15, 01:15, 02:15 e assim por diante. Para o período atual M15 e o deslocamento de 1 minuto, o tempo das barras de abertura é de 00:16, 00:31, 00:46, 01:01 e assim por diante.

Quando os deslocamentos são próximos aos valores-limite, tal gráfico raramente se diferencia da fonte. Diferenças significativas aparecem quando o valor do deslocamento esta perto do meio do intervalo permitido.

Gráfico com deslocamento estático

Fig. 1. Exemplo de formação das barras horárias no período de base de M15 com o valor de deslocamento igual a 1


1.2. Gráfico com Deslocamento dinâmico no Modo de Abertura

Neste modo, o deslocamento é recalculado a cada vez que uma nova barra do período de base aparece. Ao mesmo tempo, o deslocamento é calculado de modo que o tempo de existência da barra no final do gráfico (os últimos preços) não exceda o valor do período de base. Se o período atual é H1 e o de base é M5, ele irá aparentar como se a barra da extrema-direita fosse aberta não mais cedo do que há cinco minutos atrás.

Gráfico com deslocamento dinâmico, começo da barra

Fig. 2. Exemplo de formação das barras horárias no gráfico de base M15 com deslocamento dinâmico no modo de abertura


1.3. Gráfico com um deslocamento dinâmico no modo de fechamento

Neste modo, o deslocamento é recalculado a cada vez que uma nova barra do gráfico de base aparecer, como no modo de abertura. A única diferença é que o deslocamento é calculado de maneira que o tempo de existência da barra no final do gráfico (os últimos preços) for maior ou igual à diferença entre os períodos de tempo atuais e de base. Se o período atual é H1 e o de base é M5, ele irá aparentar como se a barra da extrema-direita fosse fechar não mais tarde do que cinco minutos.

Gráfico com deslocamento dinâmico, barra completa

Fig. 3. Exemplo de formação das barras horárias no gráfico de base M15 com deslocamento dinâmico no modo de fechamento


2. Conversão dos Dados

A função GetRatesLC() foi escrita para converter os dados históricos, levando em conta o deslocamento definido. Ele escreve os dados históricos modificados para o array de estruturas do tipo MqlRates, semelhante a função CopyRates().

int GetRatesLC(
   int             start_pos    // source for copying
   int             len,         // amount to copy
   MqlRates&       rates[],     // target array
   ENUM_TIMEFRAMES base_period, // basic timeframe
   int&            shift        // shift
   );

Parâmetros

  start_pos

   [in]  O índice do primeiro elemento no período atual. É o ponto de partida para a conversão dos dados e copiar para o buffer.

  len

   [in]  Número de elementos copiados.

  rates[]

   [out]  Array do tipo MqlRates.

  base_period

   [in]  Período base 

  shift

   [in] [out]  Deslocamento. Ele pode aceitar os seguintes valores:

ValorDescrição
 -2
 Calcula o deslocamento no modo de abertura (início da formação da barra)
 -1
 Calcula o deslocamento no modo de fechamento (fim da formação da barra)
 0 ... N
 Aplicar o deslocamento definido. Ele pode aceitar os valores de 0 a N.
 N = Tcur/Tbase - 1. Onde Tcur é o período atual, TBase é o a base.

Tabela 1. Os valores permitidos do parâmetro shift

Se a função é implementada com sucesso, shift receberá o valor calculado do deslocamento se os valores -1 ou -2 forem passados.

Valor retornado

Número de elementos copiados ou o código de erro:

CódigoDescrição
 -1
 Período base especificado incorretamente
 -2
 Deslocamento especificado incorretamente

Tabela 2. Códigos de erro retornados

Abaixo está o código da função GetRatesLC() do arquivo liquidchart.mqh.

int GetRatesLC(int start_pos,int len,MqlRates &rates[],ENUM_TIMEFRAMES base_period,int& shift)
  {
   //--- number of basic timeframes contained in the current one  
   int k=PeriodSeconds()/PeriodSeconds(base_period);
   if(k==0)
      return(-1);//basic timeframe specified incorrectly
   //---
   MqlRates r0[];
   ArrayResize(rates,len);
   if(CopyRates(_Symbol,_Period,start_pos,1,r0)<1)
      return(0);// no data
   //---
   int sh;
   if(shift>=0)
     {
      //--- fixed shift
      if(shift<k)
         sh=shift;
      else
         return(-2);//--- shift specified incorrectly   
     }
   else if(shift==-1)
     {
      //--- shift to be calculated (dynamic, beginning of the bar formation)
      sh=int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period));
     }
   else if(shift==-2)
     {
      //--- shift to be calculated (dynamic, end of the bar formation)
      sh=1+int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period));
      if(sh>=k)
         sh = 0;
     }
   else
      return(-2);//shift specified incorrectly       
   //--- opening time of the basic period bar, which is the beginning of the current period bar formation
   //--- synchronization of the time of opening bars takes place relative to the tO time
   datetime tO;
   //--- closing time of the bar under formation, i.e. opening time of the last bar of basic timeframe in the series
   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;
      //--- time of the bar with the (l-1) index does not have to be equal to tC
      //--- if there is no bar with the tC time, it can be the nearest bar
      //--- in any case its time is assigned to the tC time
      tC=r0[l-1].time;
      //--- check if tO has the correct value and modify if needed.
      while(tO>tC)
         tO-=PeriodSeconds();
      //--- the time values of tO and tC have actual meaning for the bar under formation  
      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;
           }
      //--- specifying closing time of the next bar in the loop
      tC=tO-PeriodSeconds(base_period);
      //
      cnt++;
     }
   if(cnt<len)
     {
      //-- less data than required, move to the beginning of the buffer
      int d=len-cnt;
      for(int j=0; j<cnt; j++)
         rates[j]=rates[j+d];
      for(int j=cnt;j<len;j++)
        {
         //--- fill unused array elements with zeros
         rates[j].close=0;
         rates[j].open=0;
         rates[j].high=0;
         rates[j].low=0;
         rates[j].time=0;
        }
     }
   shift = sh;  
   return(cnt);
  }

Alguns pontos importantes devem ser destacados.

  • A função não retorna volumes de tick. A razão para isto é que, no modo DSC a função nunca retorna o volume igual a um, como acontece na abertura da barra. Isto é bastante lógico. Se o Expert Advisor usa o volume tick igual a um como sinal de uma nova barra em formação, ele nunca vai receber esse sinal. Este método é utilizado na Média Móvel do Expert Advisor. Você pode adicionar uma contagem do volume de ticks para a função, mas ela não trabalhará corretamente. Para evitar confusão eu não vou medir o volume dos ticks.
  • A função retorna o número de barras solicitadas, mas isso não significa que o tempo entre a primeira e a última barra será compatível com o intervalo de tempo correspondente no gráfico de origem. No entanto, em um segmento contínuo de dados históricos haverá correspondência. Se o segmento especificado contém fins de semana, "barras fantasmas" podem aparecer na fronteira.

A figura abaixo representa um exemplo de um "barra fantasma". Esta barra foi formada para o primeiro minuto de outubro, no dia 27, que foi incluída na barra, juntamente com o tempo de abertura das 23:01 no dia 26 de outubro. Deve-se notar que depois de tais barras, o gráfico do indicador vai ser deslocado para a esquerda em relação ao gráfico fonte. As barras com o tempo correspondente ao tempo inicial (por exemplo, 21:00 -> 21:01), terão diferentes índices.

Barra fantasma

Fig. 4. Barra fantasma as 23:01 do dia 26/10/2014



3. Implementação do Indicador

Vamos escrever um indicador que exibe o "gráfico líquido" em uma janela separada. O indicador deve funcionar em todos os três modos: o modo de deslocamento estático, deslocamento dinâmico no modo de abertura da barra e o deslocamento dinâmico no modo de fechamento da barra. O indicador também tem que ter elementos de controle para alterar os modos e o valor da deslocação sem a necessidade de chamar o diálogo de parâmetros dos indicadores.

Para começar vamos usar a função GetRatesLC() do arquivo liquidchart.mqh. Vamos chamá-lo a partir da função RefreshBuffers(), na qual, por sua vez, é chamado a partir da função OnCalculate. Ele também pode ser chamado de OnChartEvent, desde que algumas alterações no modo ou no deslocamento e recálculo dos buffers dos indicadores sejam obrigatórios. A função OnChartEvent será tratada pressionando os botões e alterando os valores do deslocamento e do modo.

Parâmetros de entrada do 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

onde a profundidade é o número de barras do gráfico resultante e ENUM_LC_MODE é o tipo que descreve os modos de plotagem do indicador:

enum ENUM_LC_MODE
  {//plotting mode
   LC_MODE_SS=0,  // Static Shift
   LC_MODE_DSO=1, // Dynamic Shift, just Open
   LC_MODE_DSC=2  // Dynamic Shift, expected Close
  };
Os parâmetros inp_LC_mode e inp_LC_shift são duplicadose de acordo com LC_mode e LC_shift. Este projeto permite mudar seus valores, pressionando o botão. Desenhando os botões e o tratamento em pressionar os botões não serão considerados já que eles não são relevantes para o tema deste artigo. Vamos considerar a função RefreshBuffers() em detalhe.
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; //static shift
   else if(LC_mode==LC_MODE_DSO)
      shift = -1;       //calculate shift (beginning of the bar formation)
   else if(LC_mode==LC_MODE_DSC)
      shift = -2;       //calculate shift (end of the bar formation)
   else
      return(false);
//---
   copied=GetRatesLC(0,Depth,rates,BaseTF,shift);
//---
   if(copied<=0)
     {
      Print("No data");
      return(false);
     }
   LC_shift = shift;
   refr_keys();
//--- initialize buffers with empty values
   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;//bullish or doji
      else
         col_buffer[buffer_index]=0;//bearish
      //
      buffer_index++;
     }
//
   return(true);
  }

A primeira vista, um valor relevante da variável shift deve ser passada para a função GetRatesLC() que depende do modo. No modo estático, ela será uma cópia do parâmetro LC_shift e nos modos de abertura ou encerramento da barra será -1 ou -2 correspondentemente. Após a execução bem-sucedida da função GetRatesLC(), ela retorna o valor atual do deslocamento para a variável shift . Ela é recalculada ou deixada como está. Em todo caso, vamos atribuir o seu valor para a variável LC_shift e, em seguida, chamar o redesenho dos elementos gráficos, pela função refr_keys().

Depois disso, renovamos os valores OHLC e as cores da barra nos buffers de indicadores.

O código completo do indicador pode ser encontrado no arquivo liquid_chart.mq5. Após o lançamento, o indicador tem a seguinte forma:

O indicador Gráfico Líquido, deslocamento 0

Fig. 5. O indicador Gráfico Líquido

Algumas palavras sobre os elementos de controle.

  • O botão SS, muda o indicador para o modo de deslocamento estático. Botões com setas estão ativos neste modo e eles podem ser usados ​​para definir o valor necessário do deslocamento.
  • O botão DSO muda o indicador para o modo de deslocamento dinâmico, a partir da formação da barra. Neste modo, o valor do desvio é calculado e ele não pode ser modificado manualmente.
  • O botão DSC muda o indicador para o modo de deslocamento dinâmico, a partir do fechamento da barra. Neste modo, a modificação manual do deslocamento não está disponível também.

No modo SS, quando o valor do desvio é 0, o indicador duplica os valores do gráfico inicial. Se você alterar o deslocamento, você verá o gráfico ser redesenhado. Uma diferença notável já aparece no valor de 28. Em vez de uma "linha" mesquinha há um distinto "martelo". Está na hora de comprar?

O indicador Gráfico Líquido, deslocamento 28

Fig. 6. O indicador Gráfico Líquido, deslocamento estático 28

Alterne o indicador para o modo DSO, e um barra recém formada estará sempre a direita. No modo DSC, há uma barra que irá fechar antes do que o valor do período base.


4. Criando um Expert

Vamos criar dois Experts. O primeiro deles será negociado pela média móvel e o segundo pelo padrão de barra "pin bar".

Vamos pegar o Expert Média Móvel dos exemplos padrão (na pasta Experts\Examples\Moving Average) como modelo. Desta forma, seremos capazes de comparar os resultados da otimização de duas estratégias essencialmente diferentes para entender quando o uso do deslocamento estático ou dinâmico é relevante e de alguma importância.


4.1. Expert que Negocia pela Média Móvel

A princípio, os parâmetros de entrada devem ser definidos. Há quatro delas:

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

Mais três parâmetros serão adicionados depois da modernização:

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

O parâmetro LC_on será útil para verificar se a função GetRatesLC() funciona corretamente. A combinação (LC_on == true && LC_shift == 0) deve ter o mesmo resultado que (LC_on == false).

Para melhorarmos o Expert pronto Média Móvel com o deslocamento, o arquivo liquidchart.mqh tem de ser incluído e as funções CopyRates() têm de ser substituídas com as funções GetRatesLC() para aqueles casos em que o recurso de deslocamento está habilitado (parâmetro de entrada LC_on é 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;
     }

É necessário ser feito para ambas as funções CheckForOpen() e CheckForClose(). Temos de recusar o uso do manipulador do indicador e calcular as médias móveis manualmente. Para isso, acrescentamos a função 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);
  }

Ele retorna o número necessário de valores ou 0 no buffer ma[], se por algum motivo houver falha na obtenção.

O controle de abertura das barras é outro ponto importante a considerar. Na versão original o Expert Advisor Média Móvel foi implementado através da utilização dos valores de ticks:

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

No nosso caso, não há volume de ticks e, portanto, nós estaremos escrevendo a função NewBar() para controlar abertura barra:

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

O princípio de funcionamento encontra-se na comparação entre o tempo da barra com o valor anterior de abertura. Vamos substituir a verificação do volume de tick para a chamada da função NewBar() nas funções CheckForOpen() e CheckForClose():

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

O código completo do Expert pronto pode ser encontrado no arquivo moving_average_lc.mq5.


4.2. Expert Advisor que Negocia pelo Padrão "Pin Bar"

Pin Bar ou Pinocchio bar é um padrão que consiste em três barras. A barra do meio tem que ter uma longa sombra ou "nariz", indicando uma provável reversão do movimento dos preços. As barras na parte lateral são chamadas de "olhos". Seus pontos extremos não devem sair da sombra da barra vizinha. Este padrão é popular com os traders que negociam através de modelos de candlestick (velas).

Nosso pin bar tem que cumprir as seguintes condições para reverter a baixa de preços:

  • A barra r[0] deve ser alta.
  • A barra r[2] deve ser de baixa.
  • O maior valor dos preços de A e C não devem exceder B, Onde A e C são os valores de Máxima das barras r[0] e r[2], respectivamente. B é o preço de Máxima da barra r[1].
  • O corpo da barra do meio, que é o módulo da diferença entra a Abertura e o Fechamento (OC na figura) da barra de r[1], não deve exceder o número de pontos fixados pelo parâmetro externo.
  • A sombra da barra do meio, ou a diferença do preço Máximo e o maior de valor de Abertura e Fechamento da barra r[1], não deve ser menor do que o número de pontos definidos pelo parâmetro externo.
  • A razão entre a barra de sombra do meio para seu corpo não deve ser menor do que o valor definido pelo parâmetro externo.

O tesde de verificação padrão vai ser realizado no momento da abertura da barra r[3].

Pinbar

Fig. 7. O padrão "Pin Bar"

O Código que define a presença da barra pin bar para a reversão para baixo deve ficar assim:

   if(r[0].open<r[0].close && r[2].open>r[2].close && r[1].high>MathMax(r[0].high,r[2].high))
     {
     //--- eyes of the upper pin bar
      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);
     }

O mesmo para a reversão para cima. Assim, a função de verificação da presença da barra pin bar ficará da seguinte forma:

int IsPinbar(MqlRates &r[])
  {
   //--- there must be 4 values in the r[] array
   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))
     {
      //--- eyes of the upper pin bar
      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))
     {
      //--- eyes of the lower pin bar
      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);
  }

O array passado de dados históricos não deve ter menos do que quatro elementos. No caso da barra pin bar superior ser detectada (que é a barra pin bar indicando a reversão para baixo), a função irá retornar o valor de 1. No caso de haver um pin bar menor (suposta inversão para cima), a função retornará o valor de -1. A função retornará 0 se não há pin bar. A função também utiliza os seguintes parâmetros de entrada:

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

Estamos negociando pela estratégia de negociação mais simples da pin bar. Vamos vender se uma inversão para baixo é esperada e comprar, se a reversão for para cima. Normalmente, as confirmações de indicadores são necessários, mas desta vez não vamos usá-los para manter a integridade experimental. Nós vamos utilizar apenas a pin bar.

O Expert Advisor que negocia pelo padrão "Pin Bar" será baseado no Expert que negocia pela média móvel. A função CopyMABuffer() tem de ser eliminada por último, bem como chamar esta função a partir das funções CheckForOpen() e CheckForClose(). O número de solicitações de dados históricos é para ser aumentado de dois para quatro. O tempo da barra r[3] será utilizada na verificação para a nova abertura da barra.

   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;

A verificação de um sinal para uma abertura de posição será algo como:

   int pb=IsPinbar(rt);
   if(pb==1)       // upper pin bar
      signal=ORDER_TYPE_SELL; // sell conditions
   else if(pb==-1) // lower pin bar
      signal=ORDER_TYPE_BUY// buy conditions

Para fechar a posição pelo pin bar oposto:

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

Por favor, note que, em condições rigorosas nos parâmetros de entrada, a pin bar raramente ocorre. Portanto, quando fechar uma posição apenas por pin bar oposta, existe o risco de perder o lucro ou fechar no prejuízo

Neste contexto, nós adicionamos os níveis de Take Profit e Stop Loss. Eles vão ser definidos pelos parâmetros externos inp_tp_pp e 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);

Se o valor de inp_tp_pp ou inp_sl_pp é zero, então o nível correspondente de Take Profit ou Stop Loss não será definido.

A modificação está completa. O Expert está pronto. O código completo pode ser encontrado no arquivo pinbar_lc.mq5.


5. Otimização do Expert

Para avaliar a eficácia dos gráficos com o deslocamento nas diferentes estratégias, vamos utilizar a otimização do Expert com uma comparação posterior dos melhores resultados. Os parâmetros mais importantes aqui são lucro, rebaixamento e o número de negócios. O Expert Advisor que negocia por Média Móvel servirá como exemplo de uma estratégia com indicador e o Expert que negocia pelo padrão "Pin Bar" irá representar um caso de estratégia que não utiliza indicadores.

A otimização será realizada com cotações da última metade de um ano a partir dos servidores da MetaQuotes-Demo. O experimento será conduzido para EURUSD, GBPUSD e USDJPY. O depósito inicial é de $3000 com alavancagem de 1:100. O modo de teste é para "Cada Tick". Modo de otimização - rápido (algoritmo genético), Balance Max.


5.1. Análise dos resultados da otimização do Expert que negocia através da Média Móvel

Vamos comparar os resultados da otimização de um Expert quando ele está a trabalhar em diferentes modos: com zero de deslocamento, com o deslocamento estático e com o deslocamento dinâmico (DSO e DSC).

O teste será realizado para EURUSD, GBPUSD e USDJPY no período de 01/04/2014 - 25/10/2014 (últimos seis meses). Período H1.

Parâmetros de entrada do Expert:

Parâmetro
Valor
 Risco máximo em percentagem
 0.1
 Fator de diminuição
 3.0
 Período da Média Móvel
 12
 Deslocamento da Média Móvel
 6
 BaseTF
 1 Minute
 LC_on
 true
 LC_shift
 0

Tabela 3. Parâmetros de entrada do Expert Média Móvel LC

5.1.1. Otimização do Expert com o Modo de Deslocamento desativado

Parâmetros otimizados:

Parâmetro
 Início PassoParada
 Período da Média Móvel
 12
 1
 90
 Deslocamento da Média Móvel
 6
 1
 30

Tabela 4. Parâmetros otimizados do Expert Média Móvel LC no modo de deslocamento zero

Gráfico que descreve a otimização do Expert no modo de deslocamento desativado, EURUSD:

Otimização no modo de deslocamento zero, EURUSD

Fig. 8. Otimização do Expert Média Móvel LC no modo de deslocamento zero, EURUSD

Os melhores resultados:

 Resultado
 LucroRebaixamento %
Número de negócios
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

Tabela 5. Melhores resultados do Expert Média Móvel LC para o EURUSD no modo de deslocamento zero

Gráfico que representa a otimização do Expert no modo de deslocamento zero, GBPUSD:

Otimização no modo de deslocamento zero, GBPUSD

Fig. 9. Otimização do Expert Média Móvel LC no modo de deslocamento zero, GBPUSD

Os melhores resultados:

 Resultado LucroRebaixamento %
 Número de negócios
 MovingPeriodMovingShift
 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

Tabela 6. Melhores resultados da otimização do Expert Média Móvel LC para GBPUSD no modo de deslocamento zero

Gráfico que representa a otimização do Expert com o modo de deslocamento desativado, USDJPY:

Otimização no modo de deslocamento zero, USDJPY

Fig. 10. Otimização do Expert Média Móvel LC no modo de deslocamento zero, USDJPY

Os melhores resultados:

Resultado
Lucro
Rebaixamento %
Número de negócios
 MovingPeriod MovingShift
5801,632801,6311,5448
65
23
5789,172789,1714,0350
44
27
5539,062539,0617,1446
67
27
5331,342331,3415,0561
70
9
5045,192045,1912,6148
83
15

Tabela 7. Melhores resultados do Expert Média Móvel LC para USDJPY no modo de deslocamento zero

5.1.2. Otimização do Expert no modo de deslocamento estático

Parâmetros otimizados:

Parâmetro
 Início PassoParada
 Período da Média Móvel
 12
 1
 90
 Deslocamento da Média Móvel
 6
 1
 30
 LC_shift 1 1 59

Tabela 8. Parâmetros otimizados do Expert Média Móvel LC no modo de deslocamento estático

Gráfico que representa a otimização do Expert no modo de deslocamento estático, EURUSD:

Otimização no modo de deslocamento estático, EURUSD

Fig. 11. Otimização do Expert Média Móvel LC no modo de deslocamento estático, EURUSD

Os melhores resultados:

Resultado
Lucro
 Rebaixamento %
 Número de negócios
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

Tabela 9. Os melhores resultados da otimização do Expert Média Móvel LC para EURUSD no modo de deslocamento estático

Gráfico que representa a otimização do Expert no modo de deslocamento estático, GBPUSD:

Otimização no modo de deslocamento estático, GBPUSD

Fig. 12. Otimização do Expert Média Móvel LC no modo de deslocamento estático, GBPUSD

Os melhores resultados:

 Resultado LucroRebaixamento %
Número de negócios
 MovingPeriod MovingShiftLC_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

Tabela 10. Os melhores resultados da otimização do Expert Média Móvel LC para GBPUSD no modo de deslocamento estático

Gráfico que representa a otimização do Expert no modo de deslocamento estático, USDJPY:

Otimização no modo de deslocamento estático, USDJPY

Fig. 13. Otimização do Expert Média Móvel LC no modo de deslocamento estático, USDJPY

Os melhores resultados:

Resultado
Lucro
Rebaixamento %
Número de negócios
MovingPeriod
 MovingShiftLC_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

Tabela 11. Os melhores resultados da otimização do Expert Média Móvel LC para USDJPY no modo de deslocamento estático

5.1.3. Otimização do Expert no modo de deslocamento dinâmico

Parâmetros otimizados:

Parâmetro
 Início PassoParada
 Período da Média Móvel
 12
 1
 90
 Deslocamento da Média Móvel
 6
 1
 30
 LC_shift -2 1 -1

Tabela 12. Parâmetros otimizados do Expert Média Móvel LC no modo de deslocamento dinâmico

Gráfico que representa a otimização do Expert no modo de deslocamento dinâmico, EURUSD:

Otimização no modo de deslocamento dinâmico, EURUSD

Fig. 14. Otimização do Expert Média Móvel LC no modo de deslocamento dinâmico, EURUSD

Os melhores resultados:

Resultado
Lucro
Rebaixamento %
Número de negócios
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

Tabela 13. Os melhores resultados da otimização do Expert Média Móvel LC para EURUSD no modo de deslocamento dinâmico

Gráfico que representa a otimização do Expert no modo de deslocamento dinâmico, GBPUSD:

Otimização no modo de deslocamento dinâmico, GBPUSD

Fig. 15. Otimização do Expert Média Móvel LC no modo de deslocamento dinâmico, GBPUSD

Os melhores resultados:

 ResultadoLucro
 Rebaixamento %
Número de negócios
MovingPeriod
 MovingShiftLC_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

Tabela 14. Os melhores resultados da otimização do Expert Média Móvel LC para GBPUSD no modo de deslocamento dinâmico

Gráfico que representa a otimização do Expert no modo de deslocamento dinâmico, USDJPY:

Otimização no modo de troca dinâmico, USDJPY

Fig. 16. Otimização do Expert Média Móvel LC no modo de troca dinâmico, USDJPY

Os melhores resultados:

Resultado
Lucro
Rebaixamento %
 Número de negócios
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

Tabela 15. Os melhores resultados de otimização do Expert Média Móvel LC para USDJPY no modo de deslocamento dinâmico

5.2. Análise de Otimização de Resultados do Expert que Negocia pelo Padrão "Pin Bar"

Vamos comparar os resultados da otimização de um Expert quando ele está a trabalhar em diferentes modos: com zero de deslocamento, com o deslocamento estático e com o deslocamento dinâmico (DSO e DSC). O teste será realizado para EURUSD, GBPUSD e USDJPY, sobre o período de 01/04/2014 - 25/10/2014. Período H1.

Parâmetros de entrada do Expert:

 ParâmetroValor
Risco máximo em percentagem
0.1
Fator de diminuição
3.0
Sombra min de Pin bar, pontos
40
OC max de Pin bar, pontos
110
sombra de Pin bar para a razão min de OC
1.4
SL, pontos (0 para OFF)
150
TP, pontos (0 para OFF)
300
Período base LC
1 Minute
LC mode ON
true
Deslocamento LC
0

Tabela 16. Parâmetros de entrada do Expert Pin Bar LC

Nós vamos otimizar os parâmetros que definem a forma do pin bar: comprimento do "nariz", razão entre o comprimento do "nariz" para o corpo da barra do meio e o tamanho máximo do corpo. Os níveis de Take Profit e Stop Loss também serão otimizados.


5.2.1. Otimização do Expert com o Modo de Deslocamento desativado

Parâmetros otimizados:

 Parâmetro Início Passo Parada
Sombra min de Pin bar, pontos
100
20
400
OC max de Pin bar, pontos
20
20
100
sombra de Pin bar para a razão min de OC
1
0.2
3
SL, pontos (0 para OFF)
150
50
500
TP, pontos (0 para OFF)
150
50
500

Tabela 17. Parâmetros otimizados do Expert Pin Bar LC com o modo de deslocamento desabilitado

Gráfico que descreve a otimização do Expert no modo de deslocamento desativado, EURUSD:

Otimização com deslocamento zero, EURUSD

Fig. 17. Otimização do Expert Pin Bar LC no modo de deslocamento zero, EURUSD

Os melhores resultados:

Resultado
Lucro
 Rebaixamento %
 Número de negócios
 Sombra min de Pin bar
 OC max de Pin bar
 sombra de Pin bar
para a razão min de OC
 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

Tabela 18. Os melhores resultados da otimização do Expert Pin Bar LC para EURUSD no modo de deslocamento zero

Gráfico que representa a otimização do Expert no modo de deslocamento zero, GBPUSD:

Otimização com deslocamento zero, GBPUSD

Fig. 18. Otimização do Expert Pin Bar LC no modo de deslocamento zero, GBPUSD

Os melhores resultados:

Resultado
Lucro
 Rebaixamento %
 Número de negócios
 Sombra min de Pin Bar
 OC max de Pin Bar
 Sombra de Pin Bar
para a razão min de OC
 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

Tabela 19. Os melhores resultados da otimização do Expert Pin Bar LC para GBPUSD no modo de deslocamento zero

Gráfico que representa a otimização do Expert com o modo de deslocamento desativado, USDJPY:

Otimização com deslocamento zero, USDJPY

Fig. 19. Otimização do Expert Pin Bar LC no modo de deslocamento zero, USDJPY

Os melhores resultados:

Resultado
Lucro
 Rebaixamento %
 Número de negócios
 Sombra min de Pin bar
 OC max de Pin bar
 sombra de Pin bar
para a razão min de OC
 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

Tabela 20. Os melhores resultados da otimização do Expert Pin Bar LC para USDJPY no modo de deslocamento zero

5.2.2. Otimização do Expert no modo de deslocamento estático

Parâmetros otimizados:

 Parâmetro Início Passo Parada
 Sombra min de Pin bar, pontos
 100
 20
 400
 OC max de Pin bar, pontos
 20
 20
 100
 sombra de Pin bar para a razão min de OC
 1
 0.2
 3
 SL, pontos (0 para OFF)
 150
 50
 500
 TP, pontos (0 para OFF)
 150
 50
 500
 Deslocamento LC
 1 1 59

Tabela 21. Parâmetros otimizados do Expert Pin Bar LC no modo de deslocamento estático

Gráfico que representa a otimização do Expert no modo de deslocamento estático, EURUSD:

Otimização no modo de deslocamento estático, EURUSD

Fig. 20. Otimização do Expert Pin Bar LC no modo de deslocamento estático, EURUSD

Os melhores resultados:

Resultado
Lucro
 Rebaixamento %
 Número de negócios
 Sombra min de Pin bar
 OC max de Pin bar
 sombra de Pin bar
para a razão min de OC
 SL TP Deslocamento LC
 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

Tabela 22. Os melhores resultados da otimização do Expert Pin Bar LC para EURUSD no modo de deslocamento estático

Gráfico que representa a otimização do Expert no modo de deslocamento estático, GBPUSD:

Otimização no modo de deslocamento estático, GBPUSD

Fig. 21. Otimização do Expert Pin Bar LC no modo de deslocamento estático, GBPUSD

Os melhores resultados:

Resultado
Lucro
 Rebaixamento %
 Número de negócios
 Sombra min de Pin bar
 OC max de Pin bar
 sombra de Pin bar
para a razão min de OC
 SL TP Deslocamento LC
 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

Tabela 23. Os melhores resultados da otimização do Expert Pin Bar LC para GBPUSD no modo de deslocamento estático

Gráfico que representa a otimização do Expert no modo de deslocamento estático, USDJPY:

Otimização no modo de deslocamento estático, USDJPY

Fig. 22. Otimização do Expert Pin Bar LC no modo de deslocamento estático, USDJPY

Os melhores resultados:

Resultado
Lucro
 Rebaixamento %
 Número de negócios
 Sombra min de Pin Bar
 OC max de Pin bar
 sombra de Pin bar
para a razão min de OC
 SL TP Deslocamento LC
 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

Tabela 24. Os melhores resultados da otimização do Expert Pin Bar LC para USDJPY no modo de deslocamento estático

5.2.3. Otimização do Expert no modo de deslocamento dinâmico

Parâmetros otimizados:

 Parâmetro Início Passo Parada
 Sombra min de Pin bar, pontos
 100
 20
 400
 OC max de Pin bar, pontos
 20
 20
 100
 sombra de Pin bar para a razão min de OC
 1
 0.2
 3
 SL, pontos (0 para OFF)
 150
 50
 500
 TP, pontos (0 para OFF)
 150
 50
 500
 Deslocamento LC
 -2 1 -1

Tabela 25. Parâmetros otimizados do Expert Pin Bar LC no modo de deslocamento dinâmico

Gráfico que representa a otimização do Expert no modo de deslocamento dinâmico, EURUSD:

Otimização no modo de deslocamento dinâmico, EURUSD

Fig. 23. Otimização do Expert Pin Bar LC no modo de deslocamento dinâmico, EURUSD

Os melhores resultados:

Resultado
Lucro
 Rebaixamento %
 Número de negócios
 Sombra min de Pin bar
 OC max de Pin bar
 sombra de Pin bar
para a razão min de OC
 SL TP Deslocamento LC
 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

Tabela 26. Os melhores resultados da otimização do Expert Pin Bar LC para EURUSD no modo de deslocamento estático

Gráfico que representa a otimização do Expert no modo de deslocamento dinâmico para GBPUSD:

Otimização no modo de deslocamento dinâmico, GBPUSD

Fig. 24. Otimização do Expert Pin Bar LC no modo de deslocamento dinâmico, GBPUSD

Os melhores resultados:

Resultado
Lucro
 Rebaixamento %
 Número de negócios
 Sombra min de Pin bar
 OC max de Pin bar
 sombra de Pin bar
para a razão min de OC
 SL TP Deslocamento LC
 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

Tabela 27. Os melhores resultados da otimização do Expert Pin Bar LC para GBPUSD no modo de deslocamento dinâmico

Gráfico que representa a otimização do Expert no modo de deslocamento dinâmico, USDJPY:

Otimização no modo de troca dinâmico, USDJPY

Fig. 25. Otimização do Expert Pin Bar LC no modo de deslocamento dinâmico, USDJPY

Os melhores resultados:

Resultado
Lucro
 Rebaixamento %
 Número de negócios
 Sombra min de Pin bar
 OC max de Pin bar
 sombra de Pin bar
para a razão min de OC
 SL TP Deslocamento LC
 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

Tabela 28. Os melhores resultados da otimização do Expert Pin Bar LC para USDJPY no modo de deslocamento dinâmico


6. Comparação dos resultados da otimização

Para fazer uma tabela de comparação, vamos selecionar os valores máximos de lucro, rebaixamento e o número de negócios de cada tabela dos melhores resultados. EM seguida, devemos escrever a mudança (em percentagem) ou este valor em relação ao mesmo valor no modo de deslocamento zero ao valor recebido nos modos de deslocamento estáticos ou dinâmicos.


6.1. Expert que Negocia pela Média Móvel

Lucro:

 Sem deslocamento
 Estático
deslocamento
Dinâmico
deslocamento
 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%)

Tabela 29. A comparação entre os valores máximos de lucro a partir da tabela dos melhores resultados de otimização do Expert Média Móvel LC

Rebaixamento:

 Sem deslocamento
 Estático
deslocamento
Dinâmico
deslocamento
 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%)

Tabela 30. A comparação entre os valores máximos de rebaixamento da tabela de melhores resultados de otimização do Expert Média Móvel LC

Número de negócios:

 Sem deslocamento
 Estático
deslocamento
Dinâmico
deslocamento
 EURUSD
 111
 122 (+10%)     
 594 (+435%)       
 GBPUSD
 137
 107 (-22%)
 574 (+319%)
 USDJPY
 61
 71 (+16%)
 301 (+393%)

Tabela 31. A comparação dos valores máximos do número de negócios a partir da tabela de melhores resultados de otimização do Expert Média Móvel LC

A primeira coisa que chama a atenção de imediato é um aumento significativo dos pontos de entrada no modo de deslocamento dinâmico. Ao mesmo tempo, no entanto, o rebaixamento aumentou de forma significativa e o lucro diminuiu de duas vezes para EURUSD.

O modo de deslocamento estático é mais rentável para este Expert Advisor. Aqui podemos ver a diminuição do rebaixamento para GBPUSD e USDJPY e um aumento significativo no lucro para EURUSD e GBPUSD.


6.2. Expert que Negocia pelo Padrão "Pin Bar"

Lucro:

 Sem deslocamento
 Estático
deslocamento
Dinâmico
deslocamento
 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%)

Tabela 32. A comparação dos valores máximos de lucro das tabelas dos melhores resultados de otimização do Expert Pin Bar LC

Rebaixamento:

 Sem deslocamento
 Estático
deslocamento
Dinâmico
deslocamento
 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%)

Tabela 33. A comparação entre os valores máximos de rebaixamento da tabela de melhores resultados de otimização do Expert Pin Bar LC

Número de negócios:

 Sem deslocamento
 Estático
deslocamento
Dinâmico
deslocamento
 EURUSD
33
28 (-15%)
162 (+391%)
 GBPUSD
17
45 (+165%)
194 (+1041%)
 USDJPY
33
21 (-36%)
152 (+361%)

Tabela 34. A comparação dos valores máximos do número de negócios a partir da tabela de melhores resultados de otimização do Expert Pin Bar LC

Aqui também vemos um aumento substancial do número de negócios no modo de deslocamento dinâmico. Neste caso, porém, um aumento significativo do rebaixamento, como no caso semelhante com o Expert Média Móvel LC, foi apenas para EURUSD. Para outros pares o rebaixamento teve um aumento insignificante, por cerca de 5-8 por cento.

No modo de deslocamento estático, a otimização mostrou um lucro limitado para GBPUSD e EURUSD. No entanto, podemos ver uma diminuição significativa do rebaixamento para os mesmos pares e seu aumento para EURUSD. O modo de deslocamento estático parece menos rentável para este Expert Advisor.


Conclusão

Neste artigo, nós consideramos a plotagem dos princípios do "Gráfico líquido" e comparamos a influência de seus modos de operação no resultado da otimização do Expert com base em estratégias com e sem indicadores.

Daí as seguintes conclusões:

  • Para os especialistas, utilizando estratégias com indicadores (por exemplo, através da negociação da Média Móvel), o modo de deslocamento estático é mais adequado. Ele garante uma entrada mais precisa ao mercado, o que resulta em uma diminuição de rebaixamento e aumento do lucro.
  • O modo de deslocamento dinâmico é melhor para o Expert que negocia através de padrões. Este modo aumenta o número de pontos de entrada, embora o rebaixamento aumenta ao mesmo tempo.
  • O modo de deslocamento dinâmico, juntamente com a gestão do dinheiro bem organizada pode gerar resultados impressionantes.
  • Embora pareça muito promissor para as estratégias com indicadores, o modo de deslocamento estático tem uma desvantagem significativa. O valor do desvio proporcionando o melhor resultado é outra variável na lista de parâmetros de entrada que tem de ser acertado.

Traduzido do russo pela MetaQuotes Software Corp.
Artigo original: https://www.mql5.com/ru/articles/1208

Arquivos anexados |
liquid_chart.mq5 (27.15 KB)
pinbar_lc.mq5 (18.61 KB)
liquidchart.mqh (8.32 KB)
Assistente MQL5: Colocando Ordens, Stop Loss e Take Profits sobre os Preços Calculados. Extensão da Biblioteca Padrão Assistente MQL5: Colocando Ordens, Stop Loss e Take Profits sobre os Preços Calculados. Extensão da Biblioteca Padrão

Este artigo descreve a extensão da Biblioteca Padrão MQL5, que permite criar Expert Advisors, colocar ordens, Stop Loss e Take Profits utilizando o Assistente MQL5 pelos preços que são recebidos dos módulos incluídos. Esta abordagem não aplicar quaisquer restrições adicionais sobre o número de módulos e eles não provocam conflitos quando trabalhado em conjunto.

Guia Prático MQL5: Processamento do Evento BookEvent Guia Prático MQL5: Processamento do Evento BookEvent

Este artigo estuda o BookEvent - o evento da Profundidade do Mercado, bem como o princípio de seu processamento. Um programa em MQL e o tratamento dos estados da Profundidade do Mercado servem de exemplo. Ele é escrito usando a abordagem orientada a objetos. Os resultados do tratamento são exibidos na tela como um painel com os níveis da Profundidade do Mercado.

Princípios da Precificação da Bolsa Tomando como Exemplo o Mercado de Derivativos da Bolsa de Moscou (MOEX) Princípios da Precificação da Bolsa Tomando como Exemplo o Mercado de Derivativos da Bolsa de Moscou (MOEX)

Este artigo descreve a teoria de precificação cambial e das especificidades da Câmara de Compensação (Clearing) do Mercado de Derivativos da Bolsa de Moscou (MOEX). Este é um artigo abrangente para iniciantes que querem obter uma primeira experiência na negociação de derivativos cambial, bem como para os traders experientes do mercado forex que estão considerando a negociação em plataforma centralizada da bolsa de valores.

Guia Prático Estatística do Trader: Hipóteses Guia Prático Estatística do Trader: Hipóteses

Este artigo considera a hipótese - uma das idéias básicas da estatística. Várias hipóteses são examinadas e verificadas através de exemplos usando métodos matemáticos da estatística. Os dados reais são generalizados usando métodos não-paramétricos. O pacote Statistica e a bilbioteca de análise numérica ALGLIB MQL5 são usadas ​​para o processamento de dados.