Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5

Assistente MQL5 - Sinais de Negociação Baseados no Cruzamento de Duas EMA com filtro de tempo intradiário - expert para MetaTrader 5
- Visualizações:
- 4314
- Avaliação:
- Publicado:
- 2014.01.15 08:29
- Atualizado:
- 2016.11.22 07:33
-
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance
O MQL5 Wizard permite criar o código de Expert Advisors automaticamente. Veja Criando Expert Advisors em MQL5 Wizard prontos para uso para mais detalhes.
Os sinais de negociação baseados no cruzamento de duas Exponentially Smoothed Moving Averages serão considerados em MQL5 Wizard - Sinais de Negociação Baseados no cruzamento de Duas Exponentially Smoothed Moving Averages. As moving averages são eficazes quando há tendência, em outros casos, elas oferecem muitos sinais falsos. Uma das formas de melhorar a estratégia é o uso de filtros de tempo (por exemplo, abrir novas posições quando for a sessão Europeia de FOREX).
Aqui vamos considerar uma estratégia baseada no cruzamento de duas exponentially smoothed Moving Averages (fast EMA and slow EMA) com filtro de tempo intradiário. A estratégia é chamada "Signals based on crossover of two EMA with intraday time filter" (ao criar EA automaticamente no MQL5 Wizard).
Sinais de Negociação:
- Abrir posição de compra: a Fast EMA cruza por cima a slow EMA e as condições do filtro de tempo intradiário estão satisfeitas.
- Abrir posição de venda: a Fast EMA cruza por baixo a slow EMA e as condições do filtro de tempo intradiário estão satisfeitas.
A estratégia será implementada na classe CSignal2EMA_ITF.
O sistema de negociação está baseado em ordens pendentes, os níveis de preços são calculados de acordo com os valores da moving average, e são usadas as unidades ATR (Average True Range).
Figura 1. Sinais de Negociação Baseados no Cruzamento de Duas EMA com filtro de tempo intradiário
Sinais de Negociação
A estratégia de negociação será implementada na classe CSignal2EMA_ITF, na qual possui alguns métodos protegidos para simplificar o acesso em indicadores:
double FastEMA(int ind) // retorna o valor de fast EMA da barra double SlowEMA(int ind) // retorna o valor de slow EMA da barra double StateFastEMA(int ind) // retorna o valor positivo/negativo quando fast EMA aumenta/diminui double StateSlowEMA(int ind) // retorna o valor positivo/negativo quando slow EMA aumenta/diminui double StateEMA(int ind) // retorna a diferença entre fast e slow EMA double ATR(int ind) // retorna o valor de ATR da barra
- Limit>0. Ele vai voltar quando houver falsa quebra da moving average, sobre o preço melhor do que o preço de mercado (pedidos Buy Limit e Sell Limit serão colocados dependendo do sinal de negociação)
- Limit<0. Vai depender da direção do movimento do preço (ordens Buy Stop e Sell Stop serão colocadas dependendo do sinal de negociação).
- Limit=0. Neste caso, irá negociar com os preços de mercado.
1. Abrindo posição de compra
Verificar as condições para abrir posição de compra: se diferença entre a fast e a slow EMA na última barra concluída mudar seu sinal de "-" para "+" (StateEMA(1)> 0 && StateEMA(2) <0).
Em seguida, verificar as condições do filtro de tempo intradiário, chamando o método CheckOpenLong() da classe CSignalITF. Se a negociação estiver permitida, ela irá calcular a base do nível de preços (o valor da moving average) e a faixa de valor ATR da última barra concluída.
Dependendo do sinal do parâmetro de entrada Limit, ela vai colocar a ordem pendente de compra. A ordem de preço, os níveis Take Profit e Stop Loss são calculados relativamente ao nível base de preço (em unidades de ATR). A ordem "expiration time" é definida (em barras) pelo parâmetro de entrada Expiration.
//+------------------------------------------------------------------+ //| Checks conditions to open long position (buy) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)>0 && StateEMA(2)<0)) return(false); if(!m_time_filter.CheckOpenLong(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
2. Fechando posição de compra
No nosso caso, a função que verifica as condições para fechar a posição de compra sempre retorna falso, ou seja, é assumido que a posição de compra será fechada pelo Take Profit ou Stop Loss. Se necessário, você pode escrever seu próprio código com a implementação deste método.
//+------------------------------------------------------------------+ //| Checks conditions to close long position | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseLong(double& price) { return(false); }
3. Abrindo posição de venda
Verificar as condições para abrir posição de venda: se diferença entre a fast e a slow EMA na última barra concluída mudar seu sinal de "+" para "-" (StateEMA(1)<0 && StateEMA(2) >0).
Em seguida, verificar as condições do filtro de tempo intradiário, chamando o método CheckOpenLong() da classe CSignalITF. Se a negociação estiver permitida, ela irá calcular a base do nível de preços (o valor da moving average) e a faixa de valor ATR da última barra concluída.
Dependendo do sinal do parâmetro de entrada Limit, ela vai colocar a ordem pendente de venda. A ordem de preço, os níveis Take Profit e Stop Loss são calculados relativamente ao nível base de preço (em unidades de ATR). A ordem "expiration time" é definida (em barras) pelo parâmetro de entrada Expiration.
//+------------------------------------------------------------------+ //| Checks conditions to open short position (sell) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)<0 && StateEMA(2)>0)) return(false); if(!m_time_filter.CheckOpenShort(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price =m_symbol.NormalizePrice(ema+m_limit*atr); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
4. Fechando posição de venda
No nosso caso, a função que verifica as condições para fechar a posição de venda sempre retorna falso, ou seja, é assumido que a posição de venda será fechada pelo Take Profit ou Stop Loss. Se necessário, você pode escrever seu próprio código com a implementação deste método.
//+------------------------------------------------------------------+ //| Checks conditions to close short position | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseShort(double& price) { return(false); }
5. Trailing Stop da Ordem de Compra Pendente
O Expert Advisor irá trilhar ordens pendentes dependendo do valor atual da moving average e do ATR.
//+--------------------------------------------------------------------+ //| Checks conditions to modify pending buy order | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price) { //--- check if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); //--- return(true); }
6. Trailing Stop da Ordem de Venda Pendente
O Expert Advisor irá trilhar ordens pendentes dependendo do valor atual da moving average e do ATR.
A ordem será executada se o preço de mercado chegar ao preço da ordem.
//+--------------------------------------------------------------------+ //| Checks conditions to modify pending buy order | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price) { //--- check if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price=m_symbol.NormalizePrice(ema+m_limit*atr); //--- return(true); }
Criando um Expert Advisor usando o MQL5 Wizard
Para criar um robô de negociação com base na estratégia que você quer, você precisa escolher as propriedades dos sinais como "Signals based on crossover of two EMA with intraday time filter" na opção "Creating Ready-Made Expert Advisors" do MQL5 Wizard:
Figura 2. Selecione "Signals based on crossover of two EMA with intraday time filter" no MQL5 Wizard
O próximo passo você precisa especificar o algorítimo trailing stop e o sistema de gestão de dinheiro e riscos. O código do Expert Advisor será criado automaticamente. Você pode compilar e testar no Strategy Tester do terminal cliente MetaTrader 5.
Testando os Resultados
Vamos considerar o backtesting do Expert Advisor com dados históricos (EUenSD H1, período customizado: 1.1.2010-05.01.2011, PeriodFastEMA=5, PeriodSlowEMA=30, PeriodATR=7, Limit=1.2, StopLoss=5, TakeProfit=8, Expiration=4, GoodMinuteOfHour=-1, BadMinutesOfHour=0, GoodHourOfDay=-1, BadHoursOfDay=0, GoodDayOfWeek=-1, BadDaysOfWeek=0).
Na criação do Expert Advisor usamos um volume fixo (Negociação Fixa do Lote, 0.1), algorítimo Trailing Stop não utilizado (Trailing não utilizado).
Figura 3. Resultados do backtesting do Expert Advisor, com base no Cruzamento de Duas EMA com filtro de tempo intradiário
Quando o filtro de tempo intradiário não é usado, há muitos sinais falsos. Os sinais de negociação podem ser melhorados se realizarmos a análise dos resultados de negociação, dependendo das horas comerciais.
No nosso caso, descobrimos que o cruzamento de duas EMAs oferece muitos sinais falsos a partir de 06:00 até 23:59. Podemos especificar o filtro de tempo intradiário ao definir os parâmetros do filtro.
Por exemplo, podemos especificar o tempo do filtro, que permite abrir posições somente de 00:00 até 05:59. Isso pode ser feito definindo o valor de BadHoursOfDay=16777152=111111111111111111000000b. Todas as outras horas de negociação são "ruins", por isso é melhor proibir a abertura de novas posições de 6:00 até o final do dia.
Se definir o valor do BadHoursOfDay = 16777152, vamos filtrar muitos sinais falsos:
Figura 4. Testando Resultados do Expert Advisor com sinais de negociação, com base no cruzamento de duas EMAs com filtro de tempo (BadHoursofDay=16777152)
O CSignalITF fornece muitos outros recursos de filtragem de tempo (apenas especificar os minutos "bons" e "maus" dentro de uma hora, as horas no mesmo dia, dias dentro de uma semana).
Anexos: The Signal2EMA-ITF.mqh com a classe CSignal2EMA_ITF localizados na pasta terminal_data_folder\MQL5\Include\Expert\Signal.
O arquivo expert_2ema_itf.mq5 contém o código do Expert Advisor criado, usando o MQL5 Wizard.
Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/264

A operação do sistema de negociação se baseia no salto fora dos níveis de suporte/resistência do indicador Pivot.

Expert Advisor baseado no suporte de Pivot diário.

Indicador GMMA Long convertido em um histograma para uma melhor visualização.

20 linhas do indicador Ranking de Correlação de Spearman em uma janela do gráfico