Análise comparativa de 10 estratégias de fase de correção
Sumário
- Introdução
- Abordagem do problema ao criar a estratégia de fase de correção
- Estratégias de fase de correção
- Estratégia №1. Indicador Envelopes com filtro na forma de MFI
- Estratégia №2. Indicador Bollinger Bands e duas Moving Average
- Estratégia №3. WSO & WRO Channel com filtro na forma de Fractal Dimension Ehlers
- Estratégia №4. Indicador Percentage Crossover Channel e TrendRange como filtro
- Estratégia №5. Indicador Price Channel e RBVI como filtro
- Estratégia №6. Indicador Williams Percent Range e ADX como filtro
- Estratégia №7. Canal Keltner modificado e indicador Magic Trend como filtro
- Estratégia №8. Canal Donchian com confirmação do indicador Trinity Impulse
- Estratégia №9. Indicador ATR Channel e CCI Color Levels como filtro
- Estratégia №10. RSI como histograma e indicador Flat como filtro
- Teste
- Conclusões
- Fim do artigo
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.
- Como a negociação ocorrerá no canal, escolhemos as ferramentas que nos permitirão construí-lo e determinar os limites virtuais do movimento lateral.
- Além de definir o canal, precisaremos de pelo menos mais uma ferramenta para confirmar que o preço, após quicar na borda do canal, irá na direção desejada. Esse filtro é necessário para filtrar sinais falsos de entrada.
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.
- Intervalo: Ano passado.
- Par de moedas: EURUSD.
- Execução: Sem latência (As estratégias apresentadas não estão relacionadas às de alta frequência, de modo que o impacto do atraso é muito pequeno.).
- Teste: OHLC em M1 (Os testes preliminares em ticks reais são quase indistinguíveis deste modo).
- Depósito inicial: 1000 USD.
- Alavancagem: 1:500.
- Servidor: MetaQuotes-Demo.
- Cotações: 5 dígitos.
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 maioria das estratégias são implementadas no sistema de negociação de canal com filtragem de sinal, o que significa que a principal desvantagem é o rompimento momentâneo do canal.
- Os testes em timeframes muito pequenos e muito grandes causaram perdas devido ao desencadeamento das condições de entrada no mercado ou devido à seletividade excessiva, respectivamente.
- Ao otimizar no mesmo par de moedas e timeframe, não houve desvios especiais na obtenção do lucro. Acabou sendo da mesma maneira para todas as estratégias.
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. |
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/4534
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso