O MQL5 Wizard permite criar EAs prontos com base nas classes da biblioteca padrão que vêm junto com o terminal cliente (confira Criando EAs Prontos no MQL5 Wizard para mais detalhes). Ele é ideal para testar 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 básica é a seguinte: a classe de sinais de negociação é derivada de CExpertSignal. Depois, é necessário sobrescrever os métodos virtuais LongCondition() e ShortCondition() com seus próprios métodos.
Tem um livro "Estratégias dos Melhores Traders" (em russo), que apresenta várias estratégias de negociação. Vamos focar nos padrões de velas de reversão, confirmados por Stochastic, CCI, MFI e RSI.
A melhor abordagem é criar uma classe separada, derivada de CExpertSignal, para verificar a formação de padrões de velas. Para confirmar os sinais de negociação gerados por esses padrões, 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 no padrão de vela de reversão "Hammer/Hanging Man", confirmados pelo indicador CCI. O módulo de sinais de negociação se baseia na classe CCandlePattern, que é um exemplo simples de como criar sinais de negociação com padrões de velas.
1. Padrões de Velas de Reversão: "Hammer" e "Hanging Man"
1.1. Hammer
O "Hammer" é uma vela com um corpo pequeno e uma longa sombra inferior, formada após um movimento de preço para baixo. O padrão "Hammer" indica o fim de uma tendência de baixa.
A cor do corpo da vela não é importante, mas um hammer em alta indica maior potencial de alta. O corpo do padrão "Hammer" geralmente é formado próximo ao mínimo da vela anterior. A sombra inferior mais longa e a sombra superior mais curta aumentam o potencial do padrão de reversão.

Fig. 1. Padrão de vela 'Hammer'
O reconhecimento do padrão "Hammer" é implementado no método CheckPatternHammer() da classe CCandlePattern:
//+------------------------------------------------------------------+ //| Verifica a formação do padrão de vela "Hammer" | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHammer() { //--- Hammer if((MidPoint(1)<CloseAvg(2)) && // tendência de baixa (MathMin(Open(1),Close(1))>(High(1)-(High(1)-Low(1))/3.0)) && // corpo no terço superior (Close(1)<Close(2)) && (Open(1)<Open(2))) // gap do corpo return(true); //--- return(false); }
O método CheckCandlestickPattern(CANDLE_PATTERN_HAMMER) da classe CCandlePattern é usado para verificar a formação do padrão de vela "Hammer".
1.2. Hanging Man
O "Hanging Man" é uma vela com um corpo pequeno e uma longa sombra inferior, formada após um movimento de preço para cima. O padrão "Hanging Man" indica o fim de uma tendência de alta.
A cor do corpo da vela não é importante, mas uma vela de baixa indica maior potencial para queda. O corpo do padrão "Hanging Man" geralmente é formado próximo ao máximo da vela anterior. A sombra inferior mais longa e a sombra superior mais curta aumentam o potencial do padrão de reversão.

