English Русский 中文 Español Deutsch 日本語 한국어 Français Italiano Türkçe
Como criar rapidamente um Consultor Especialista para o Campeonato de Negociações Automáticas 2010

Como criar rapidamente um Consultor Especialista para o Campeonato de Negociações Automáticas 2010

MetaTrader 5Exemplos | 27 janeiro 2014, 15:21
1 193 0
Andrey Kornishkin
Andrey Kornishkin

Introdução

A fim de desenvolver um especialista para participar no Automated Trading Championship 2010 (Campeonato de Negociações Automáticas 2010), vamos usar um modelo de um conselheiro especialista do artigo O protótipo do robô de negócios. Até mesmo um programador MQL5 iniciante será capaz desta tarefa, porque para suas estratégias as classes básicas, funções e modelos já estão desenvolvidos. é suficiente escrever uma quantidade mínima de código para implementar sua ideia de negociação.

O que nós precisaremos preparar:
  • Seleção de estratégia
  • Escrever um Consultor Especialista
  • Testar
  • Otimização no Testador de Estratégias
  • Otimização da Estratégia
  • Testes em diferentes intervalos

1. Seleção da Estratégia

Acredita-se que a negociação com tendências é mais lucrativa do que a negociação em uma faixa, e o salto dos níveis durante um dia ocorrem mais frequentemente do que a separação das bordas dos canais.

Com base nestas suposições, abriremos a posição em direção à tendência atual subitamente a partir dos limites do canal (Envelopes). Fecharemos a posição em um sinal para fechar a posição ou quando os níveis de Stop Loss ou Take Profit forem alcançados.

Como o sinal de negócio, usaremos o crescimento MACD ou diminuição no gráfico diário, e negociaremos subitamente a partir dos limites do canal no período de tempo horário.

Figura 1. Indicador MACD no gráfico diário EURUSD

Figura 1. Indicador MACD no gráfico diário EURUSD

Se o indicador MACD crescer em duas barras em sucessão, este é o sinal de Compra. Se ele diminuir em duas barras em sucessão, este é o sinal de Venda.

Figura 2. Salto de Preço dos Limites de Envelopes

Figura 2. Salto de Preço dos Limites de Envelopes


2. Escrever um Expert Advisor

2,1. Módulos Inclusos

O expert usará a classe Expert Advisor a partir do módulo ExpertAdvisor.mqh.

#include 

2,2. Variáveis de Entrada

input int    SL        =  50; // Stop Loss distance
input int    TP        = 100; // Take Profit distance
input int    TS        =  50; // Trailing Stop distance
input int    FastEMA   =  15; // Fast EMA
input int    SlowEMA   =  26; // Slow EMA
input int    MACD_SMA  =   1; // MACD signal line
input int    EnvelPer  =  20; // Envelopes period
input double EnvelDev  = 0.4; // Envelopes deviation
input double Risk      = 0.1; // Risk

2,3. Criar uma Classe Herdada de CExpertAdvisor

class CMyEA : public CExpertAdvisor
  {
protected:
   double            m_risk;          // size of risk
   int               m_sl;            // Stop Loss
   int               m_tp;            // Take Profit
   int               m_ts;            // Trailing Stop
   int               m_pFastEMA;      // Fast EMA
   int               m_pSlowEMA;      // Slow EMA
   int               m_pMACD_SMA;     // MACD signal line
   int               m_EnvelPer;      // Envelopes period
   double            m_EnvelDev;      // Envelopes deviation
   int               m_hmacd;         // MACD indicator handle
   int               m_henvel;        // Envelopes indicator handle
public:
   void              CMyEA();
   void             ~CMyEA();
   virtual bool      Init(string smb,ENUM_TIMEFRAMES tf); // initialization
   virtual bool      Main();                              // main function
   virtual void      OpenPosition(long dir);              // open position on signal
   virtual void      ClosePosition(long dir);             // close position on signal
   virtual long      CheckSignal(bool bEntry);            // check signal
  };
