Início Negociação Sistemática Postagem

Como Criar Sinais de Negociação com MQL5 Wizard: Cruzamento de Preços e Média Móvel Confirmados pelo ADX

Anexo
258.zip (3.23 KB, Baixar 0 vezes)

MQL5 Wizard permite criar o código de Sistemas de Trading automaticamente. Confira Criando Sistemas de Trading Prontos no MQL5 Wizard para mais detalhes.

Neste artigo, vamos falar sobre a estratégia baseada no cruzamento de preços com o indicador de Média Móvel, confirmada pelo indicador ADX. Essa estratégia é chamada de "Sinais baseados no cruzamento de preços com MA confirmados pelo ADX" (quando criamos o EA automaticamente no MQL5 Wizard).

Sinais de Negociação:

  • Compra: o preço de fechamento da última barra completada é maior que a média móvel, e a média móvel está em alta nas barras atual e anterior.
  • Venda: o preço de fechamento da última barra completada é menor que a média móvel, e a média móvel está em baixa nas barras atual e anterior.
  • Para filtrar sinais falsos, verificamos a força da tendência (ADX>ADXmín) e a direção da tendência usando os Índices de Movimento Direcional (DI+ e DI-).

Essa estratégia é implementada na classe CSignalADX_MA (deve ser colocada na pasta terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh).

Figura 1. Sinais de negociação baseados no cruzamento de preços com Média Móvel, confirmados pelo ADX

Figura 1. Sinais de negociação baseados no cruzamento de preços com Média Móvel, confirmados pelo ADX

Sinais de Negociação

A estratégia de negociação é implementada na classe CSignalADX_MA, que possui alguns métodos protegidos para simplificar o acesso a indicadores e valores de preços:

double   PlusADX(int ind)     // retorna o valor da linha DI+ da barra
double   MainADX(int ind)     // retorna o valor da linha principal da barra
double   MinusADX(int ind)    // retorna o valor da linha DI- da barra
double   EMA(int ind)         // retorna o valor da média móvel da barra
double   Close(int ind)       // retorna o valor do preço de fechamento da barra
double   StateADX(int ind)    // retorna a diferença entre as linhas DI+ e DI-
double   StateEMA(int ind)    // retorna um valor positivo se a EMA está em alta e negativo se está em baixa
double   StateClose(int ind)  // retorna a diferença entre o preço de fechamento e a média móvel
Uma característica dessa implementação é a verificação adicional da presença da tendência (usando o Indicador de Movimento Direcional). Isso permite filtrar sinais falsos e verificar as condições de negociação utilizando os valores da barra atual (não completada).


1. Abrir posição longa

Condições para abrir posição longa:

  1. StateEMA(0)<0 e StateEMA(1)>0: a média móvel está em alta nas barras atual e anterior;
  2. StateClose(1)>0: o preço de fechamento da barra anterior é maior que a média móvel;
  3. MainADX(0)>mínimo_ADX: o valor do ADX da barra atual é maior que um valor mínimo especificado (para verificar a presença da tendência);
  4. StateADX(0)>0: O DI+ é maior que o DI- da barra atual.
//+------------------------------------------------------------------+
//| Verifica condições para abrir posição longa (compra)          |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- condição 1: a média móvel está em alta nas barras atual e anterior 
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
//--- condição 2: preço de fechamento da barra anterior é maior que a média móvel 
   bool Buy_Condition_2=(StateClose(1)>0);
//--- condição 3: o valor do ADX da barra atual é maior que o valor mínimo especificado (limite de tendência) 
   bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- condição 4: o valor de DI+ é maior que DI- da barra atual
    bool Buy_Condition_4=(StateADX(0)>0);
//---
   price=0.0;
   sl   =m_symbol.Ask()-m_stop_loss*m_adjusted_point;
   tp   =m_symbol.Ask()+m_take_profit*m_adjusted_point;
//--- verificação de todas as condições
   return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }


2. Fechar posição longa

Condições para fechar posição longa:

  1. StateEMA(0)<0 e StateEMA(1)<0: a média móvel está em baixa nas barras atual e anterior;
  2. StateClose(1)<0: o preço de fechamento da barra completada é menor que a média móvel;
  3. MainADX(0)>mínimo_ADX: o valor do ADX da barra atual é maior que um valor mínimo especificado (para verificar a presença da tendência);
  4. StateADX(0)<0: O DI- é maior que o DI+ da barra atual.
//+------------------------------------------------------------------+
//| Verifica condições para fechar posição longa                      |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseLong(double& price)
  {
//--- condição 1: a média móvel está em baixa nas barras atual e anterior 
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
//--- condição 2: preço de fechamento da barra completada é menor que a média móvel 
   bool Sell_Condition_2=(StateClose(1)<0);
//--- condição 3: o valor do ADX da barra atual é maior que o valor mínimo especificado (limite de tendência) 
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- condição 4: o valor de DI- é maior que DI- da barra atual
   bool Sell_Condition_4=(StateADX(0)<0);
//---
   price=0.0;
//--- verificação de todas as condições
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }


3. Abrir posição curta

As condições para abrir uma posição curta são as mesmas que as condições para fechar a posição longa.

//+------------------------------------------------------------------+
//| Verifica condições para abrir posição curta (venda)           |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- condição 1: a média móvel está em baixa nas barras atual e anterior 
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
//--- condição 2: preço de fechamento da barra completada é menor que a média móvel 
   bool Sell_Condition_2=(StateClose(1)<0);
//--- condição 3: o valor do ADX da barra atual é maior que o valor mínimo especificado (limite de tendência) 
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- condição 4: o valor de DI- é maior que DI- da barra atual
   bool Sell_Condition_4=(StateADX(0)<0);
//---
   price=0.0;
   sl   =m_symbol.Bid()+m_stop_loss*m_adjusted_point;
   tp   =m_symbol.Bid()-m_take_profit*m_adjusted_point;
//--- verificação de todas as condições
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }


4. Fechar posição curta

As condições para fechar posição curta são as mesmas que as condições para abrir posição longa.

//+------------------------------------------------------------------+
//| Verifica condições para fechar posição curta                   |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseShort(double& price)
  {
//--- condição 1: a média móvel está em alta nas barras atual e anterior
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
//--- condição 2: preço de fechamento da última barra é maior que a média móvel 
   bool Buy_Condition_2=(StateClose(1)>0);
//--- condição 3: o valor do ADX da barra atual é maior que o valor mínimo especificado (limite de tendência)
    bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- condição 4: o valor de DI+ é maior que DI- da barra atual
   bool Buy_Condition_4=(StateADX(0)>0);
//---
   price=0.0;
//--- verificação de todas as condições
  return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }

Criando Expert Advisor com MQL5 Wizard

Para criar um robô de negociação baseado na estratégia, você precisa escolher as propriedades do sinal como "Sinais baseados no cruzamento de preços com MA confirmados pelo ADX" na opção "Criando Sistemas de Trading Prontos" do MQL5 Wizard:

Figura 2. Escolha os sinais baseados no cruzamento de preços com MA confirmados pelo ADX

Figura 2. Escolha os sinais baseados no cruzamento de preços com MA confirmados pelo ADX no MQL5 Wizard

Em seguida, você deve especificar o algoritmo de trailing stop necessário e o sistema de gerenciamento de dinheiro e risco. O código do Expert Advisor será criado automaticamente, você pode compilá-lo e testá-lo no Strategy Tester do terminal MetaTrader 5.


Resultados dos Testes

Vamos considerar o backtest do Expert Advisor com dados históricos (EURUSD H1, período de teste: 1.1.2010-05.01.2011, PeriodADX=33, MinimumADX=22, PeriodMA=39, StopLoss=400, TakeProfit=900).

Na criação do Expert Advisor, utilizamos um volume fixo (Trading Fixed Lot, 0.1), e o algoritmo de Trailing Stop não foi utilizado (Trailing não utilizado).

Figura 3. Resultados do backtesting histórico do Expert Advisor, baseado no cruzamento de preços com MA confirmado pelo ADX

Figura 3. Resultados do backtesting histórico do Expert Advisor, baseado no cruzamento de preços com MA confirmados pelo ADX


Anexos: O arquivo SignalADX-MA.mqh com a classe CSignalADX_MA deve ser colocado na pasta terminal_data_folder\MQL5\Include\Expert\Signal\.

O arquivo ma_crossover_adx.mq5 contém o código do Expert Advisor, criado usando o MQL5 Wizard.


Publicações relacionadas

Comentário (0)