Fig. 2. Padrão de vela 'Hanging Man'
O reconhecimento do padrão "Hanging Man" é implementado no método CheckPatternHangingMan() da classe CCandlePattern:
//+------------------------------------------------------------------+ //| Verifica a formação do padrão de vela "Hanging Man" | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHangingMan() { //--- Hanging man if((MidPoint(1)>CloseAvg(2)) && // tendência de alta (MathMin(Open(1),Close(1)>(High(1)-(High(1)-Low(1))/3.0)) && // corpo no terço superior (Close(1)>Close(2)) && (Open(1)>Open(2))) // gap do corpo return(true); //--- return(false); }
O método CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN) da classe CCandlePattern é usado para verificar a formação do padrão de vela "Hanging Man".
2. Sinais de Negociação Confirmados pelo Indicador RSI
Os sinais de negociação para abrir posição longa ou curta 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 de 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 reverso 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 'Harami' confirmado pelo indicador RSI
- int CH_HM_RSI::LongCondition() - verifica as condições para abrir uma posição longa (retorna 80) e fechar a posição curta (retorna 40);
- int CH_HM_RSI::ShortCondition() - verifica as condições para abrir uma posição curta (retorna 80) e fechar a posição longa (retorna 40).
2.1. Abrir Posição Longa/Fechar Posição Curta
A formação do padrão "Hammer" deve ser confirmada pelo indicador RSI: RSI(1)<40 (o valor do RSI da última barra completada deve ser menor que 40).
A posição curta deve ser fechada se o indicador RSI cruzou para cima os níveis críticos 70 ou 30.
//+------------------------------------------------------------------+ //| 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 CH_HM_RSI::LongCondition() { int result=0; //--- idx pode ser usado para determinar o modo de trabalho 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 novas barras int idx =StartIndex(); //--- verificando as condições para abrir posição longa //--- formação do padrão Hammer e RSI<30 if(CheckCandlestickPattern(CANDLE_PATTERN_HAMMER) && (RSI(1)<40)) result=80; //--- verificando as condições para fechar posição curta //--- cruzamento das linhas 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
A formação do padrão "Hanging Man" deve ser confirmada pelo indicador RSI: RSI(1)>60 (o valor do indicador RSI da última barra completada deve ser maior que 60).
A posição longa deve ser fechada se o indicador RSI cruzou para baixo os níveis críticos 70 ou 30.
//+------------------------------------------------------------------+ //| 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 CH_HM_RSI::ShortCondition() { int result=0; //--- idx pode ser usado para determinar o modo de trabalho 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 novas barras int idx =StartIndex(); //--- verificando as condições para abrir posição curta //--- formação do padrão Hanging Man e RSI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN) && (RSI(1)>60)) result=80; //--- verificando as condições para fechar posição longa //--- cruzamento das linhas 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 um Expert Advisor usando MQL5 Wizard
A classe CH_HM_RSI não está incluída nas classes da biblioteca padrão, para utilizá-la, é necessário baixar o arquivo ach_hm_rsi.mqh (veja 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 usá-lo no MQL5 Wizard após reiniciar o MetaEditor.
Para criar um Expert Advisor, inicie o MQL5 Wizard:

Fig. 4. Criando Expert Advisor usando MQL5 Wizard
Vamos especificar o nome do Expert Advisor:

Fig. 5. Propriedades gerais do Expert Advisor
Após isso, precisamos selecionar os módulos de sinais de negociação a serem utilizados.

Fig. 6. Propriedades do sinal do Expert Advisor
No nosso caso, utilizamos apenas um módulo de sinais de negociação.
Adicionando o módulo de sinais Baseado em Hammer/Hanging Man confirmado pelo RSI:

Fig. 7. Propriedades do sinal do Expert Advisor
Módulo de sinais de negociação adicionado:

Fig. 8. Propriedades do sinal do Expert Advisor
Você pode selecionar quaisquer propriedades de trailing, mas vamos usar "Trailing Stop não utilizado":

Fig. 9. Propriedades de trailing do Expert Advisor
Quanto às propriedades de gerenciamento de dinheiro, usaremos "Negociação com volume fixo":

Fig. 10. Propriedades de gerenciamento de dinheiro do Expert Advisor
Ao pressionar o botão "Finalizar", obteremos o código do Expert Advisor gerado, localizado em Expert_AH_HM_RSI.mq5, que será salvo na pasta terminal_data_folder\MQL5\Experts\.
Os parâmetros de entrada padrão do Expert Advisor gerado:
//--- entradas para sinal principal input int Signal_ThresholdOpen =10; // Valor do limiar do sinal para abrir [0...100] input int Signal_ThresholdClose =10; // Valor do limiar 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)
devem ser substituídos por:
//--- entradas para sinal principal input int Signal_ThresholdOpen =40; // Valor do limiar do sinal para abrir [0...100] input int Signal_ThresholdClose =20; // Valor do limiar 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 limiar para abrir e fechar posições.
No código dos métodos LongCondition() e ShortCondition() da classe de sinais de negociação, temos valores fixos de limiar especificados:
- Abrir posição: 80;
- Fechar posição: 40.
O Expert Advisor, 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 usados na média dos "votos". Neste caso, temos: módulo principal + 1 módulo de sinais de negociação, então precisamos levar isso em consideração ao definir os valores de limiar. Devido a esse fato, os valores ThresholdOpen e ThresholdClose devem ser definidos como 40=(0+80)/2 e 20=(0+40)/2.