//------------------------------------------------------------------
2,4. Excluir indicadores
//------------------------------------------------------------------    
void CMyEA::~CMyEA()
  {
   IndicatorRelease(m_hmacd);  // delete MACD indicator
   IndicatorRelease(m_henvel); // delete Envelopes indicator
  }
//------------------------------------------------------------------    
2,5. Inicializar Variáveis
//------------------------------------------------------------------    Init
bool CMyEA::Init(string smb,ENUM_TIMEFRAMES tf)
  {
   if(!CExpertAdvisor::Init(0,smb,tf)) return(false);    // initialize parent class
   // copy parameters
    m_risk=Risk; 
   m_tp=TP; 
   m_sl=SL; 
   m_ts=TS;
   m_pFastEMA=FastEMA; 
   m_pSlowEMA=SlowEMA; 
   m_pMACD_SMA=MACD_SMA;
   m_EnvelPer = EnvelPer;
   m_EnvelDev = EnvelDev;
   m_hmacd=iMACD(m_smb,PERIOD_D1,m_pFastEMA,m_pSlowEMA,m_pMACD_SMA,PRICE_CLOSE);      // create MACD indicator
   m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
   if(m_hmacd==INVALID_HANDLE ||m_henvel==INVALID_HANDLE ) return(false);             // if there is an error, then exit
   m_bInit=true; 
   return(true);                                                                      // trade allowed
  } 

2,6. Função de Negociação

//------------------------------------------------------------------    CheckSignal
long CMyEA::CheckSignal(bool bEntry)
  {
   double macd[4],   // Array of MACD indicator values
         env1[3],    // Array of Envelopes' upper border values
         env2[3];    // Array of Bollinger Bands' lower border values
   MqlRates rt[3];   // Array of price values of last 3 bars
   
   if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array
     {
       Print("CopyRates ",m_smb," history is not loaded"); 
        return(WRONG_VALUE);
     }
   // Copy indicator values to array
   if(CopyBuffer(m_hmacd,0,0,4,macd)<4 || CopyBuffer(m_henvel,0,0,2,env1)<2 ||CopyBuffer(m_henvel,1,0,2,env2)<2)
     { 
        Print("CopyBuffer - no data"); 
       return(WRONG_VALUE);
     }
   // Buy if MACD is growing and if there is a bounce from the Evelopes' lower border
   if(rt[1].open<env2[1] && rt[1].close>env2[1] && macd[1]<macd[2] &&  macd[2]<macd[3])
      return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy
   // Sell if MACD is dwindling and if there is a bounce from the Evelopes' upper border
   if(rt[1].open>env1[1] && rt[2].close<env1[1]&& macd[1]>macd[2] &&  macd[2]>macd[3])
      return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell

   return(WRONG_VALUE); // if there is no signal
  }

