Análise comparativa de 10 estratégias de fase de correção

Alexander Fedosov | 14 setembro, 2018

Sumário

Introdução

As estratégias de negociação de tendência são as mais populares e simples, especialmente para os traders inexperientes. Mas, na realidade dos dias de hoje, o dinamismo dos mercados cresceu e as tendências se tornaram menos pronunciadas (tanto em magnitude quanto em duração). Por essa razão, ninguém gostaria de perder lucros potenciais, ignorando a possibilidade de negociar na fase de correção. As regras de negociação na tendência são simples, basta identificar sinais de uma tendência e tentar se beneficiar com seu desenvolvimento. A negociação na fase de correção é muito diferente. Durante movimentos laterais, o preço se mantém num pequeno intervalo e pode não mudar por um longo tempo. Além disso, não são registrados movimentos direcionais, enquanto a liquidez permanece baixa.

Abordagem do problema ao criar a estratégia de fase de correção

No artigo anterior, para criar uma estratégia de tendência, era necessário solucionar três tarefas. As tarefas para criar estratégias de fase de correção são muito semelhantes a elas.

Fig. 1. Exemplo de movimento lateral (fase de correção).

Tarefa №1. Detecção da fase de correção.

O conceito de fase de correção não é nem geral nem abrangente (assim como o conceito de tendência). Porém, existem certos sinais que indicam a prevalência de movimentos laterais no mercado. Na verdade, esse movimento é chamado de lateral, porque não há uma tendência claramente definida no mercado. Adicionalmente, o preço se mantém num intervalo, aproximando-se por um caminho ondulado ora da sua parte inferior ora da sua parte superior. Outro sinal de fase de correção pode ser um baixo volume de transações no mercado ou um baixo interesse dos participantes do mercado. Isso é perceptível não apenas pela fraca mudança no preço, mas também pelo pequeno volume de ticks.

Tarefa №2. Metas da posição aberta.

Geralmente, ao negociar na fase de correção, é normal falar em 'operar dentro do canal'. Esta é a principal maneira de usar movimentos laterais para obter lucro. O canal da fase de correção é definido dentro de certos limites virtuais e, em seguida, com base na relação entre o preço e esses limites é criada uma estratégia de negociação. Na maioria das vezes, ela é baseada na compra ou na venda quando o preço quica na borda do canal (Fig. 2).

Fig. 2. Negociação quando o preço quica na borda do canal (Fig. 2).

Ao vender na parte superior do canal, assumimos que o preço irá na direção da borda inferior, onde será colocado o take-profit. O stop-loss pode ser definido quer por certo valor numérico em pontos quer com base na largura do canal. Já para compra é tudo ao contrário, quer dizer, compramos na parte inferior do canal, definimos o take-profit perto da borda superior.

Estratégias de fase de correção

Ao escolher uma estratégia de fase de correção, decidi seguir os princípios descritos acima.

Estratégia №1: Indicador Envelopes com filtro na forma de MFI

 O Envelopes será implementado para determinar os limites do canal, enquanto o sinal será filtrado pelo MFI.

Parâmetros Descrição
Indicador utilizado Envelopes
Indicador utilizado MFI
Timeframe H1
Condições de compra Preço atingindo a borda inferior do canal e MFI na zona de sobrevenda (abaixo de 20)
Condições de venda Preço atingindo a borda superior do canal e MFI na zona de sobrecompra (abaixo de 20)
Condições de saída   Preço atingindo a borda oposta do canal

A figura 3 mostra as condições de entrada no mercado segundo a estratégia №1.

Fig. 3. Condições de entrada segundo a estratégia de fase de correção №1.

O código do EA para esta estratégia é o seguinte:

