Início Negociação Sistemática Postagem

Como Criar Sinais de Negociação com MQL5 Wizard Usando Estrelas da Manhã e da Noite + Estocástico

Anexo
301.zip (6.6 KB, Baixar 0 vezes)

O MQL5 Wizard é uma ferramenta poderosa que permite criar Robôs de Investimento prontos para uso, baseados nas classes da biblioteca padrão que chega junto com o terminal do cliente (veja Criando Robôs de Investimento Prontos no MQL5 Wizard para mais detalhes). Essa ferramenta permite verificar suas ideias de negociação rapidamente, bastando criar 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 geral é 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 suas próprias implementações.

Há um livro chamado "Estratégias dos Melhores Traders" (em russo), que apresenta várias estratégias de negociação. Vamos focar nos padrões de candlestick de reversão, confirmados pelo Estocástico, CCI, MFI e RSI.

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

Aqui, vamos considerar os sinais baseados nos padrões de candlestick de "Estrela da Manhã/Estrela da Noite" (Morning Doji Star/Evening Doji Star), confirmados pelo indicador Estocástico. O módulo de sinais de negociação é baseado na classe CCandlePattern, que é um exemplo simples de uso para a criação de sinais de negociação com padrões de candlestick.


1. Padrões de Candlestick de Reversão: "Estrela da Manhã" e "Estrela da Noite"

1.1. Estrela da Manhã

Esse padrão indica a reversão de uma tendência de baixa e consiste em três candles (Fig. 1). Após um longo candle preto, temos um candle (a cor não importa) com um corpo pequeno, que fica fora do corpo do candle preto. O pequeno corpo do candle indica que as forças dos touros e ursos estão em equilíbrio e o mercado está pronto para mudar de tendência.

O terceiro candle do padrão é um candle de alta, cujo corpo não se sobrepõe ao corpo do segundo candle e o preço de fechamento está dentro do corpo do primeiro (bearish). O candle resultante do modelo também está plotado na Figura 1.

Caso o segundo candle seja doji, o padrão é chamado de "Estrela da Manhã Doji".

Figura 1. Padrões de candlestick 'Estrela da Manhã' e 'Estrela da Manhã Doji'

Figura 1. Padrões de candlestick 'Estrela da Manhã' e 'Estrela da Manhã Doji'

A identificação do padrão "Estrela da Manhã" é realizada nos métodos CheckPatternMorningStar() e CheckPatternMorningDoji() da classe CCandlePattern:

