Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Telegram!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Experts

Assistente MQL5 - Sinais de Negociação Baseados no Cruzamento de Duas EMA com filtro de tempo intradiário - expert para MetaTrader 5

Visualizações:
4043
Avaliação:
(39)
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.

A filtragem dos sinais, com base em períodos de tempo especificados, está implementada na classe CSignalITF. Como exemplo de seu uso, vamos considerar a classe CSignal2EMA_ITF (ela contém CSignalITF).

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

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


A característica deste sistema é a seguinte: o comércio depende do parâmetro de entrada Limit. Dependendo do seu sinal, existem casos diferentes:

  1. 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)
  2. 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).
  3. 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.

O sistema de negociação vai colocar ordens pendentes dependendo dos sinais de negociação. Se a ordem for colocada com sucesso, ela vai acompanhar a ordem pendente junto com a moving average. 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::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

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

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)

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).

O uso de filtros de tempo permite melhorar os sinais de negociação e ter em conta a dinâmica do mercado (por exemplo, características da sessão de negociação).

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

gpfTCPivotLimit gpfTCPivotLimit

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

gpfTCPivotStop gpfTCPivotStop

Expert Advisor baseado no suporte de Pivot diário.

GMMA_Long_Gistogram GMMA_Long_Gistogram

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

SpearmanStack_X20 (Indicador SpearmanRankCorrelation) SpearmanStack_X20 (Indicador SpearmanRankCorrelation)

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