void OnTick()
  {
//--- Verificação de ordens abertas anteriormente pelo EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //--- Obtenção de dados para cálculo
      if(!GetIndValue())
         return;
      //--- Abertura de ordem se houver um sinal de compra
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Abertura de ordem se houver um sinal de venda
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Condições de compra                                              |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(mfi[0]<20 && env_low[0]>close[0])
     {
      tp=env_high[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Condições de venda                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(mfi[0]>80 && env_high[0]<close[0])
     {
      tp=env_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Obtenção dos valores atuais dos indicadores                      |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,mfi)<=0  ||
          CopyBuffer(InpInd_Handle2,1,0,2,env_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,env_high)<=0 || 
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

Take-profit é definido automaticamente com base nas condições estabelecidas, enquanto o stop-loss, manualmente, dependendo do timeframe.

Estratégia №2: Indicador Bollinger Bands e duas Moving Average

Para determinar as bordas do canal, é usado o indicador Bollinger Bands, enquanto, como filtro, é utilizada a posição da MA lenta em relação à MA rápida e vice-versa.

Parâmetros Descrição
Indicador utilizado Bollinger Bands
Indicador utilizado Moving Average
Timeframe H1
Condições de compra Preço atingindo a borda inferior do canal, MA rápida acima da MA lenta
Condições de venda Preço atingindo a borda superior do canal, MA rápida abaixo da MA lenta
Condições de saída   Preço atingindo a borda oposta do canal

A figura 4 mostra as condições de entrada no mercado. O timeframe das duas SMAs é pequeno por padrão: 4 e 8. No EA, você pode personalizar os períodos e métodos de suavização, alterando assim a sensibilidade da filtragem do sinal do Bollinger Bands.

Fig. 4 Condições de entrada segundo a estratégia de fase de correção №2

Exceto pelas condições de entrada no mercado, a estratégia №2 é muito semelhante à estratégia №1. 

void OnTick()
  {
//--- Verificação de ordens abertas anteriormente pelo EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //--- Obtenção de dados para cálculo
      if(!GetIndValue())
         return;
      //--- Abertura de ordem se houver um sinal de compra
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Abertura de ordem se houver um sinal de venda
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Condições de compra                                              |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(ma_slow[0]>ma_fast[0] && bb_low[0]>close[0])
     {
      tp=bb_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Condições de venda                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(ma_slow[0]<ma_fast[0] && bb_up[0]<close[0])
     {
      tp=bb_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Obtenção dos valores atuais dos indicadores                      |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,1,0,2,bb_up)<=0  ||
          CopyBuffer(InpInd_Handle1,2,0,2,bb_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,ma_slow)<=0 ||
          CopyBuffer(InpInd_Handle3,0,0,2,ma_fast)<=0 ||
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

Estratégia №3. WSO & WRO Channel e Fractal Dimension Ehlers

Como principal indicador de sinal será usado o WSO & WRO Channel. Ele é um canal baseado nos valores de dois osciladores, especificamente o WSO (Widner Support Oscillator) e o WRO (Widner Resistance Oscillator). O indicador é baseado no artigo "Automated Support and Resistance" de Mel Widner. Como filtro, pegamos o indicador de dimensão fractal descrito no artigo "Fractal Dimension As A Market Mode Sensor" de John Eulers e Rick Weiss. 

Parâmetros Descrição
Indicador utilizado WSO & WRO Channel
Indicador utilizado Fractal Dimension Ehlers
Timeframe Qualquer um
Condições de compra Preço atingindo a borda inferior do canal e valor do Fractal Dimension abaixo do limite da meta
Condições de venda Preço atingindo a borda superior do canal e valor do Fractal Dimension abaixo do limite da meta
Condições de saída   Preço atingindo a borda oposta do canal

A figura 5 mostra as condições de entrada no mercado. Como nos casos anteriores, a estratégia envolve a negociação quando o preço quica nas bordas do canal, enquanto isso, usamos o filtro para tentar encontrar os pontos de entrada onde o mercado não está num estado de tendência.


Fig. 5. Condições de entrada segundo a estratégia de fase de correção №3.

O código do EA para esta estratégia é o seguinte:

void OnTick()
  {
//--- Verificação de ordens abertas anteriormente pelo EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //--- Obtenção de dados para cálculo
      if(!GetIndValue())
         return;
      //--- Abertura de ordem se houver um sinal de compra
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Abertura de ordem se houver um sinal de venda
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Condições de compra                                              |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(wwc_low[0]>close[0] && fdi[0]<Inp_FdiThreshold)
     {
      tp=wwc_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Condições de venda                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(wwc_up[0]<close[0] && fdi[0]<Inp_FdiThreshold)
     {
      tp=wwc_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Obtenção dos valores atuais dos indicadores                      |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,3,0,2,wwc_up)<=0  ||
          CopyBuffer(InpInd_Handle1,2,0,2,wwc_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,fdi)<=0 || 
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

Estratégia №4. Indicador Percentage Crossover Channel e TrendRange como filtro

Aqui tentamos usar um canal construído com base no rompimento dos níveis em certa porcentagem. Precisamos de um indicador que constrói o canal, a pesquisa do número de pontos após o preço quicar na sua borda e a filtragem do sinal. Este indicador será um TrendRange que mostra os estados de tendência e de fase de correção. Nós vamos usá-los como um filtro.

Parâmetros Descrição
Indicador utilizado Percentage Crossover Channel
Indicador utilizado Trend Range
Timeframe Qualquer um
Condições de compra Preço atingindo a borda inferior do canal e histograma do Trend Range de cor cinza
Condições de venda Preço atingindo a borda superior do canal e histograma do Trend Range de cor cinza
Condições de saída   Preço atingindo a borda oposta do canal

Condições de entrada no mercado são mostradas na figura 6. O funcionamento do indicador Percentage Crossover possui algumas peculiaridades. O parâmetro Percent reflete a distância limite que uma vez atingida/quebrada desencadeia a construção de um novo nível e depende do timeframe. Quanto menor for, menor deverá ser definida a porcentagem. Por exemplo, no timeframe horário, o valor recomendado é de 20 a 30. Valores mais altos levam à seletividade excessiva do indicador.

Fig. 6. Condições de entrada segundo a estratégia de fase de correção №4.

A estratégia é realizada no código da seguinte maneira:

void OnTick()
  {
//--- Verificação de ordens abertas anteriormente pelo EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //--- Obtenção de dados para cálculo
      if(!GetIndValue())
         return;
      //--- Abertura de ordem se houver um sinal de compra
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Abertura de ordem se houver um sinal de venda
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Condições de compra                                              |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(pcc_low[0]>close[0] && tr_flat[0]>tr_range[0])
     {
      tp=pcc_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Condições de venda                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(pcc_up[0]<close[0] && tr_flat[0]>tr_range[0])
     {
      tp=pcc_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Obtenção dos valores atuais dos indicadores                      |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,pcc_up)<=0  ||
          CopyBuffer(InpInd_Handle1,2,0,2,pcc_low)<=0 || 
          CopyBuffer(InpInd_Handle2,1,0,2,tr_flat)<=0 ||
          CopyBuffer(InpInd_Handle2,2,0,2,tr_range)<=0 ||
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

Estratégia №5. Indicador Price Channel e RBVI como filtro

O indicador Price Channel constrói canal cujos limites superior e inferior são determinados pelo preço máximo e mínimo do período. Os sinais falsos serão filtrados por um RBVI que identifica a fase de correção no mercado. 

Parâmetros Descrição
Indicador utilizado Price Channel
Indicador utilizado RBVI
Timeframe Qualquer um
Condições de compra Preço atingindo a borda inferior do canal e valor do RBVI abaixo do limite para a fase de correção
Condições de venda Preço atingindo a borda superior do canal e valor do RBVI abaixo do limite para a fase de correção
Condições de saída   Preço atingindo a borda oposta do canal

A figura 7 mostra as condições de entrada. O valor limite do indicador RBVI é de 40. Mas nos parâmetros do Expert Advisor será possível alterar este valor.

Fig. 7. Condições de entrada segundo a estratégia de fase de correção №5.

O código para implementação desta estratégia é o seguinte:

void OnTick()
  {
//--- Verificação de ordens abertas anteriormente pelo EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //--- Obtenção de dados para cálculo
      if(!GetIndValue())
         return;

      //--- Abertura de ordem se houver um sinal de compra
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Abertura de ordem se houver um sinal de venda
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Condições de compra                                              |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(pc_low[0]>close[0] && rbvi[0]<=Inp_level)
     {
      tp=pc_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Condições de venda                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(pc_up[0]<close[0] && rbvi[0]<=Inp_level)
     {
      tp=pc_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Obtenção dos valores atuais dos indicadores                      |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,pc_up)<=0  ||
          CopyBuffer(InpInd_Handle1,1,0,2,pc_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,rbvi)<=0 ||
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

Estratégia №6. Indicador Williams Percent Range e ADX como filtro

A faixa percentual de Williams determina o estado de sobrevenda/sobrecompra e será usado como pontos de entrada. Mas como temos a tarefa de negociar na fase de correção ou o preço deve retornar a um determinado intervalo, o indicador de tendência ADX será usado para determinar a falta de movimento direcional. 

Parâmetros Descrição
Indicador utilizado Williams Percent Range
Indicador utilizado ADX
Timeframe Qualquer um
Condições de compra Indicador WPR na zona de sobrevenda (abaixo de -80) e valor do ADX abaixo do limite definido.
Condições de venda Indicador WPR na zona de sobrecompra (abaixo de -20) e valor do ADX abaixo do limite definido.
Condições de saída   Take-Profit/Stop-Loss

Como pode ser visto na figura 8, a fase de correção no indicador ADX é definida como 30 por padrão. Porém, no código do EA é possível personalizá-la.

Fig. 8. Condições de entrada segundo a estratégia de fase de correção №6.

A listagem abaixo mostra a implementação dessa estratégia. Aqui a variável Inp_FlatLevel é responsável pelo valor do limite do ADX, mencionado acima.

void OnTick()
  {
//--- Verificação de ordens abertas anteriormente pelo EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //--- Obtenção de dados para cálculo
      if(!GetIndValue())
         return;

      //--- Abertura de ordem se houver um sinal de compra
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);

      //--- Abertura de ordem se houver um sinal de venda
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Condições de compra                                              |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(wpr[0]<-80 && adx[0]<Inp_FlatLevel)?true:false;
  }
//+------------------------------------------------------------------+
//| Condições de venda                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(wpr[0]>=-20 && adx[0]<Inp_FlatLevel)?true:false;
  }
//+------------------------------------------------------------------+
//| Obtenção dos valores atuais dos indicadores                      |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,wpr)<=0  ||
          CopyBuffer(InpInd_Handle2,0,0,2,adx)<=0)?false:true;
  }
//+------------------------------------------------------------------+

Estratégia №7. Canal Keltner modificado e indicador Magic Trend como filtro

Aqui, para verificar se o preço quicou na borda do canal de Keltner, usamos o indicador de tendência Magic Trend, no momento em que identifica a fase de correção.

Parâmetros Descrição
Indicador utilizado Canal Keltner modificado
Indicador utilizado Magic Trend
Timeframe Qualquer um
Condições de compra Preço atingindo a borda inferior do canal e linha do Magic Trend de cor cinza
Condições de venda Preço atingindo a borda superior do canal e linha do Magic Trend de cor cinza
Condições de saída   Preço atingindo a borda oposta do canal

A figura 9 mostra essa estratégia de negociação. Vemos que o valor do indicador Magic Trend não muda durante a fase de correção - ele é exibido com uma linha horizontal cinza. Assim, adicionalmente, além de o preço atingir a borda do canal, outra condição é o Magic Trend estar na fase de correção por um tempo. Isso será verificado comparando os valores na barra atual e na anterior - elas devem ser as mesmas.

Fig. 9. Condições de entrada segundo a estratégia de fase de correção №7.

No código, isso é levado em conta nas funções que verificam as condições para venda/compra:

void OnTick()
  {
//--- Verificação de ordens abertas anteriormente pelo EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //--- Obtenção de dados para cálculo
      if(!GetIndValue())
         return;

      //--- Abertura de ordem se houver um sinal de compra
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Abertura de ordem se houver um sinal de venda
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Condições de compra                                              |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(kc_low[0]>close[0] && mt[0]==mt[1])
     {
      tp=kc_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Condições de venda                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(kc_up[0]<close[0] && mt[0]==mt[1])
     {
      tp=kc_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Obtenção dos valores atuais dos indicadores                      |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,kc_up)<=0  ||
          CopyBuffer(InpInd_Handle1,2,0,2,kc_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,mt)<=0 || 
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

Estratégia №8. Canal Donchian com confirmação do indicador Trinity Impulse

Nesta estratégia, tentaremos capturar o momento em que o preço quica na borda do canal Donchian e confirmá-lo usando o indicador de impulso Trinity Impulse no estado de movimento lateral. 

Parâmetros Descrição
Indicador utilizado Donchian Channel
Indicador utilizado Trinity Impulse
Timeframe Timeframes mais pequenos.
Condições de compra Preço atingindo a borda inferior do canal e valor do Trinity Impulse de 0
Condições de venda Preço atingindo a borda superior do canal e valor do Trinity Impulse de 0
Condições de saída   Preço atingindo a borda oposta do canal

Condições de entrada no mercado são mostradas na figura 10. Não é aconselhável usar a estratégia em timeframes grandes, uma vez o filtro Trinity Impusle mostra um comportamento de dente de serra e os movimentos laterais são exibidos com atraso. Ao ocorrer isso, sua largura é muito pequena, tornando a estratégia seletiva demais. O melhor é usar os timeframes de minutos de 5 a 30.

Fig. 10. Condições de entrada segundo a estratégia de fase de correção №8.

Implementação do EA para esta estratégia:.

void OnTick()
  {
//--- Verificação de ordens abertas anteriormente pelo EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //--- Obtenção de dados para cálculo
      if(!GetIndValue())
         return;
         
      //--- Abertura de ordem se houver um sinal de compra
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Abertura de ordem se houver um sinal de venda
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Condições de compra                                              |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(dc_low[0]>close[0] && ti[0]==0)
     {
      tp=dc_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Condições de venda                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(dc_up[0]<close[0] && ti[0]==0)
     {
      tp=dc_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Obtenção dos valores atuais dos indicadores                      |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,dc_up)<=0  ||
          CopyBuffer(InpInd_Handle1,1,0,2,dc_low)<=0 || 
          CopyBuffer(InpInd_Handle2,0,0,2,ti)<=0 || 
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

Estratégia №9. Indicador ATR Channel e CCI Color Levels como filtro

ATR Channel é baseado nos desvios do indicador ATR em relação à média móvel. O CCI Color Levels é um CCI exibido como histograma de valores limite que indicam o movimento de preço. Vamos usá-lo como um filtro de canal durante a fase de correção (quando o CCI está no intervalo entre os valores limite).

Parâmetros Descrição
Indicador utilizado ATR Channel
Indicador utilizado CCI Color Levels
Timeframe Qualquer um
Condições de compra Preço atingindo a borda inferior do canal e valor do CCI Color Levels no intervalo entre os valores limite
Condições de venda Preço atingindo a borda superior do canal e valor do CCI Color Levels no intervalo entre os valores limite
Condições de saída   Preço atingindo a borda oposta do canal

A figura 11 mostra como ocorre a entrada no mercado. Em alguns casos, o preço ultrapassa as bordas do canal, no entanto, ao filtrar o sinal encontrando o valor do CCI no intervalo definido é possível assumir que ele retornará ao canal e atingirá o take-profit estabelecido.


Fig. 11. Condições de entrada segundo a estratégia de fase de correção №9.

O código do EA para esta estratégia:

void OnTick()
  {
//--- Verificação de ordens abertas anteriormente pelo EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //--- Obtenção de dados para cálculo
      if(!GetIndValue())
         return;

      //--- Abertura de ordem se houver um sinal de compra
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);

      //--- Abertura de ordem se houver um sinal de venda
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Condições de compra                                              |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   if(atr_low[0]>close[0] && cci[0]<Inp_CCI_LevelUP && cci[0]>Inp_CCI_LevelDOWN)
     {
      tp=atr_up[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Condições de venda                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   if(atr_up[0]<close[0] && cci[0]<Inp_CCI_LevelUP && cci[0]>Inp_CCI_LevelDOWN)
     {
      tp=atr_low[0];
      return true;
     }
   else
      return false;
  }
//+------------------------------------------------------------------+
//| Obtenção dos valores atuais dos indicadores                      |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,1,0,2,atr_up)<=0  ||
          CopyBuffer(InpInd_Handle1,2,0,2,atr_low)<=0 || 
          CopyBuffer(InpInd_Handle2,2,0,2,cci)<=0 || 
          CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0
          )?false:true;
  }
//+------------------------------------------------------------------+

Estratégia №10. RSI como histograma e indicador Flat como filtro

O RSI na forma de histograma é escolhido para ter um maior visual, porque o principal sinal para entrar no mercado serão suas zonas de sobrecompra/sobrevenda. O Flat, por sua vez, filtrará os sinais falsos. 

Parâmetros Descrição
Indicador utilizado RSI_Histogram
Indicador utilizado Flat
Timeframe Qualquer um
Condições de compra RSI na zona de sobrevenda (abaixo do valor limite) e Flat na zona de movimento lateral.
Condições de venda RSI na zona de sobrecompra (acima do valor limite) e Flat na zona de movimento lateral.
Condições de saída   Take-Profit/Stop-Loss

A figura 12 mostra claramente os pontos de entrada. A exibição do RSI na forma de histograma torna mais conveniente monitorar as zonas de sobrevenda/sobrecompra, bem como a zona de movimento lateral do filtro Flat.

Fig. 12. Condições de entrada segundo a estratégia de fase de correção №10.

A implementação do EA para esta estratégia é mostrada na listagem abaixo.

void OnTick()
  {
//--- Verificação de ordens abertas anteriormente pelo EA
   if(!Trade.IsOpenedByMagic(Inp_MagicNum))
     {
      //--- Obtenção de dados para cálculo
      if(!GetIndValue())
         return;

      //--- Abertura de ordem se houver um sinal de compra
      if(BuySignal())
         Trade.BuyPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);

      //--- Abertura de ordem se houver um sinal de venda
      if(SellSignal())
         Trade.SellPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
     }
  }
//+------------------------------------------------------------------+
//| Condições de compra                                              |
//+------------------------------------------------------------------+
bool BuySignal()
  {
   return(rsi[0]<Inp_LowLevel && fl[0]<Inp_FLowLevel)?true:false;
  }
//+------------------------------------------------------------------+
//| Condições de venda                                               |
//+------------------------------------------------------------------+
bool SellSignal()
  {
   return(rsi[0]>Inp_HighLevel && fl[0]<Inp_FLowLevel)?true:false;
  }
//+------------------------------------------------------------------+
//| Obtenção dos valores atuais dos indicadores                      |
//+------------------------------------------------------------------+
bool GetIndValue()
  {
   return(CopyBuffer(InpInd_Handle1,0,0,2,rsi)<=0  ||
          CopyBuffer(InpInd_Handle2,0,0,2,fl)<=0)?false:true;
  }
//+------------------------------------------------------------------+

Teste

Após determinar 10 estratégias de fase de correção e implementá-las no código, selecionamos as condições de teste mais semelhantes.

Teste da Estratégia №1 (Indicador Envelopes com filtro na forma de MFI)

Pré-instalação:

input int                  Inp_StopLoss=500;                            //Stop Loss(points)

//--- Parâmetros do indicador MFI
input ENUM_APPLIED_VOLUME  Inp_applied_volume=VOLUME_TICK;              // tipo de volume do MFI
input int                  Inp_MFI_period=10;                           // período do MFI
//--- Parâmetros do indicador Envelopes
input int                  Inp_ma_period=10;                            // período de média do Envelopes 
input ENUM_MA_METHOD       Inp_ma_method=MODE_SMA;                      // tipo de suavização do Envelopes
input double               Inp_deviation=0.1;                           // desvio da borda em relação média do Envelopes

Resultado do teste:

Fig. 13. Resultados do teste da estratégia de fase de correção №1.

Teste da Estratégia №2 (Indicador Bollinger Bands e duas Moving Average)

Pré-instalação:

input int                  Inp_StopLoss=450;                            //Stop Loss(points)

//--- Parâmetros do indicador Bollinger Bands
input int                  Inp_BBPeriod=14;                             //período de BB
input double               Inp_deviation=2.0;                           //Desvio
//--- Parâmetros do indicador MA slow
input int                  Inp_ma_period1=12;                           //Período do MA slow
input ENUM_MA_METHOD       Inp_ma_method1=MODE_SMMA;                    //Método de suavização do MA slow
//--- Parâmetros do indicador MA fast
input int                  Inp_ma_period2=2;                            //Período do MA fast
input ENUM_MA_METHOD       Inp_ma_method2=MODE_LWMA;                    //Método de suavização do MA fast

Resultado do teste:

Fig. 14. Resultados do tese da estratégia de fase de correção №2.

Teste da Estratégia №3 (WSO & WRO Channel com filtro na forma de Fractal Dimension Ehlers)

Pré-instalação:

input int                  Inp_StopLoss=500;                            //Stop Loss(points)

//--- Parâmetros do indicador WSO & WRO Channel
input int                  Inp_WsoWroPeriod=16;                         //Período do Wso & Wro Channel
//--- Parâmetros do indicador Fractal Dimension Ehlers
input int                  Inp_FdiPeriod    =  18;                      //Período do Fractal dimension 
input double               Inp_FdiThreshold =  1.4;                     //Limite do Fractal dimension 
input ENUM_APPLIED_PRICE   Inp_Price        = PRICE_CLOSE;              //Preço aplicado 

Resultado do teste:

Fig. 15. Resultados do tese da estratégia de fase de correção №3.

Teste da Estratégia №4 (Indicador Percentage Crossover Channel e TrendRange como filtro)

Pré-instalação:

input int                  Inp_StopLoss=500;                            //Stop Loss(points)

//--- Parâmetros do indicador Percentage_Crossover_Channel
input double               Inp_Percent=26.0;                            //Porcentagem da distância limite
input ENUM_APPLIED_PRICE   Inp_Price=PRICE_CLOSE;                       //Preço aplicado
//--- Parâmetros do indicador Trend Range
input uint                 Inp_PeriodTR    =  14;                       //Período do Trend Range
input ENUM_MA_METHOD       Inp_Method      =  MODE_EMA;                 //Método de suavização
input double               Inp_Deviation   =  1.0;                      //Desvio

Resultado do teste:

Fig.16. Resultados do tese da estratégia de fase de correção №4.

Teste da Estratégia №5 (Indicador Price Channel e RBVI como filtro)

Pré-instalação:

input int                  Inp_StopLoss=450;                            //Stop Loss(points)

//--- Parâmetros do indicador Price Channel
input int                  Inp_ChannelPeriod=12;                        //Period
//--- Parâmetros do indicador RBVI
input int                  Inp_RBVIPeriod=5;                            //Período do RBVI
input ENUM_APPLIED_VOLUME  Inp_VolumeType=VOLUME_TICK;                  //volume
input double               Inp_level=40;                                //nível do movimento lateral

Resultado do teste:

Fig. 17. Resultados do tese da estratégia de fase de correção №5.

Teste da Estratégia №6 (Indicador Williams Percent Range e ADX como filtro)

Pré-instalação:

input int                  Inp_StopLoss=50;                             //Stop Loss(points)
input int                  Inp_TakeProfit=50;                           //Take Profit(points)

//--- Parâmetros do indicador WPR
input int                  Inp_WPRPeriod=10;                            //Period WPR
//--- Parâmetros do indicador ADX
input int                  Inp_ADXPeriod=14;                            //Period ADX
input int                  Inp_FlatLevel=40;                            //Flat Level ADX

Resultado do teste:

Fig. 18. Resultados do tese da estratégia de fase de correção №6.

Teste da Estratégia №7 (Canal Keltner modificado e indicador Magic Trend como filtro)

Pré-instalação:

input int                     Inp_SmoothCenter      =  11;              // Number of the periods to smooth the center line
input int                     Inp_SmoothDeviation   =  12;              // Number of periods to smooth deviation
input double                  Inp_F                 =  1.0;             // Factor which is used to apply the deviation
input ENUM_APPLIED_PRICE      Inp_AppliedPrice      =  PRICE_CLOSE;     // The center line applied price:
input ENUM_MA_METHOD          Inp_MethodSmoothing   =  MODE_SMA;        // The center line smoothing method
input ENUM_METHOD_VARIATION   Inp_MethodVariation   =  METHOD_HL;       // Variation Method
//--- Parâmetros do indicador Magic Trend
input uint                    Inp_PeriodCCI   =  60;                    // CCI period
input uint                    Inp_PeriodATR   =  5;                     // ATR period

Resultado do teste:

Fig. 19. Resultados do tese da estratégia de fase de correção №7.

Teste da Estratégia №8 (Canal Donchian com confirmação do indicador Trinity Impulse)

Pré-instalação:

input int                  Inp_StopLoss=500;                            //Stop Loss(points)

//--- Parâmetros do indicador do canal Donchian
input int                  Inp_ChannelPeriod=12;                        //Doncian period
//--- Parâmetros do indicador Trinity Impulse
input int                  Inp_Period= 5;                               //Indicator period
input int                  Inp_Level= 34;                               //Smoothing level
input ENUM_MA_METHOD       Inp_Type=MODE_LWMA;                          //Averaging type
input ENUM_APPLIED_PRICE   Inp_Price=PRICE_WEIGHTED;                    //Price
input ENUM_APPLIED_VOLUME  Inp_Volume=VOLUME_TICK;                      //Volume type

Resultado do teste:

Fig. 20. Resultados do tese da estratégia de fase de correção №8.

Teste da Estratégia №9 (Indicador ATR Channel e CCI Color Levels como filtro)

Pré-instalação:

//--- Parâmetros do indicador ATR Channel
input ENUM_MA_METHOD       Inp_MA_Method=MODE_SMA;                      //MA smoothing method
input uint                 Inp_MA_Period=10;                            //MA period
input uint                 Inp_ATR_Period=12;                           //ATR period
input double               Inp_Factor=1.5;                              //Number of deviations
input ENUM_APPLIED_PRICE   Inp_IPC=PRICE_LOW;                           //Applied price
input int                  Inp_Shift=0;                                 //Horizontal shift of the indicator in bars
//--- Parâmetros do indicador CCI Color Levels
input int                  Inp_CCI_ma_period = 14;                      // Averaging period 
input double               Inp_CCI_LevelUP   = 90;                      // Level UP
input double               Inp_CCI_LevelDOWN =-90;                      // Level DOWN

Resultado do teste:

Fig. 21. Resultados do tese da estratégia de fase de correção №9.

Teste da Estratégia №10 (RSI como histograma e indicador Flat como filtro)

Pré-instalação:

//--- Parâmetros do indicador RSI Histogram
input uint                 Inp_RSIPeriod=12;                            // período do indicador
input ENUM_APPLIED_PRICE   Inp_RSIPrice=PRICE_CLOSE;                    // preço
input uint                 Inp_HighLevel=60;                            // nível de sobrecompra
input uint                 Inp_LowLevel=40;                             // nível de sobrevenda
input int                  Inp_Shift=0;                                 // deslocamento horizontal do indicador em barras
//--- Parâmetros do indicador Flat
input uint                 Inp_Smooth=10;                               // Smoothing period
input ENUM_MA_METHOD       Inp_ma_method=MODE_SMA;                      // Smoothing type
input ENUM_APPLIED_PRICE   Inp_applied_price=PRICE_CLOSE;               // Price type
input uint                 Inp_HLRef=100;
input int                  Inp_FShift=0;                                // Horizontal shift of the indicator in bars
input uint                 Inp_ExtraHighLevel=70;                       // Maximum trend level
input uint                 Inp_FHighLevel=50;                           // Strong trend level
input uint                 Inp_FLowLevel=30;                            // Weak trend level

Resultado do teste:

Fig. 22. Resultados do tese da estratégia de fase de correção №10.

Conclusões

Com base nos resultados do teste e da otimização das estratégias de fase de correção apresentadas, foram feitas as seguintes observações:

A esse respeito, podemos concluir principalmente que apesar do fato de terem sido escolhidos diferentes sistemas para construir e filtrar canais, as vantagens e desvantagens de todas as estratégias se mostraram comparáveis. 

Fim do artigo

Abaixo está uma tabela de resumo com os nomes dos Expert Advisors desenvolvidos e usados no artigo, bem como as classes auxiliares e a lista de indicadores que foram utilizados nas atuais estratégias de tendência. No final do artigo, anexado um arquivo com todos os ficheiros listados classificados em pastas. Portanto, para trabalhar corretamente, basta colocar a pasta MQL5 na raiz do terminal.

Programas utilizados no artigo:

#
 Nome
Tipo
Descrição
1
Strategy_1.mq5
Expert Advisor
 Estratégia №1. Indicador Envelopes com filtro na forma de MFI.
2
Strategy_2.mql5
Expert Advisor
 Estratégia №2. Indicador Bollinger Bands e duas Moving Average.
3
Strategy_3.mq5
Expert Advisor  Estratégia №3. WSO & WRO Channel com filtro na forma de Fractal Dimension Ehlers.
4
Strategy_4.mq5
Expert Advisor
 Indicador Percentage Crossover Channel e TrendRange como filtro. 
5
Strategy_5.mq5 Expert Advisor  Estratégia №5. Indicador Price Channel e RBVI como filtro.
6
Strategy_6.mq5
Expert Advisor
 Estratégia №6. Indicador Williams Percent Range e ADX como filtro.
7 Strategy_7.mq5 
Expert Advisor
 Estratégia №7. Canal Keltner modificado e indicador Magic Trend como filtro.
 8 Strategy_8.mq5 Expert Advisor  Estratégia №8. Canal Donchian com confirmação do indicador Trinity Impulse.
 9 Strategy_9.mq5 Expert Advisor  Estratégia №9. Indicador ATR Channel e CCI Color Levels como filtro.
 10 Strategy_10.mq5 Expert Advisor  Estratégia №9. RSI como histograma e indicador Flat como filtro. 
 11 Trade.mqh Biblioteca  Classe de funções de negociação.
 13 wwc.mq5 Indicador  Usa-se na Estratégia №3.
 14 fdi.mq5 Indicador  Usa-se na Estratégia №3.
 15 pcc.mq5 Indicador  Usa-se na Estratégia №4.
 16 trend_range.mq5  Indicador  Usa-se na Estratégia №4.
 17 price_channel.mq5 Indicador  Usa-se na Estratégia №5.
 18 rbvi.mq5 Indicador  Usa-se na Estratégia №5.
 19 customizable _keltner.mq5 Indicador  Usa-se na Estratégia №7.
 20 magic_trend.mq5 Indicador  Usa-se na Estratégia №7.
 21 donchian_channel.mq5 Indicador  Usa-se na Estratégia №8.
 22 trinity_impulse.mq5 Indicador  Usa-se na Estratégia №8.
 23 atr_channel.mq5 Indicador   Usa-se na Estratégia №9.
 24 cci_color_levels.mq5 Indicador  Usa-se na Estratégia №9.
 25 rsi_histogram.mq5 Indicador  Usa-se na Estratégia №10.
 26 flat.mq5 Indicador  Usa-se na Estratégia №10.