Assistente MQL5: criar Expert Advisors sem programação

MetaQuotes | 6 fevereiro, 2014

Introdução

Quando você cria sistemas de negócio automatizados, é necessário escrever algorítimos de análise da situação de mercado e gerar sinais de negócio, algorítimos de rastreio de suas posições abertas, assim como sistemas de gerenciamento de dinheiro e gerenciamento de risco.

Uma vez que o código do módulo seja escrito, a tarefa mais difícil é montar todas as partes e depurar o código fonte do robô de negócio. Aqui está uma função essencial desempenhada pela arquitetura da interação dos módulos: se for construído de forma inadequada, a maior parte do tempo será gasta em encontrar e corrigir erros, e se você substituir o algorítimo de qualquer módulo, isso levará a reescrever todo o código.

No MQL5 usar a abordagem orientada a objeto facilita significantemente a escrita e teste de sistemas de negócio automatizados.

A MetaQuotes Software Corp. desenvolveu classes para implementar estratégias de negócio. Agora, você pode gerar código de Expert Advisors automaticamente diretamente no MetaEditor selecionando os Sinais de negócio necessários (atualmente existem 20 deles), Trailing (4) e Gerenciamento de dinheiro (5) módulos. Combinando estes módulos, você pode obter muitas variáveis de sistemas de negócio prontas para uso.

Você também pode usar suas próprias classes com implementação de qualquer um destes módulos. Crie-os você mesmo ou peça através do serviço Jobs.

Neste artigo, consideraremos a geração automática do código fonte dos Expert Advisors utilizando o Assistente MQL5. E não haverá nada a ser programado!


1. Criando robô de negócio utilizando o Assistente MQL5

O código-fonte do Expert Advisor é gerado com a utilização do MQL5 Wizard no MetaEditor.

As classes básicas das estratégias de negócio estão localizadas na pasta '\\MQL5\Include\Expert\' folder. Algorítimos prontos para uso de classes de sinais de negócio, classes de rastreio de posições abertas e classes de gerenciamento de dinheiro e risco estão localizados nas sub-pastas Sinal, Rastreamento e Dinheiro. O MQL5 Wizard analisa e utiliza os arquivos destes diretórios para gerar o código do Expert Advisor.

Para iniciar o Assistente MQL5 você precisa clicar no botão "Novo" na barra de ferramentas ou selecionar "Novo" no menu "Arquivo" (ou simplesmente pressionar Ctrl+N):

Figura 1. Iniciando o MQL5 Wizard

Fig. 1. Iniciando o MQL5 Wizard

Em seguida, selecione o tipo de programa que você deseja criar. Em nosso caso, selecione a opção "Expert Advisor (gerar)":

Figura 2. Selecionando o tipo de programa

Fig. 2. Selecionando o tipo de programa


Passo 1. Propriedades gerais do Expert Advisor

Em seguida, a caixa de diálogo abrirá e você poderá definir as propriedades gerais do Expert Advisor:

Figura 3. Propriedades gerais do Expert Advisor

Fig. 3. Propriedades gerais do Expert Advisor

Especifique o nome do seu Expert Advisor, o nome do autor e o link para o seu website nos campos "Nome", "Autor" e "Link" (respectivamente).

O Expert Advisor também possui os seguintes parâmetros de entrada:

Na próxima etapa, selecione o tipo de sinais de negócio em que o expert irá negociar.


Passo 2. Selecionar os módulos de sinais de negociação

O algorítimo de abertura e fechamento de posições é determinado pelos módulos de sinais de negociação. Os módulos de sinais de negociação contêm regras de abertura/fechamento/reversão de posições.