//+------------------------------------------------------------------+
//| Verifica a formação do padrão "Estrela da Manhã"               |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternMorningStar()
  {
//--- Estrela da Manhã
   if((Open(3)-Close(3)>AvgBody(1))
             && // candle bearish, corpo maior que o corpo médio
      (MathAbs(Close(2)-Open(2)<AvgBody(1)*0.5) && // segundo candle tem corpo pequeno
      (Close(2)<Close(3))
                       && // fechamento do segundo candle menor que o fechamento do primeiro
      (Open(2)<Open(3))
                       && // abertura do segundo candle menor que a abertura do primeiro
      (Close(1)>MidOpenClose(3)))
                       // fechamento do último candle maior que o centro do primeiro
            return(true);
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| Verifica a formação do padrão "Estrela da Manhã Doji"           |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternMorningDoji()
  {
//--- Estrela da Manhã Doji
   if((Open(3)-Close(3)>AvgBody(1)) && // candle bearish com corpo maior que o corpo médio
      (AvgBody(2)<AvgBody(1)*0.1)   && // segundo candle tem corpo muito pequeno
      (Close(2)<Close(3))           && // fechamento do segundo candle menor que o fechamento do primeiro
      (Open(2)<Open(3))             && // abertura do segundo candle menor que a abertura do primeiro
      (Open(1)>Close(2))            && // gap de alta no último candle
      (Close(1)>Close(2)))             // fechamento do último candle maior que o fechamento do segundo
            return(true);
//---
   return(false);
  }

Os métodos CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) e CheckCandlestickPattern(CANDLE_PATTERN_MORNING_DOJI) da classe CCandlePattern são utilizados para verificar a formação dos padrões "Estrela da Manhã" e "Estrela da Manhã Doji".


1.2. Estrela da Noite

Esse padrão indica a reversão de uma tendência de alta e também consiste em três candles (Fig. 2). Após um longo candle branco, temos um candle (a cor não importa) com um corpo pequeno, que fica fora do corpo do candle branco. O pequeno corpo do candle indica que as forças dos touros e ursos estão em equilíbrio e o mercado está pronto para mudar de tendência.

O terceiro candle do padrão é um candle de baixa, cujo corpo não se sobrepõe ao corpo do segundo candle e o preço de fechamento está dentro do corpo do primeiro (bullish). O candle resultante do modelo também está plotado na Figura 2.

Caso o segundo candle seja doji, o padrão é chamado de "Estrela da Noite Doji".

Figura 2. Padrões de candlestick 'Estrela da Noite' e 'Estrela da Noite Doji'

Figura 2. Padrões de candlestick 'Estrela da Noite' e 'Estrela da Noite Doji'

Aqui estão os métodos para identificar os padrões "Estrela da Noite" e "Estrela da Noite Doji":

//+------------------------------------------------------------------+
//| Verifica a formação do padrão "Estrela da Noite"                |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternEveningStar()
  {
//--- Estrela da Noite
   if((Close(3)-Open(3)>AvgBody(1))             && // candle bullish com corpo maior que o corpo médio
      (MathAbs(Close(2)-Open(2)<AvgBody(1)*0.5) && // segundo candle tem corpo pequeno
      (Close(2)>Close(3))                       && // fechamento do segundo candle maior que o fechamento do primeiro
      (Open(2)>Open(3))                         && // abertura do segundo candle maior que a abertura do primeiro
      (Close(1)<MidOpenClose(3)))                       // fechamento do último candle menor que o centro do primeiro
            return(true);
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| Verifica a formação do padrão "Estrela da Noite Doji"           |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternEveningDoji()
  {
//--- Estrela da Noite Doji
   if((Close(3)-Open(3)>AvgBody(1)) && // candle bullish com corpo maior que o corpo médio
      (AvgBody(2)<AvgBody(1)*0.1)   && // segundo candle tem corpo muito pequeno
      (Close(2)>Close(3))           && // fechamento do segundo candle maior que o fechamento do primeiro
      (Open(2)>Open(3))             && // abertura do segundo candle maior que a abertura do primeiro
      (Open(1)<Close(2))            && // gap de baixa no último candle
      (Close(1)<Close(2)))             // fechamento do último candle menor que o fechamento do segundo
            return(true);
//---
   return(false);
  }

Os métodos CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) e CheckCandlestickPattern(CANDLE_PATTERN_EVENING_DOJI) da classe CCandlePattern são utilizados para verificar a formação dos padrões "Estrela da Noite" e "Estrela da Noite Doji".


2. Sinais de Negociação Confirmados pelo Indicador Estocástico

Os sinais de negociação para abrir posições longas ou curtas devem ser confirmados pelo oscilador Estocástico. A linha %D deve ser maior/menor que o nível crítico correspondente (30 ou 70).

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

  1. se a linha %D alcançou o nível crítico oposto (80 para posição longa e 20 para posição curta)
  2. se o sinal reverso não for confirmado (quando a linha %D alcança os seguintes níveis: 20 para posição longa e 80 para posição curta)

Figura 3. Padrão 'Estrela da Noite' confirmado pelo indicador estocástico

Figura 3. Padrão 'Estrela da Noite' confirmado pelo indicador estocástico



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

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

  1. A formação do padrão "Estrela da Manhã" deve ser confirmada pelo indicador Estocástico: StochSignal(1)<30 (o valor da linha de sinal do indicador Estocástico do último candle completado deve ser menor que 30).

  2. A posição curta deve ser fechada se a linha de sinal do indicador Estocástico cruzar para cima os níveis 20 ou 80.

//+------------------------------------------------------------------+
//| Verifica 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 CMS_ES_Stoch::LongCondition()
  {
   int result=0;
//--- idx pode ser usado para determinar o modo de operação do EA
//--- idx=0 - neste caso o EA verifica condições de negociação a cada tick
//--- idx=1 - neste caso o EA verifica condições de negociação apenas em candles de notícias
   int idx   =StartIndex();
//--- verificação das condições para abrir posição longa
//--- formação do padrão Estrela da Manhã e linha de sinal<30
  if (CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) && (StochSignal(1)<30))
     result=80;
//--- verificação das condições para fechar posição curta
//--- cruzamento da linha de sinal nos níveis de sobrecompra/sobrevenda (para baixo 20, para cima 80)
   if((((StochSignal(1)>20) && (StochSignal(2)<20)) ||
       ((StochSignal(1)>80) && (StochSignal(2)<80))))
     result=40;
//--- retornar resultado
   return(result);
  }

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

  1. A formação do padrão "Estrela da Noite" deve ser confirmada pelo indicador Estocástico: StochSignal(1)>70 (o valor da linha de sinal do indicador Estocástico do último candle completado deve ser maior que 70).

  2. A posição longa deve ser fechada se a linha de sinal do Estocástico cruzar para baixo os níveis 80 ou 20.

//+------------------------------------------------------------------+
//| Verifica 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 CMS_ES_Stoch::ShortCondition()
  {
   int result=0;
//--- idx pode ser usado para determinar o modo de operação do EA
//--- idx=0 - neste caso o EA verifica condições de negociação a cada tick
//--- idx=1 - neste caso o EA verifica condições de negociação apenas em candles de notícias
   int idx   =StartIndex();
//--- verificação das condições para abrir posição curta
//--- formação do padrão Estrela da Noite e linha de sinal>70
  if (CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) && (StochSignal(1)>70))
     result=80;
//--- verificação das condições para fechar posição longa
//--- cruzamento da linha de sinal nos níveis de sobrecompra/sobrevenda (para baixo 80, para cima 20)
   if((((StochSignal(1)<80) && (StochSignal(2)>80)) ||
       ((StochSignal(1)<20) && (StochSignal(2)>20))))
     result=40;
//--- retornar resultado
   return(result);
  }


2.3. Criando um Robô de Investimento com o MQL5 Wizard

A classe CMS_ES_Stoch não está incluída nas classes da Biblioteca Padrão. Para usá-la, é necessário baixar o arquivo acms_es_stoch.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 candlepatterns.mqh. Você pode utilizá-los no MQL5 Wizard após reiniciar o MetaEditor.

Para criar um Robô de Investimento, inicie o MQL5 Wizard:

Figura 4. Criando Robô de Investimento com o MQL5 Wizard

Figura 4. Criando Robô de Investimento com o MQL5 Wizard

Vamos especificar o nome do Robô:

Figura 5. Propriedades gerais do Robô de Investimento

Figura 5. Propriedades gerais do Robô de Investimento

Depois disso, precisamos selecionar os módulos de sinais de negociação que serão utilizados.

Figura 6. Propriedades dos sinais do Robô de Investimento

Figura 6. Propriedades dos sinais do Robô de Investimento

Neste caso, usaremos apenas um módulo de sinais de negociação.

Adicionando o módulo "Sinais Baseados em Estrelas da Manhã/Noite por Estocástico" de sinais de negociação:

Figura 7. Propriedades dos sinais do Robô de Investimento

Figura 7. Propriedades dos sinais do Robô de Investimento

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

Figura 8. Propriedades dos sinais do Robô de Investimento

Figura 8. Propriedades dos sinais do Robô de Investimento

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

Figura 9. Propriedades de trailing do Robô de Investimento

Figura 9. Propriedades de trailing do Robô de Investimento

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

Figura 10. Propriedades de gerenciamento de dinheiro do Robô de Investimento

Figura 10. Propriedades de gerenciamento de dinheiro do Robô de Investimento

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

Os parâmetros de entrada padrão do Robô gerado:

//--- entradas para o sinal principal
input int            Signal_ThresholdOpen   =10;     // Valor de limite do sinal para abrir [0...100]
input int            Signal_ThresholdClose  =10     // Valor de limite do 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)

deve ser substituído por:

//--- entradas para o sinal principal
input int            Signal_ThresholdOpen   =40;     // Valor de limite do sinal para abrir [0...100]
input int            Signal_ThresholdClose  =20     // Valor de limite do 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 a abertura e fechamento de 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 Robô de Investimento 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 um 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 devemos levar isso em conta ao definir os valores dos limites. Por causa disso, os 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 Histórico

Vamos considerar o backtesting do Robô de Investimento em dados históricos (EURUSD H1, período de teste: 2000.01.01-2011.03.16, PeriodK=12, PeriodD=8, PeriodSlow=29, MA_period=4).

Na criação do Robô de Investimento, utilizamos o volume fixo (Negociação de Lote Fixo, 0.1). O algoritmo de Trailing Stop não é utilizado (Trailing não utilizado).

Figura 11. Resultados do teste do Robô de Investimento, baseado em Estrelas da Manhã/Noite + Estocástico

Figura 11. Resultados do teste do Robô de Investimento, baseado em Estrelas da Manhã/Noite + Estocástico


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

O código do Robô de Investimento, criado pelo MQL5 Wizard, está anexado em expert_ams_es_stoch.mq5.

Publicações relacionadas

Comentário (0)