CMyEA ea; // class instance
</env1[</macd[</macd[</env2[

Então, após escrever o código, envie o especialista resultante para o Testador de Estratégias.


3. Testando

No testador de Estratégia para o período do "último ano" em EURUSD obtemos o seguinte gráfico:

Figura 3. Resultados do teste do sistema de negociações com os parâmetros iniciais

Figura 3. Resultados do teste do sistema de negociações com os parâmetros iniciais

Os resultados não impressionam, então vamos começar a otimizar os níveis de Parar Perdas e Obter Lucros.


4. Otimização no Testador de Estratégias

Otimizaremos os parâmetros de Stop Loss e Take Profit no intervalo 10-500 com etapa 50.

Melhores resultados: Parar Perdas = 160, Obter Lucros = 310. Após a otimização do Parar Perdas e Obter Lucros recebemos 67% de negociações lucrativas contra as 36% anteriores e um lucro líquido de $1522.97. Assim, por simples manipulações, atualizamos nosso sistema para o ponto de equilíbrio e até obtemos algum lucro.

Figura 4. Resultados do teste do sistema de negociações com Parar Perdas e Obter Lucros otimizados

Figura 4. Resultados do teste do sistema de negociações com Parar Perdas e Obter Lucros otimizados

Em seguida vamos otimizar o período de envelopes e o desvio.

O período de envelopes muda de 10 para 40 com passo 4 e desvio - de 0.1 para 1 com passo 0.1.

Os melhores resultados de otimização são: Período de envelopes = 22, desvio de envelopes = 0.3. Até agora nós obtemos $14418.92 de lucro líquido e 79% de transações lucrativas.

Figura 5. Resultados do teste do sistema de negociações com período de envelopes e desvio otimizados

Figura 5. Resultados do teste do sistema de negociações com períodos de envelopes e desvio otimizados

Se aumentarmos o risco para 0,8, teremos o lucro líquido de $77330.95.

Figura 6. Os Resultados do teste do sistema de negociações com risco otimizado

Figura 6. Os Resultados do teste do sistema de negociações com risco otimizado

5. Otimização da Estratégia

A otimização da estratégia pode consistir dos seguintes passos:

  • Mudança do indicador de tendência
  • Selecionar outro envelope
  • Selecionar outro cronograma
  • Mudar condições de negócio

5,1. Mudança do Indicador de Tendência

Como podemos ver no artigo Diversas maneiras de encontrar uma tendência no MQL5, os melhores indicadores de tendências são as médias móveis e um "leque" de médias móveis.

Vamos substituir o indicador MACD com média móvel simples. O código do especialista pode ser encontrado no arquivo Macena.mq5 anexado.

5,2. Selecionar Outro Envelope

Além dos Envelopes você também pode selecionar outro envelope à nossa disposição. Por exemplo, Canal de Preço, Faixas de Bollinger ou envelope baseado em médias móveis.

Um exemplo de especialista, que usa MM e Faixas de Bollinger, pode ser encontrado no arquivo Maboll.mq5 anexado.

5,3. Selecionar Outro Prazo

Vamos mudar o prazo para mais ou menos. Como um maior espaço de tempo - tome H4, como o menor - M15, e então teste e otimize seu sistema.

Para fazer isto, substitua apenas uma linha no código:

m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator

No caso do espaço de tempo H4:

m_henvel=iEnvelopes(m_smb,PERIOD_H4,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator 

Para o espaço de tempo M15:

m_henvel=iEnvelopes(m_smb,PERIOD_M15,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator

5,4. Mudança das Condições de Negociação

Como um experimento, vamos também alterar as condições de negociação.

  1. Faça possível o sistema se reverter. Compraremos subitamente a partir do limite inferior dos Envelopes, e venderemos subitamente a partir dos limites superiores dos Envelopes.
  2. Verifique o sistema sem seguir a tendência do dia. Isto é feito simplesmente por inserir o seguinte código no bloco de negociação:
    //------------------------------------------------------------------ CheckSignal
    long CMyEA::CheckSignal(bool bEntry)
      {
       double env1[3],   // Array of Envelopes' upper border values
             env2[3];    // Array of Bollinger Bands' lower border values
       MqlRates rt[3];   // Array of price values of last 3 bars
    
       if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array
         {
          Print("CopyRates ",m_smb," history is not loaded");
          return(WRONG_VALUE);
         }
    // Copy indicator values to array
       if(CopyBuffer(m_henvel,0,0,2,env1)<2 || CopyBuffer(m_henvel,1,0,2,env2)<2)
         {
          Print("CopyBuffer - no data");
          return(WRONG_VALUE);
         }
    // Buy if there is a bounce from the Evelopes' lower border
       if(rt[1].open<env2[1] && rt[1].close>env2[1])
          return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy
    // Sell if there is a bounce from the Evelopes' upper border
       if(rt[1].open>env1[1] && rt[2].close<env1[1])
          return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell
    
       return(WRONG_VALUE); // if there is no signal
      }
    
    CMyEA ea; // class instance
    //------------------------------------------------------------------    OnInit
    </env1[</env2[

3. Fecharemos a posição curta quando o preço não for muito para baixo, mas virar e subir.

4. Fecharemos a posição longa quando o preço não for muito para cima, mas virar e descer.

Você pode inventar muitas outras formas de otimizar uma estratégia de transações, algumas delas são descritas na literatura correspondente.

Mais pesquisas dependem de você.


6. Testando em Diferentes Intervalos

Teste nosso Consultor Especialista em intervalos iguais de tempo com um deslocamento de um mês. Vamos usar "último ano" como um período de testes. Período de tempo - 3 meses.

Intervalo de testes
Lucro, USD
Transações lucrativas
1.01.2010 - 30.03.2010
7239,50 76,92%
1.02.2010 - 30.04.2010 -6577,50 0%
1.03.2010 - 30.05.2010 -8378,50 50%
1.04.2010 - 30.06.2010 -6608,00 0%
1.05.2010 - 30.07.2010 41599,50 80%
1.06.2010 - 30.08.2010 69835,50 85%
Resumo: Não é desejável usar o Consultor Especialista com uma administração de dinheiro tão agressiva. Reduza o risco.


Conclusão

Conclusão breve: com base neste modelo você pode rapidamente implementar sua ideia de negociação com o mínimo de tempo e esforço.

Otimização de parâmetros de sistema e critério de negociação também não cria problema algum.

Para criar um sistema de transações estável, é desejável otimizar todos os parâmetros em intervalos de tempo mais longos.

Lista de fontes utilizadas:
  1. Artigo 20 Trade Signals in MQL5.
  2. Artigo The Prototype of Trade Robot.
  3. Artigo Several Ways of Detecting a Trend in MQL5.
  4. Artigo Expert Advisors Based on Popular Trading Systems and Alchemy of Trading Robot Optimization.
  5. Artigo Limitations and Verifications in Expert Advisors.
  6. Artigo Writing an Expert Advisor Using the MQL5 Object-Oriented Programming Approach.
  7. Artigo Functions for Money Management in an Expert Advisor.

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/148

Arquivos anexados |
mabol.mq5 (6.65 KB)
macena.mq5 (6.94 KB)
maena.mq5 (6.58 KB)
Usando a função TesterWithdrawal() para Modelar as Retiradas de Lucro Usando a função TesterWithdrawal() para Modelar as Retiradas de Lucro
Este artigo descreve a utilização da função TesterWithDrawal() para estimar riscos nos sistemas de negócio que implicam na remoção de uma determinada parte dos ativos durante sua operação. Além disso, ele descreve o efeito desta função no algoritmo de cálculo do rebaixamento de igualdade no Strategy tester. Esta função é útil quando otimizar parâmetros de seus Expert Advisors.
Controlando o declive da curva de equilíbrio durante o trabalho de um Expert Advisor Controlando o declive da curva de equilíbrio durante o trabalho de um Expert Advisor
Encontrar regras para um sistema de negócio e programá-las em um Expert Advisor é metade do trabalho. De alguma forma, você precisa corrigir a operação do Expert Advisor conforme ele acumular os resultados da negociação. Este artigo descreve uma das abordagens, que permite melhorar a performance de um Expert Advisor pela criação de um feedback que mede o declive da curva de equilíbrio.
O uso de bibliotecas de classe de negócio padrão MQL5 ao escrever um Expert Advisor O uso de bibliotecas de classe de negócio padrão MQL5 ao escrever um Expert Advisor
Este artigo explica como usar as principais funcionalidades das Classes de negócio da biblioteca padrão do MQL5 ao escrever Expert Advisors que implementam o fechamento e modificação de posição, posicionamento de ordem pendente e exclusão e verificação de Margem antes de posicionar um negócio. Também demonstramos como as classes de negócio podem ser usadas para obter detalhes de ordens e transações.
O método ideal para calcular o volume da posição total pelo número mágico especificado O método ideal para calcular o volume da posição total pelo número mágico especificado
O problema do cálculo do volume de posição total do símbolo especificado e número mágico é considerado neste artigo. O método proposto requer apenas a parte mínima necessária do histórico de negócios, descobre o tempo mais próximo quando a posição total foi igual a zero, e realiza os cálculos com os negócios recentes. O trabalho com variáveis globais do terminal de cliente também é considerado.