A Biblioteca Padrão possui Módulos de sinais de negócio prontos para uso:

  1. CSignalAC - O módulo de sinais com base nos modelos de mercado do indicador Oscilador do acelerador.
  2. CSignalAMA - O módulo de sinais com base nos modelos de mercado do indicador Média móvel adaptável.
  3. CSignalAO - O módulo de sinais com base nos modelos de mercado do indicador Awesome Oscillator.
  4. CSignalBearsPower - O módulo de sinais com base nos modelos de mercado do oscilador Bears Power.
  5. CSignalBullsPower - O módulo de sinais com base nos modelos de mercado do oscilador Bulls Power.
  6. CSignalCCI - O módulo de sinais com base nos modelos de mercado do oscilador índice de canal de commodity.
  7. CSignalDeM - O módulo de sinais com base nos modelos de mercado do oscilador DeMarker.
  8. CSignalDEMA - O módulo de sinais com base nos modelos de mercado do indicador Média móvel exponencial dupla.
  9. CSignalEnvelopes - O módulo de sinais com base nos modelos de mercado do indicador Envelopes.
  10. CSignalFrAMA - O módulo de sinais com base nos modelos de mercado do indicador Média móvel adaptável fractal.
  11. CSignalITF - O módulo de filtragem de sinais por tempo.
  12. CSignalMACD - O módulo de sinais com base nos modelos de mercado do oscilador MACD.
  13. CSignalMA - O módulo de sinais com base nos modelos de mercado do indicador Média móvel.
  14. CSignalSAR - O módulo de sinais com base nos modelos de mercado do indicador SAR Parabólico.
  15. CSignalRSI - O módulo de sinais com base nos modelos de mercado do oscilador índice de força relativa.
  16. CSignalRVI - O módulo de sinais com base nos modelos de mercado do oscilador índice de vigor relativo.
  17. CSignalStoch - O módulo de sinais com base nos modelos de mercado do oscilador Estocástico.
  18. CSignalTRIX - O módulo de sinais com base nos modelos de mercado do oscilador Média exponencial tripla.
  19. CSignalTEMA - O módulo de sinais com base nos modelos de mercado do indicador Média móvel exponencial tripla.
  20. CSignalWPR - O módulo de sinais com base nos modelos de mercado do oscilador Faixa de porcentagem Williams.

    O tipo dos sinais de negócio é selecionado a partir da lista suspensa "Nome".

    Após pressionar o botão Próximo, você verá uma janela:

    Fig. 4. Seleção de sinais de negócio de Expert Advisor

    Fig. 4. Seleção de sinais de negócio de Expert Advisor

    Para adicionar um módulo de sinais de negócio, pressione o botão "Adicionar".

    Vamos adicionar sinais de negócio, com base no indicador de média móvel.


    Fig. 5. Selecione o algorítimo dos sinais de negócio

    Fig. 5. Selecione o algorítimo dos sinais de negócio

    Cada módulo dos sinais de negócio possui seus próprios parâmetros. Você pode usar os valores padrão.

    Existem dois modos de criação de parâmetros. Você pode alternar entre eles fazendo duplo clique no botão esquerdo do mouse no ícone de parâmetros. Se o parâmetro tiver o ícone destacado , então, ele estará disponível como a variável de entrada do Expert Advisor. Tais parâmetros podem ser utilizados adiante para otimização de expert no Strategy Tester. Se o parâmetro tiver o ícone cinza , então, ele terá o valor fixo que você não pode modificar a partir das propriedades do Expert Advisor.

    O módulo de sinais de negócio aparecerá na lista:

    Fig. 6. O módulo de sinais de negócio foi adicionado

    Fig. 6. O módulo de sinais de negócio foi adicionado


    Passo 3. Selecionar o módulo de rastreamento de posições abertas

    O próximo passo é selecionar o algorítimo das posições abertas de rastreamento (Limite móvel). A utilização do rastreamento permite que você armazene lucros obtidos.

    A Biblioteca padrão fornece diversas formas de rastreio de posições abertas:

    1. CTrailingNone - O Limite móvel não é usado.
    2. CTrailingFixedPips - Limite móvel baseado em Nível de parada fixa.
    3. CTrailingMA - Limite móvel baseado em MA.
    4. CTrailingPSAR - Limite móvel baseado em SAR Parabólico.

    Em nosso Expert Advisor selecione "Limite móvel baseado no Nível de parada fixa":

    Figura 6. Selecione o algorítimo de rastreio de posições abertas

    Fig. 7. Selecione o algorítimo de rastreio de posições abertas

    Este tipo de rastreio tem dois parâmetros: StopLevel e ProfitLevel (em pontos para cotas com 2 e 4 dígitos após a vírgula), que serão usados para rastrear posições abertas.

    Figura 7. Configurando parâmetros do algorítimo selecionado de rastreio das posições abertas

    Fig. 9. Configurando parâmetros do algorítimo selecionado de rastreio das posições abertas


    Passo 4. Selecionar o módulo de gerenciamento de risco e dinheiro

    No último passo, você precisa selecionar o sistema de gerenciamento de risco e dinheiro que será utilizado em seu Expert Advisor.

    O propósito deste algorítimo é determinar o volume de negócio (em lotes) para operações de negociação e também o gerenciamento de risco. Quando o valor de perda excede o limite permitido (por exemplo, 10% de equidade), o módulo de gerenciamento de dinheiro e risco forçará o fechamento da posição não rentável.

    A Biblioteca padrão fornece diversas implementações prontas para uso de algorítimos de gerenciamento de dinheiro e risco:

    1. CMoneyFixedLot - Negociando com volume de negócio fixo.
    2. CMoneyFixedMargin - Negociando com margem fixa.
    3. CMoneyFixedRisk - Negociando com risco fixo.
    4. CMoneyNone - Negociando com o volume de negócio mínimo permitido.
    5. CMoneySizeOptimized - Negociando com o volume de negócio otimizado.

    Figura 8. Selecione o algorítimo de gerenciamento de dinheiro e risco

    Fig. 9. Selecione o algorítimo de gerenciamento de dinheiro e risco

    Selecione o algorítimo 'Negociando com volume de negócio fixo'.

    O módulo que selecionamos tem dois parâmetros:

    Figura 9. Configurando parâmetros do algorítimo selecionado de gerenciamento de dinheiro e risco

    Fig. 10. Configurando parâmetros do algorítimo selecionado de gerenciamento de dinheiro e risco

    Após clicar em "Finalizar", o arquivo TestExpert.mq5 aparecerá na pasta \teminal_data_filder\MQL5\Experts\. O nome do arquivo corresponde ao nome especificado do Expert Advisor.


    2. A estrutura do Expert Advisor criada utilizando o Assistente MQL5

    O código fonte do Expert Advisor, gerado pelo assistente MQL5 parece com o seguinte:

    //+------------------------------------------------------------------+
    //|                                                   TestExpert.mq5 |
    //|                        Copyright 2012, MetaQuotes Software Corp. |
    //|                                              https://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2012, MetaQuotes Software Corp."
    #property link      "https://www.mql5.com"
    #property version   "1.00"
    //+------------------------------------------------------------------+
    //| Include                                                          |
    //+------------------------------------------------------------------+
    #include <Expert\Expert.mqh>
    //--- available signals
    #include <Expert\Signal\SignalMA.mqh>
    //--- available trailing
    #include <Expert\Trailing\TrailingFixedPips.mqh>
    //--- available money management
    #include <Expert\Money\MoneyFixedLot.mqh>
    //+------------------------------------------------------------------+
    //| Inputs                                                           |
    //+------------------------------------------------------------------+
    //--- inputs for expert
    input string             Expert_Title                  ="TestExpert"; // Document name
    ulong                    Expert_MagicNumber            =23689;        // 
    bool                     Expert_EveryTick              =false;        // 
    //--- inputs for main signal
    input int                Signal_ThresholdOpen          =10;           // Signal threshold value to open [0...100]
    input int                Signal_ThresholdClose         =10;           // Signal threshold value to close [0...100]
    input double             Signal_PriceLevel             =0.0;          // Price level to execute a deal
    input double             Signal_StopLevel              =50.0;         // Stop Loss level (in points)
    input double             Signal_TakeLevel              =50.0;         // Take Profit level (in points)
    input int                Signal_Expiration             =4;            // Expiration of pending orders (in bars)
    input int                Signal_MA_PeriodMA            =85;           // Moving Average(85,0,...) Period of averaging
    input int                Signal_MA_Shift               =0;            // Moving Average(85,0,...) Time shift
    input ENUM_MA_METHOD      Signal_MA_Method              =MODE_SMA;      // Moving Average(85,0,...) Method of averaging
    input ENUM_APPLIED_PRICE  Signal_MA_Applied             =PRICE_CLOSE;    // Moving Average(85,0,...) Prices series
    input double             Signal_MA_Weight              =1.0;          // Moving Average(85,0,...) Weight [0...1.0]
    //--- inputs for trailing
    input int                Trailing_FixedPips_StopLevel  =30;           // Stop Loss trailing level (in points)
    input int                Trailing_FixedPips_ProfitLevel=50;           // Take Profit trailing level (in points)
    //--- inputs for money
    input double             Money_FixLot_Percent          =10.0;         // Percent
    input double             Money_FixLot_Lots             =0.1;          // Fixed volume
    //+------------------------------------------------------------------+
    //| Global expert object                                             |
    //+------------------------------------------------------------------+
    CExpert ExtExpert;
    //+------------------------------------------------------------------+
    //| Initialization function of the expert                            |
    //+------------------------------------------------------------------+
    int OnInit()
      {
    //--- Initializing expert
       if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
         {
          //--- failed
          printf(__FUNCTION__+": error initializing expert");
          ExtExpert.Deinit();
          return(-1);
         }
    //--- Creating signal
       CExpertSignal *signal=new CExpertSignal;
       if(signal==NULL)
         {
          //--- failed
          printf(__FUNCTION__+": error creating signal");
          ExtExpert.Deinit();
          return(-2);
         }
    //---
       ExtExpert.InitSignal(signal);
       signal.ThresholdOpen(Signal_ThresholdOpen);
       signal.ThresholdClose(Signal_ThresholdClose);
       signal.PriceLevel(Signal_PriceLevel);
       signal.StopLevel(Signal_StopLevel);
       signal.TakeLevel(Signal_TakeLevel);
       signal.Expiration(Signal_Expiration);
    //--- Creating filter CSignalMA
       CSignalMA *filter0=new CSignalMA;
       if(filter0==NULL)
         {
          //--- failed
          printf(__FUNCTION__+": error creating filter0");
          ExtExpert.Deinit();
          return(-3);
         }
       signal.AddFilter(filter0);
    //--- Set filter parameters
       filter0.PeriodMA(Signal_MA_PeriodMA);
       filter0.Shift(Signal_MA_Shift);
       filter0.Method(Signal_MA_Method);
       filter0.Applied(Signal_MA_Applied);
       filter0.Weight(Signal_MA_Weight);
    //--- Creation of trailing object
       CTrailingFixedPips *trailing=new CTrailingFixedPips;
       if(trailing==NULL)
         {
          //--- failed
          printf(__FUNCTION__+": error creating trailing");
          ExtExpert.Deinit();
          return(-4);
         }
    //--- Add trailing to expert (will be deleted automatically))
       if(!ExtExpert.InitTrailing(trailing))
         {
          //--- failed
          printf(__FUNCTION__+": error initializing trailing");
          ExtExpert.Deinit();
          return(-5);
         }
    //--- Set trailing parameters
       trailing.StopLevel(Trailing_FixedPips_StopLevel);
       trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
    //--- Creation of money object
       CMoneyFixedLot *money=new CMoneyFixedLot;
       if(money==NULL)
         {
          //--- failed
          printf(__FUNCTION__+": error creating money");
          ExtExpert.Deinit();
          return(-6);
         }
    //--- Add money to expert (will be deleted automatically))
       if(!ExtExpert.InitMoney(money))
         {
          //--- failed
          printf(__FUNCTION__+": error initializing money");
          ExtExpert.Deinit();
          return(-7);
         }
    //--- Set money parameters
       money.Percent(Money_FixLot_Percent);
       money.Lots(Money_FixLot_Lots);
    //--- Check all trading objects parameters
       if(!ExtExpert.ValidationSettings())
         {
          //--- failed
          ExtExpert.Deinit();
          return(-8);
         }
    //--- Tuning of all necessary indicators
       if(!ExtExpert.InitIndicators())
         {
          //--- failed
          printf(__FUNCTION__+": error initializing indicators");
          ExtExpert.Deinit();
          return(-9);
         }
    //--- ok
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Deinitialization function of the expert                          |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
      {
       ExtExpert.Deinit();
      }
    //+------------------------------------------------------------------+
    //| "Tick" event handler function                                    |
    //+------------------------------------------------------------------+
    void OnTick()
      {
       ExtExpert.OnTick();
      }
    //+------------------------------------------------------------------+
    //| "Trade" event handler function                                   |
    //+------------------------------------------------------------------+
    void OnTrade()
      {
       ExtExpert.OnTrade();
      }
    //+------------------------------------------------------------------+
    //| "Timer" event handler function                                   |
    //+------------------------------------------------------------------+
    void OnTimer()
      {
       ExtExpert.OnTimer();
      }
    //+------------------------------------------------------------------+
    

    O código do Expert Advisor consiste em diversas seções.

    Seção que descreve as propriedades do programa:

    #property copyright "Copyright 2012, MetaQuotes Software Corp."
    #property link      "https://www.mql5.com"
    #property version   "1.00"
    

    Arquivos inclusos:

    #include <Expert\Expert.mqh>
    //--- available signals
    #include <Expert\Signal\SignalMA.mqh>
    //--- available trailing
    #include <Expert\Trailing\TrailingFixedPips.mqh>
    //--- available money management
    #include <Expert\Money\MoneyFixedLot.mqh>

    O código da classe CExpert (sua instância é utilizada no Expert Advisor) está localizado no arquivo Expert.mqh.

    O arquivo SignalMA.mqh contém o código fonte da classe de sinais de negócio selecionada - CSignalMA. O arquivo TrailingFixedPips.mqh contém o código fonte de rastreio da classe de algorítimo de posições abertas- CSignalMA. O gerenciamento de dinheiro e risco será implementado pela classe CMoneyFixedLot contida no arquivo MoneyFixed.mqh.

    A seguir, vem os parâmetros do Expert Advisor:

    //--- inputs for expert
    input string             Expert_Title                  ="TestExpert"; // Document name
    ulong                    Expert_MagicNumber            =23689;        // 
    bool                     Expert_EveryTick              =false;        // 
    //--- inputs for main signal
    input int                Signal_ThresholdOpen          =10;           // Signal threshold value to open [0...100]
    input int                Signal_ThresholdClose         =10;           // Signal threshold value to close [0...100]
    input double             Signal_PriceLevel             =0.0;          // Price level to execute a deal
    input double             Signal_StopLevel              =50.0;         // Stop Loss level (in points)
    input double             Signal_TakeLevel              =50.0;         // Take Profit level (in points)
    input int                Signal_Expiration             =4;            // Expiration of pending orders (in bars)
    input int                Signal_MA_PeriodMA            =85;           // Moving Average(85,0,...) Period of averaging
    input int                Signal_MA_Shift               =0;            // Moving Average(85,0,...) Time shift
    input ENUM_MA_METHOD      Signal_MA_Method              =MODE_SMA;     // Moving Average(85,0,...) Method of averaging
    input ENUM_APPLIED_PRICE   Signal_MA_Applied             =PRICE_CLOSE;  // Moving Average(85,0,...) Prices series
    input double             Signal_MA_Weight              =1.0;          // Moving Average(85,0,...) Weight [0...1.0]
    //--- inputs for trailing
    input int                Trailing_FixedPips_StopLevel  =30;           // Stop Loss trailing level (in points)
    input int                Trailing_FixedPips_ProfitLevel=50;           // Take Profit trailing level (in points)
    //--- inputs for money
    input double             Money_FixLot_Percent          =10.0;         // Percent
    input double             Money_FixLot_Lots             =0.1;          // Fixed volume
    

    Os primeiros três parâmetros (Expert_Title, Expert_MagicNumber e Expert_EveryTick) são gerais. Eles estão sempre presentes independente dos algorítimos sinais de negócio, rastreio, e gerenciamento de dinheiro e risco.

    O parâmetro Expert_Title da string especifica o nome do Expert Advisor, Expert_MagicNumber especifica sua ID (este valor será utilizado nos parâmetros de solicitação de negócio) e o parâmetro Expert_EveryTick é utilizado para definir o modo de trabalho do EA. Se Expert_EveryTick é definido como verdadeiro, o Expert Advisor chamará as funções de manuseio (verificar condições de negócio, ocasionar operações de negócio, rastrear posição aberta) sempre que um novo tick estiver vindo para um símbolo de trabalho.

    Após os parâmetros gerais do Expert Advisor, vem os parâmetros de entrada para o algorítimo de sinais de negócio (em nosso caso, são os parâmetros usados na classe CSignalMA.

    Selecionamos a classe CTrailingStopFixedPips de rastreio de posições abertas. Ela rastreia a posição aberta em distância fixa determinada pelos níveis Stop Loss e Take Profit, que são valores definidos nos pontos de dígito 2/4 "normais". Quando o preço se move em direção à posição aberta à distância, que excede o número de pontos definido pelo nível Trailing_FixedPips_StopLevel, o Expert Advisor modifica os valores dos níveis Stop Loss e Take Profit (se Trailing_FixedPips_ProfitLevel > 0).

    Os parâmetros de entrada Money_FixLot_Percent e Money_FixLot_Lots correspondem aos parâmetros do algorítimo com o lote de negócio fixo, implementados na classe CMoneyFixedLot. Em nosso caso, o negócio será realizado com o volume fixo igual ao valor Money_FixLot_Lots.

    A classe CMoneyFixedLot também implementa o algorítimo de gerenciamento de risco: se existe uma perda (como uma dada porcentagem de igualdade atual) especificada no parâmetro Inp_Money_FixLot_Percent, a classe CMoneyFixedLot recomendará o Expert Advisor a forçadamente fechar a posição não rentável, e então, isso será feito.

    Após a entrada dos parâmetros do Expert Advisor, o objeto ExtExpert da classe CExpert é declarada:

    CExpert ExtExpert;
    

    Esta é a instância da classe de estratégia de negócio.

    Sendo uma instância da classe CExpert, o objeto ExtExpert contém referências para objetos menores da CExpertSignal (a classe base dos sinais de negócio), a CExpertMoney (a classe base do gerenciamento de dinheiro e risco) e a CExpertTrailing (a classe base de rastreio de posições abertas). Além da classe CExpert, contém instâncias das classes SSymbolInfo, CAccountInfo, CPositionInfo, COrderInfo e o retentor CIndicators.

    Para definir os parâmetros do Expert Advisor você deve criar instâncias de classes correspondentes e especificar referências para criar objetos na classe ExtExpert.

    Vamos considerar a função OnInit da inicialização do Expert Advisor. Aqui, iremos inicializar e configurar propriedades da classe ExtExpert.


    1. Inicialização da classe ExtExpert:

    //--- Initializing expert
       if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
         {
          //--- failed
          printf(__FUNCTION__+": error initializing expert");
          ExtExpert.Deinit();
          return(-1);
         }

    O objeto ExtExpert é iniciado utilizando o método Init. Aqui configuramos o símbolo, período de tempo, sinalização do método chamando em cada tick, ID do Expert Advisor e também criar e iniciar objetos privados de classes (neste estágio, as classes CExpertSignal, CExpertMoney e CExpertTrailing são usadas como objetos de gerenciamento de dinheiro, rastreamento e sinais).

    Se o objeto ExtExpert não for iniciado com sucesso, o Expert Advisor será finalizado com o código de retorno -1.


    2. Criar e configurar as propriedades do objeto de sinal

    //--- Creating signal
       CExpertSignal *signal=new CExpertSignal;
       if(signal==NULL)
         {
          //--- failed
          printf(__FUNCTION__+": error creating signal");
          ExtExpert.Deinit();
          return(-2);
         }
    //---
       ExtExpert.InitSignal(signal);
       signal.ThresholdOpen(Signal_ThresholdOpen);
       signal.ThresholdClose(Signal_ThresholdClose);
       signal.PriceLevel(Signal_PriceLevel);
       signal.StopLevel(Signal_StopLevel);
       signal.TakeLevel(Signal_TakeLevel);
       signal.Expiration(Signal_Expiration);
    //--- Creating filter CSignalMA
       CSignalMA *filter0=new CSignalMA;
       if(filter0==NULL)
         {
          //--- failed
          printf(__FUNCTION__+": error creating filter0");
          ExtExpert.Deinit();
          return(-3);
         }
       signal.AddFilter(filter0);
    //--- Set filter parameters
       filter0.PeriodMA(Signal_MA_PeriodMA);
       filter0.Shift(Signal_MA_Shift);
       filter0.Method(Signal_MA_Method);
       filter0.Applied(Signal_MA_Applied);
       filter0.Weight(Signal_MA_Weight);
    

    A configuração do objeto de sinais de negócio consiste em diversas etapas:

    Se o objeto ExtExpert não for iniciado com sucesso, o Expert Advisor finalizará com o código de retorno (de -2 a -3), o que depende de em qual etapa o erro ocorreu.

    Dependendo de como os parâmetros foram especificados no Assistente MQL5, o código apropriado é gerado.

    //--- Set signal parameters
       filter0.PeriodMA(85);                        //--- Parameter was set as fixed in MQL5 Wizard
                                                       //--- (gray icon - fixed value equal to 85)
       filter0.SlowPeriod(Signal_MA_Shift);      //--- Parameter was set as input variable
                                                       //--- (blue icon - input parameter of Expert Advisor)
    

    Se o parâmetro for fixo e seu valor não diferir do valor padrão, não será escrito no código gerado. Em tal caso, o valor padrão do parâmetro (especificado na classe correspondente) será usado.


    3. Criar e configurar as propriedades do objeto de rastreamento

    //--- Creation of trailing object
       CTrailingFixedPips *trailing=new CTrailingFixedPips;
       if(trailing==NULL)
         {
          //--- failed
          printf(__FUNCTION__+": error creating trailing");
          ExtExpert.Deinit();
          return(-4);
         }
    //--- Add trailing to expert (will be deleted automatically))
       if(!ExtExpert.InitTrailing(trailing))
         {
          //--- failed
          printf(__FUNCTION__+": error initializing trailing");
          ExtExpert.Deinit();
          return(-5);
         }
    //--- Set trailing parameters
       trailing.StopLevel(Trailing_FixedPips_StopLevel);
       trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
    A configuração do objeto de rastreamento também consiste em diversas etapas:

    Se o objeto de rastreamento não for iniciado com sucesso, o Expert Advisor finalizará com o código de retorno (de -4 a -5), o que depende de em qual etapa o erro ocorreu.


    4. Criar e configurar as propriedades do objeto de dinheiro

    //--- Creation of money object
       CMoneyFixedLot *money=new CMoneyFixedLot;
       if(money==NULL)
         {
          //--- failed
          printf(__FUNCTION__+": error creating money");
          ExtExpert.Deinit();
          return(-6);
         }
    //--- Add money to expert (will be deleted automatically))
       if(!ExtExpert.InitMoney(money))
         {
          //--- failed
          printf(__FUNCTION__+": error initializing money");
          ExtExpert.Deinit();
          return(-7);
         }
    //--- Set money parameters
       money.Percent(Money_FixLot_Percent);
       money.Lots(Money_FixLot_Lots);

    A configuração do objeto de dinheiro também consiste em 4 etapas:

    Se o objeto de dinheiro não for iniciado com sucesso, o Expert Advisor finalizará com o código de retorno (de -6 a -7), o que depende de em qual etapa o erro ocorreu.


    5. Iniciar todos os indicadores usados em classes

    //--- Check all trading objects parameters
       if(!ExtExpert.ValidationSettings())
         {
          //--- failed
          ExtExpert.Deinit();
          return(-8);
         }
    //--- Tuning of all necessary indicators
       if(!ExtExpert.InitIndicators())
         {
          //--- failed
          printf(__FUNCTION__+": error initializing indicators");
          ExtExpert.Deinit();
          return(-9);
         }
    //--- ok
       return(0);

    Após criar e iniciar os objetos de sinais de negócio, o gerenciamento de dinheiro e rastreamento, é chamado o método ValidationSettings() do ExtExpert. Após o método InitIndicators() do objeto ExtExpert ser chamado. Ele inicia os indicadores usados nos objetos de dinheiro, rastreamento e sinal.

    O manuseio dos eventos OnDeinit, OnTick, OnTrade e OnTimer é realizado chamando os métodos apropriados da classe ExtExpert.

    Se você quiser saber os detalhes sobre implementação dos métodos CExpert, você pode ver o código fonte do indicador, localizado em '\\MQL5\Include\Expert\expert.mqh'.


    3. Verificando o Expert Advisor criado no Strategy Tester do MetaTrader 5

    Se todos os componentes da Biblioteca padrão estiverem presentes, o código do Expert Advisor gerado compila com sucesso:

    Figura 10. Compilação bem sucedida do Código fonte do Expert Advisor criado no Assistente MQL5

    Figura 10. Compilação bem sucedida do Código fonte do Expert Advisor criado no Assistente MQL5

    O Expert Advisor resultante irá negociar de acordo com os algorítimos dos sinais de negócio, rastreio de posições abertas e gerenciamento de dinheiro e risco.

    Você pode verificar como seu sistema de negócio recém criado trabalha usando o Strategy Tester a partir do terminal de cliente MetaTrader5. Na figura 11, você pode ver os resultados do teste de dados do histórico com as configurações padrão (EURUSD, H1, 2010.01.01-2011.06.01):

    Figura 11. Resultados do Teste do Expert Advisor em Dados do histórico (EURUSD, H1)

    Figura 11. Resultados do Teste do Expert Advisor em Dados do histórico (EURUSD, H1)


    O melhor conjunto de parâmetros de Expert Advisor pode ser encontrador após a otimização no Provador de Estratégia do MetaTrader 5.


    Conclusão

    Utilizar as classes de estratégias de negócio facilita significantemente a criação e teste de suas ideias para negócio. Agora, o código fonte inteiro do Expert Advisor pode ser construído diretamente no MetaEditor utilizando seu Assistente MQL5 com base nos módulos da Biblioteca padrão pronta para uso ou seus próprios módulos.

    Se você não quiser escrever seu próprio módulo de sinal de negócio, você pode sempre se beneficiar do serviço Jobs e encomendar tanto o robô de negócio inteiro, como apenas os módulos necessários. Esta abordagem fornece benefícios adicionais: