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
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
1. Abrir posição longa
Condições para abrir posição longa:
- StateEMA(0)<0 e StateEMA(1)>0: a média móvel está em alta nas barras atual e anterior;
- StateClose(1)>0: o preço de fechamento da barra anterior é maior que a média móvel;
- 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);
- 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:
- StateEMA(0)<0 e StateEMA(1)<0: a média móvel está em baixa nas barras atual e anterior;
- StateClose(1)<0: o preço de fechamento da barra completada é menor que a média móvel;
- 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);
- 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 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 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
- Como Criar Sinais de Negociação com MQL5 Wizard Usando Estrelas da Manhã e da Noite + Estocástico
- MQL5 Wizard: Sinais de Negociação com Padrões Candlestick e RSI no MetaTrader 5
- MQL5 Wizard: Sinais de Negociação com 3 Corvos Negros/3 Soldados Brancos e MFI
- MQL5 Wizard: Sinais de Negócios com 3 Corvos Negros/3 Soldados Brancos + Estocástico para MetaTrader 5
- MQL5 Wizard: Sinais de Negociação com Estrelas da Manhã/Noite + RSI para MetaTrader 5