Como Criar um Expert Advisor com MQL5: Sinais de Negociação Baseados em Harami e RSI

Mike 2011.03.17 19:46 90 0 0
Anexo

O MQL5 Wizard é uma ferramenta incrível que permite criar Consultores Especializados prontos, utilizando as classes da biblioteca padrão que vem com o terminal do cliente (veja Criando Consultores Especializados Prontos no MQL5 Wizard para mais detalhes). Essa ferramenta facilita a verificação das suas ideias de negociação, tudo o que você precisa fazer é criar a sua própria classe de sinais de negociação. A estrutura dessa classe e um exemplo podem ser encontrados no artigo MQL5 Wizard: Como Criar um Módulo de Sinais de Negociação.

A ideia básica é a seguinte: a classe de sinais de negociação é derivada de CExpertSignal. Em seguida, é necessário sobrescrever os métodos virtuais LongCondition() e ShortCondition() com seus próprios métodos.

Existe um livro chamado "Estratégias dos melhores traders" (em russo), onde são abordadas diversas estratégias de negociação. Neste artigo, focaremos nos padrões de vela de reversão, confirmados pelos osciladores Estocástico, CCI, MFI e RSI.

O melhor jeito é criar uma classe separada, derivada de CExpertSignal para verificar a formação dos padrões de velas. Para confirmar os sinais de negociação gerados pelos padrões de velas, basta escrever uma classe, derivada de CCandlePattern e adicionar os recursos necessários (por exemplo, confirmação por osciladores).

Aqui, vamos considerar os sinais baseados no padrão de vela de reversão "Bullish Harami/Bearish Harami", confirmados pelo indicador RSI. O módulo de sinais de negociação é baseado na classe CCandlePattern, que é um exemplo simples de como utilizá-la para criar sinais de negociação com padrões de velas.

1. Padrões de vela de reversão: "Bullish Harami" e "Bearish Harami"

1.1. Bullish Harami

O padrão de reversão Bullish Harami se forma em uma tendência de baixa, quando uma grande candela é seguida por uma candela menor cujo corpo está localizado dentro da faixa vertical do corpo maior. Este padrão indica que a tendência de queda pode estar revertendo, sinalizando que é um bom momento para entrar em uma posição longa. A segunda candela se abre com um gap para cima.

Quanto menor a segunda candela (branca), maior a probabilidade da reversão.

Fig. 1. Padrão de candela

Fig. 1. Padrão de candela "Bullish Harami"

O reconhecimento do padrão "Bullish Harami" é feito pelo método CheckPatternBullishHarami() da classe CCandlePattern:

//+------------------------------------------------------------------+
//| Verifica a formação do padrão de candela "Bullish Harami"        |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternBullishHarami()
  {
//--- Bullish Harami
   if((Close(1)>Open(1))              && // a última barra completada é bullish (dia branco)
     ((Open(2)-Close(2)>AvgBody(1))  && // a candela anterior é bearish, seu corpo é maior que a média (long black)
     ((Close(1)<Open(2))              && // preço de fechamento da candela bullish é menor que o preço de abertura da candela bearish 
      (Open(1)>Close(2)))             && // preço de abertura da candela bullish é maior que o preço de fechamento da candela bearish
      (MidPoint(2)<CloseAvg(2)))         // tendência de baixa
      return(true);
//---
   return(false);
  }

O método CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) da classe CCandlePattern é utilizado para verificar a formação do padrão "Bullish Harami".


1.2. Bearish Harami

O padrão de reversão Bearish Harami se forma em uma tendência de alta, quando uma grande candela é seguida por uma candela menor cujo corpo está localizado dentro da faixa vertical do corpo maior. Este padrão indica que a tendência de alta pode estar revertendo, sinalizando que é um bom momento para entrar em uma posição curta. A segunda candela se abre com um gap para baixo.

Quanto menor a segunda candela (preta), maior a probabilidade da reversão.

Fig. 2. Padrão de candela

Fig. 2. Padrão de candela "Bearish Harami"

O reconhecimento do padrão "Bearish Harami" é feito pelo método CheckPatternBearishHarami() da classe CCandlePattern:

//+------------------------------------------------------------------+
//| Verifica a formação do padrão de candela "Bearish Harami"        |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternBearishHarami()
  {
//--- Bearish Harami
   if((Close(1)<Open(1))              && // a última barra completada é bearish (dia preto)
     ((Close(2)-Open(2)>AvgBody(1))  && // a candela anterior é bullish, seu corpo é maior que a média (long white)
     ((Close(1)>Open(2))              && // preço de fechamento da candela bearish é maior que o preço de abertura da candela bullish 
      (Open(1)<Close(2)))             && // preço de abertura da candela bearish é menor que o preço de fechamento da candela bullish
      (MidPoint(2)>CloseAvg(2)))         // tendência de alta
      return(true);
//---
   return(false);
  }

O método CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) da classe CCandlePattern é utilizado para verificar a formação do padrão "Bearish Harami".


2. Sinais de negociação, confirmados pelo indicador RSI

Os sinais de negociação para abrir posições longas ou curtas devem ser confirmados pelo indicador RSI. O valor do RSI deve estar abaixo/acima dos níveis críticos (40 para posição longa e 60 para posição curta).

O fechamento das posições abertas depende dos valores do RSI. Isso pode ser feito em 2 casos:

  • se o RSI atingiu o nível crítico oposto (70 para posição longa e 30 para posição curta)
  • se o sinal inverso não for confirmado (quando o RSI atinge os níveis: 30 para posição longa e 70 para posição curta)

Fig. 3. Padrão

Fig. 3. Padrão "Bullish Harami", confirmado pelo indicador RSI

  • int CBH_BH_RSI::LongCondition() - verifica as condições para abrir posição longa (retorna 80) e fechar a posição curta (retorna 40);
  • int CBH_BH_RSI::ShortCondition() - verifica as condições para abrir posição curta (retorna 80) e fechar a posição longa (retorna 40).

2.1. Abrir posição longa/Fechar posição curta

  1. A formação do padrão "Bullish Harami" deve ser confirmada pelo RSI: RSI(1)<40 (o valor do RSI da última barra completada deve ser menor que 40).

  2. A posição curta deve ser fechada se o indicador RSI cruzou para cima os níveis críticos 70 ou 30.

//+------------------------------------------------------------------+
//| Verifica as condições para entrada e saída do mercado               |
//| 1) Entrada no mercado (abrir posição longa, resultado=80)         |
//| 2) Saída do mercado (fechar posição curta, resultado=40)         |
//+------------------------------------------------------------------+
int CBH_BH_RSI::LongCondition()
  {
   int result=0;
//--- idx pode ser usado para determinar o modo de operação do EA
//--- idx=0 - neste caso, o EA verifica as condições de negociação a cada tick
//--- idx=1 - neste caso, o EA verifica as condições de negociação apenas em barras de notícias
   int idx   =StartIndex();
//--- verificando as condições para abrir posição longa
//--- formação do padrão Bullish Harami e RSI<30
  if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) && (RSI(1)<40))
     result=80;
//--- verificando as condições para fechar posição curta
//--- cruzamento da linha de sinal dos níveis de sobrecompra/sobrevenda (para cima 30, para cima 70)
  if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70)))
     result=40;
//--- retornar resultado
   return(result);
  }

2.2. Abrir posição curta/Fechar posição longa

  1. A formação do padrão "Bearish Harami" deve ser confirmada pelo RSI: RSI(1)>60 (o valor do indicador RSI da última barra completada deve ser maior que 60).

  2. A posição longa deve ser fechada se o RSI cruzar para baixo os níveis críticos 70 ou 30.

//+------------------------------------------------------------------+
//| Verifica as condições para entrada e saída do mercado               |
//| 1) Entrada no mercado (abrir posição curta, resultado=80)         |
//| 2) Saída do mercado (fechar posição longa, resultado=40)          |
//+------------------------------------------------------------------+
int CBH_BH_RSI::ShortCondition()
  {
   int result=0;
//--- idx pode ser usado para determinar o modo de operação do EA
//--- idx=0 - neste caso, o EA verifica as condições de negociação a cada tick
//--- idx=1 - neste caso, o EA verifica as condições de negociação apenas em barras de notícias
   int idx   =StartIndex();
//--- verificando as condições para abrir posição curta
//--- formação do padrão Bearish Harami e RSI>60
  if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) && (RSI(1)>60))
     result=80;
//--- verificando as condições para fechar posição longa
//--- cruzamento da linha de sinal dos níveis de sobrecompra/sobrevenda (para baixo 70, para baixo 30)
   if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30)))
     result=40;
//--- retornar resultado
   return(result);
  }


2.3. Criando o Expert Advisor usando o MQL5 Wizard

A classe CBH_BH_RSI não está incluída nas classes da Biblioteca Padrão. Para usá-la, é necessário baixar o arquivo acml_rsi.mqh (veja os anexos) e salvá-lo na pasta client_terminal_data\MQL5\Include\Expert\Signal\MySignals. O mesmo deve ser feito com o arquivo acandlepatterns.mqh. Você pode usá-los no MQL5 Wizard após reiniciar o MetaEditor.

Para criar um Consultor Especializado, inicie o MQL5 Wizard:

Fig. 4. Criando Consultor Especializado usando MQL5 Wizard

Fig. 4. Criando Consultor Especializado usando MQL5 Wizard

Vamos especificar o nome do Consultor Especializado:

Fig. 5. Propriedades gerais do Consultor Especializado

Fig. 5. Propriedades gerais do Consultor Especializado

Após isso, precisamos selecionar os módulos de sinais de negociação utilizados.

Fig. 6. Propriedades de sinal do Consultor Especializado

Fig. 6. Propriedades de sinal do Consultor Especializado

No nosso caso, usamos apenas um módulo de sinais de negociação.

Adicionando o módulo de "Sinais baseados em Bullish Harami/Bearish Harami confirmados por RSI":

Fig. 7. Propriedades de sinal do Consultor Especializado

Fig. 7. Propriedades de sinal do Consultor Especializado

Módulo de sinais de negociação adicionado:

Fig. 8. Propriedades de sinal do Consultor Especializado

Fig. 8. Propriedades de sinal do Consultor Especializado

Você pode selecionar qualquer propriedade de trailing, mas usaremos "Trailing Stop não utilizado":

Fig. 9. Propriedades de trailing do Consultor Especializado

Fig. 9. Propriedades de trailing do Consultor Especializado

Com relação às propriedades de gerenciamento de dinheiro, usaremos "Negociação com volume fixo":

Fig. 10. Propriedades de gerenciamento de dinheiro do Consultor Especializado

Fig. 10. Propriedades de gerenciamento de dinheiro do Consultor Especializado

Ao pressionar o botão "Finalizar", receberemos o código do Consultor Especializado gerado, localizado em Expert_ABH_BH_RSI.mq5, que será salvo na pasta terminal_data_folder\MQL5\Experts\.

Os parâmetros de entrada padrão do Consultor Especializado gerado:

//--- entradas para o sinal principal
input int            Signal_ThresholdOpen   =10;     // Valor do limite de sinal para abrir [0...100]
input int            Signal_ThresholdClose  =10     // Valor do limite de sinal para fechar [0...100]
input double         Signal_PriceLevel      =0.0    // Nível de preço para executar um negócio
input double         Signal_StopLevel       =50.0   // Nível de Stop Loss (em pontos)
input double         Signal_TakeLevel       =50.0    // Nível de Take Profit (em pontos)

devem ser substituídos por:

//--- entradas para o sinal principal
input int            Signal_ThresholdOpen   =40;     // Valor do limite de sinal para abrir [0...100]
input int            Signal_ThresholdClose  =20     // Valor do limite de sinal para fechar [0...100]
input double         Signal_PriceLevel      =0.0    // Nível de preço para executar um negócio
input double         Signal_StopLevel       =0.0    // Nível de Stop Loss (em pontos)
input double         Signal_TakeLevel       =0.0    // Nível de Take Profit (em pontos)

Os parâmetros de entrada Signal_ThresholdOpen/Signal_ThresholdClose permitem especificar os níveis de limite para abrir e fechar posições.

No código dos métodos LongCondition() e ShortCondition() da classe de sinais de negociação, especificamos os valores fixos do limite:

  • Abrir posição: 80;
  • Fechar posição: 40.

O Consultor Especializado gerado pelo MQL5 Wizard abre e fecha posições usando os "votos" dos módulos de sinais de negociação. O voto do módulo principal (como contêiner, que consiste em todos os módulos adicionados) também é utilizado, mas seus métodos LongCondition() e ShortCondition() sempre retornam 0.

Os resultados dos votos do módulo principal também são utilizados na média dos "votos". No nosso caso, temos: módulo principal + 1 módulo de sinais de negociação, então precisamos considerar esse fato ao definir os valores de limite. Por causa disso, o ThresholdOpen e ThresholdClose devem ser definidos como 40=(0+80)/2 e 20=(0+40)/2.

Os valores dos parâmetros de entrada Signal_StopLevel e Signal_TakeLevel estão definidos como 0, o que significa que o fechamento das posições será feito apenas quando as condições de fechamento forem verdadeiras.


2.4. Resultados de backtesting da história

Vamos considerar o backtesting do Consultor Especializado em dados históricos (EURUSD H1, período de teste: 01.01.2010-11.03.2011, PeriodRSI=37, MA_period=7).

Na criação do Consultor Especializado, utilizamos o volume fixo (Negociação com Lote Fixo, 0.1), o algoritmo Trailing Stop não é utilizado (Trailing não utilizado).

Fig. 11. Resultados de testes do Consultor Especializado baseado em Bullish Harami/Bearish Harami + RSI

Fig. 11. Resultados de testes do Consultor Especializado baseado em Bullish Harami/Bearish Harami + RSI


O melhor conjunto de parâmetros de entrada pode ser encontrado usando o Strategy Tester do terminal do cliente MetaTrader 5.

O código do Consultor Especializado, criado pelo MQL5 Wizard, está anexado em expert_aml_rsi.mq5.


Lista
Comentário 0