English Русский 中文 Español Deutsch 日本語
Expert Advisors baseado em sistemas de trading populares e alquimia da otimização de robô de trading (Parte II)

Expert Advisors baseado em sistemas de trading populares e alquimia da otimização de robô de trading (Parte II)

MetaTrader 4Sistemas de negociação | 8 fevereiro 2016, 10:58
628 0
Nikolay Kositsin
Nikolay Kositsin

Introdução

Assim, a MetaQuotes Software Corp. abriu um registro para participar no Automated Trading Championship 2008 em 01 de julho de 2008! Seria um pouco inconsequente da minha parte perder tal oportunidade e não continuar a série dos meus artigos com a representação da lógica de construir um EA que iria formalmente cumprir todas as regras do Rules of the Automated Trading Championship 2008 e não admitir qualquer erro crítico durante o concurso, para qual poderia ser desqualificado.

É bem natural que, para a realização desse evento, estou usando os algoritmos mais simples de posições de abertura, fatores de trade os quais não serão realmente interessantes no contexto desse artigo, enquanto a maioria das pequenas coisas elementares podem se tornar mais importantes para a examinação de busca, pois ela pode adiar a sua participação no Championship em vários anos.


Ideia geral de escrita de um EA

Na minha opinião, seria mais expansivo, no nosso caso, esboçar tal Expert Advisor com uma descrição detalhada de sua construção que, na verdade, fornece seu comportamento correto na sua interação com o servidor de trade. O Rules of Championship determina que a quantidade de posições abertas e ordens pendentes localizadas simultaneamente seja igual a três. Então, seria sensato usar três estratégias em um EA, uma estratégia por posição.

Usaremos os mesmos algoritmos com parâmetros diferentes para abrir posições de abertura longas e curtas, enquanto fazer com que esses algoritmos abram somente uma posição por vez exige de nós designá-los com os mesmos números mágicos. Assim, teremos seis algoritmos para entrar no mercado e somente três números mágicos! Como algoritmo de entrada, eu uso um sistema de trading com base em modificar a direção média de movimento do meu primeiro artigo nessa série. Para fazer com que os algoritmos sejam diferentes uns dos outros, eu uso médias de movimento diferentes neles!


Código do Expert Advisor

Abaixo está a versão do código do EA:

//+==================================================================+
//|                                                 Exp_16_Champ.mq4 |
//|                             Copyright © 2008,   Nikolay Kositsin | 
//|                              Khabarovsk,   farria@mail.redcom.ru | 
//+==================================================================+
#property copyright "Copyright © 2008, Nikolay Kositsin"
#property link "farria@mail.redcom.ru"
//----+ +-----------------------------------------------------------------------+
//---- EXPERT ADVISOR'S INPUTS FOR BUY TRADES 
extern bool   Test_Up1 = true;//a filter for trades calculation direction
extern int    Timeframe_Up1 = 60;
extern double Money_Management_Up1 = 0.1;
extern int    Length_Up1 = 4;  // smoothing depth 
extern int    Phase_Up1 = 100; // parameter ranging within 
          //-100 ... +100, it affects the quality of the transient process; 
extern int    IPC_Up1 = 0;/* Choosing prices to calculate  
the indicator on (0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 
6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 
11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 
14-Heiken Ashi Close.) */
extern int    STOPLOSS_Up1 = 50;  // StopLoss
extern int    TAKEPROFIT_Up1 = 100; // TakeProfit
extern bool   ClosePos_Up1 = true; // enable forcible closing the position
//----+ +-----------------------------------------------------------------------+
//---- EXPERT ADVISOR'S INPUTS FOR SELL TRADES 
extern bool   Test_Dn1 = true;//a filter for trades calculation direction
extern int    Timeframe_Dn1 = 60;
extern double Money_Management_Dn1 = 0.1;
extern int    Length_Dn1 = 4;  // smoothing depth 
extern int    Phase_Dn1 = 100; // parameter ranging within
         // -100 ... +100, it affects the quality of the transient process; 
extern int    IPC_Dn1 = 0;/* Choosing prices to calculate 
the indicator on (0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 
6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 
11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 
14-Heiken Ashi Close.) */
extern int   STOPLOSS_Dn1 = 50;  // StopLoss
extern int   TAKEPROFIT_Dn1 = 100; // TakeProfit
extern bool   ClosePos_Dn1 = true; // enable forcible closing the position
//----+ +-----------------------------------------------------------------------+
//---- EXPERT ADVISOR'S INPUTS FOR BUY TRADES 
extern bool   Test_Up2 = true;//a filter for trades calculation direction
extern int    Timeframe_Up2 = 60;
extern double Money_Management_Up2 = 0.1;
extern int    Length1_Up2 = 4;  // first smoothing depth 
extern int    Phase1_Up2 = 100; // parameter of the first smoothing, 
       //ranging within -100 ... +100, it affects the quality 
       //of the averaging transient;  
extern int    Length2_Up2 = 4;  // second smoothing depth 
extern int    Phase2_Up2 = 100; // parameter of the second smoothing, 
       //ranging within -100 ... +100, it affects the quality 
       //of the averaging transient;  
extern int    IPC_Up2 = 0;/* Choosing prices to calculate 
the indicator on (0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 
6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 
11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 
14-Heiken Ashi Close.) */
extern int    STOPLOSS_Up2 = 50;  // StopLoss
extern int    TAKEPROFIT_Up2 = 100; // TakeProfit
extern bool   ClosePos_Up2 = true; // enable forcible closing the position
//----+ +-----------------------------------------------------------------------+
//---- EXPERT ADVISOR'S INPUTS FOR SELL TRADES 
extern bool   Test_Dn2 = true;//a filter for trades calculation direction
extern int    Timeframe_Dn2 = 60;
extern double Money_Management_Dn2 = 0.1;
extern int    Length1_Dn2 = 4;  // smoothing depth 
extern int    Phase1_Dn2 = 100;  // parameter of the first smoothing, 
       //ranging within -100 ... +100, it affects the quality 
       //of the averaging transient;  
extern int    Length2_Dn2 = 4;  // smoothing depth 
extern int    Phase2_Dn2 = 100; // parameter of the second smoothing, 
       //ranging within -100 ... +100, it affects the quality 
       //of the averaging transient;  
extern int    IPC_Dn2 = 0;/* Choosing prices to calculate 
the indicator on (0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 
6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 
11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 
14-Heiken Ashi Close.) */
extern int   STOPLOSS_Dn2 = 50;  // StopLoss
extern int   TAKEPROFIT_Dn2 = 100; // TakeProfit
extern bool   ClosePos_Dn2 = true; // enable forcible closing the position
//----+ +-----------------------------------------------------------------------+
//---- EXPERT ADVISOR'S INPUTS FOR BUY TRADES 
extern bool   Test_Up3 = true;//a filter for trades calculation direction
extern int    Timeframe_Up3 = 60;
extern double Money_Management_Up3 = 0.1;
extern int    Period_Up3 = 10;  // LSMA period
extern int    Length_Up3 = 4;  // smoothing depth 
extern int    Phase_Up3 = 100; // parameter of smoothing, 
       //ranging within -100 ... +100, it affects the quality 
       //of the averaging transient;  
extern int    IPC_Up3 = 0;/* Choosing prices to calculate 
the indicator on (0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 
6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 
11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 
14-Heiken Ashi Close.) */
extern int    STOPLOSS_Up3 = 50;  // StopLoss
extern int    TAKEPROFIT_Up3 = 100; // TakeProfit
extern bool   ClosePos_Up3 = true; // enable forcible closing the position
//----+ +-----------------------------------------------------------------------+
//---- EXPERT ADVISOR'S INPUTS FOR SELL TRADES 
extern bool   Test_Dn3 = true;//a filter for trades calculation direction
extern int    Timeframe_Dn3 = 60;
extern double Money_Management_Dn3 = 0.1;
extern int    Period_Dn3 = 10;  // LSMA period
extern int    Length_Dn3 = 4;  // smoothing depth 
extern int    Phase_Dn3 = 100;  // parameter smoothing, 
       //ranging within -100 ... +100, it affects the quality 
       //of the averaging transient;  
extern int    IPC_Dn3 = 0;/* Choosing prices to calculate 
the indicator on (0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 
6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 
11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 
14-Heiken Ashi Close.) */
extern int   STOPLOSS_Dn3 = 50;  // StopLoss
extern int   TAKEPROFIT_Dn3 = 100; // TakeProfit
extern bool   ClosePos_Dn3 = true; // enable forcible closing the position
//----+ +-----------------------------------------------------------------------+

//---- Integer variables for the minimum of estimated bars
int MinBar_Up1, MinBar_Up2, MinBar_Up3;
int MinBar_Dn1, MinBar_Dn2, MinBar_Dn3;
//+==================================================================+
//| Custom Expert functions                                          |
//+==================================================================+
#include <Lite_EXPERT_Champ.mqh>
//+==================================================================+
//| TimeframeCheck() functions                                       |
//+==================================================================+
void TimeframeCheck(string Name, int Timeframe)
  {
//----+
   //---- Checking the value of the 'Timeframe' variable for correctness
   if (Timeframe != 1)
    if (Timeframe != 5)
     if (Timeframe != 15)
      if (Timeframe != 30)
       if (Timeframe != 60)
        if (Timeframe != 240)
         if (Timeframe != 1440)
           Print(StringConcatenate("Parameter ",Name,
                     " cannot ", "be equal to ", Timeframe, "!!!"));    
//----+ 
  }
//+==================================================================+
//| Custom Expert initialization function                            |
//+==================================================================+
int init()
  {
//---- Checking the values of short-position timeframe variables for correctness
   TimeframeCheck("Timeframe_Up1", Timeframe_Up1);
   TimeframeCheck("Timeframe_Up2", Timeframe_Up2);
   TimeframeCheck("Timeframe_Up3", Timeframe_Up3);

//---- Checking the values of long-position timeframe variables for correctness 
   TimeframeCheck("Timeframe_Dn1", Timeframe_Dn1); 
   TimeframeCheck("Timeframe_Dn2", Timeframe_Dn2); 
   TimeframeCheck("Timeframe_Dn3", Timeframe_Dn3);
   
//---- Initialization of variables             
   MinBar_Up1 = 4 + 39 + 30;
   MinBar_Up2 = 4 + 30;
   MinBar_Up3 = 4 + Period_Up3 + 30;
   
   MinBar_Dn1 = 4 + 39 + 30;
   MinBar_Dn2 = 4 + 30;  
   MinBar_Dn3 = 4 + Period_Dn3 + 30;                                          
//---- initialization complete
   return(0);
  }
//+==================================================================+
//| expert deinitialization function                                 |
//+==================================================================+  
int deinit()
  {
//----+
   
    //---- Expert Advisor initialization complete
    return(0);
//----+ 
  }
//+==================================================================+
//| Custom Expert iteration function                                 |
//+==================================================================+
int start()
  {
   //----+ Declaration of local variables
   int    bar;
   double Mov[3], dMov12, dMov23;
   //----+ Declaration of static variables
   static int LastBars_Up1, LastBars_Dn1;
   static int LastBars_Up2, LastBars_Dn2;
   static int LastBars_Up3, LastBars_Dn3;
   
   static bool BUY_Sign1, BUY_Stop1, SELL_Sign1, SELL_Stop1;
   static bool BUY_Sign2, BUY_Stop2, SELL_Sign2, SELL_Stop2;
   static bool BUY_Sign3, BUY_Stop3, SELL_Sign3, SELL_Stop3;
   
   //+------------------------------------------------------------------------+
   
   //----++ CODE FOR LONG POSITIONS
   if (Test_Up1) 
    {
      int IBARS_Up1 = iBars(NULL, Timeframe_Up1);
      
      if (IBARS_Up1 >= MinBar_Up1)
       {
         if (LastBars_Up1 != IBARS_Up1)
          {
           //----+ Initialization of variables 
           BUY_Sign1 = false;
           BUY_Stop1 = false;
           LastBars_Up1 = IBARS_Up1; 
           
           //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS        
           for(bar = 1; bar <= 3; bar++)
                     Mov[bar - 1]=                  
                         iCustom(NULL, Timeframe_Up1, 
                                "JFatl", Length_Up1, Phase_Up1, 
                                                   0, IPC_Up1, 0, bar);
           
           //----+ DETERMINING SIGNALS FOR TRADES 
           dMov12 = Mov[0] - Mov[1];
           dMov23 = Mov[1] - Mov[2]; 
                                          
           if (dMov23 < 0)
              if (dMov12 > 0)
                        BUY_Sign1 = true;
                          
           if (dMov12 < 0)
                        BUY_Stop1 = true;                                           
          }
          //----+ MAKING TRADES
          if (!OpenBuyOrder_Ch(BUY_Sign1, 1, Money_Management_Up1, 
                                          STOPLOSS_Up1, TAKEPROFIT_Up1))
                                                                 return(-1);
          if (ClosePos_Up1)
                if (!CloseOrder_Ch(BUY_Stop1, 1))
                                        return(-1);
        }
     }
     
   //----++ CODE FOR SHORT POSITIONS
   if (Test_Dn1) 
    {
      int IBARS_Dn1 = iBars(NULL, Timeframe_Dn1);
      
      if (IBARS_Dn1 >= MinBar_Dn1)
       {
         if (LastBars_Dn1 != IBARS_Dn1)
          {
           //----+ Initialization of variables 
           SELL_Sign1 = false;
           SELL_Stop1 = false;
           LastBars_Dn1 = IBARS_Dn1; 
           
           //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS        
           for(bar = 1; bar <= 3; bar++)
                     Mov[bar - 1]=                  
                         iCustom(NULL, Timeframe_Dn1, 
                                "JFatl", Length_Dn1, Phase_Dn1, 
                                                   0, IPC_Dn1, 0, bar);
           
           //----+ DETERMINING SIGNALS FOR TRADES
           dMov12 = Mov[0] - Mov[1];
           dMov23 = Mov[1] - Mov[2]; 
                                           
           if (dMov23 > 0)
              if (dMov12 < 0)
                       SELL_Sign1 = true;
                          
           if (dMov12 > 0)
                       SELL_Stop1 = true;                                           
          }
          //----+ MAKING TRADES
          if (!OpenSellOrder_Ch(SELL_Sign1, 1, Money_Management_Dn1, 
                                            STOPLOSS_Dn1, TAKEPROFIT_Dn1))
                                                                   return(-1);
          if (ClosePos_Dn1)
                if (!CloseOrder_Ch(SELL_Stop1, 1))
                                          return(-1);
        }
     }
    //+------------------------------------------------------------------------+
    //----++ CODE FOR LONG POSITIONS
   if (Test_Up2) 
    {
      int IBARS_Up2 = iBars(NULL, Timeframe_Up2);
      
      if (IBARS_Up2 >= MinBar_Up2)
       {
         if (LastBars_Up2 != IBARS_Up2)
          {
           //----+ Initialization of variables 
           BUY_Sign2 = false;
           BUY_Stop2 = false;
           LastBars_Up2 = IBARS_Up2; 
           
           //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS        
           for(bar = 1; bar <= 3; bar++)
                     Mov[bar - 1]=                  
                         iCustom(NULL, Timeframe_Up2, 
                                "J2JMA", Length1_Up2, Length2_Up2,
                                             Phase1_Up2, Phase2_Up2,  
                                                  0, IPC_Up2, 0, bar);
           
           //----+ DETERMINING SIGNALS FOR TRADES 
           dMov12 = Mov[0] - Mov[1];
           dMov23 = Mov[1] - Mov[2]; 
                                          
           if (dMov23 < 0)
              if (dMov12 > 0)
                        BUY_Sign2 = true;
                          
           if (dMov12 < 0)
                        BUY_Stop2 = true;                                           
          }
          //----+ MAKING TRADES
          if (!OpenBuyOrder_Ch(BUY_Sign2, 2, Money_Management_Up2, 
                                          STOPLOSS_Up2, TAKEPROFIT_Up2))
                                                                 return(-1);
          if (ClosePos_Up2)
                if (!CloseOrder_Ch(BUY_Stop2, 2))
                                          return(-1);
        }
     }
     
   //----++ CODE FOR SHORT POSITIONS
   if (Test_Dn2) 
    {
      int IBARS_Dn2 = iBars(NULL, Timeframe_Dn2);
      
      if (IBARS_Dn2 >= MinBar_Dn2)
       {
         if (LastBars_Dn2 != IBARS_Dn2)
          {
           //----+ Initialization of variables 
           SELL_Sign2 = false;
           SELL_Stop2 = false;
           LastBars_Dn2 = IBARS_Dn2; 
           
           //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS        
           for(bar = 1; bar <= 3; bar++)
                     Mov[bar - 1]=                  
                         iCustom(NULL, Timeframe_Dn2, 
                                "J2JMA", Length1_Dn2, Length2_Dn2,
                                               Phase1_Dn2, Phase2_Dn2,  
                                                   0, IPC_Dn2, 0, bar);
           
           //----+ DETERMINING SIGNALS FOR TRADES
           dMov12 = Mov[0] - Mov[1];
           dMov23 = Mov[1] - Mov[2]; 
                                           
           if (dMov23 > 0)
              if (dMov12 < 0)
                       SELL_Sign2 = true;
                          
           if (dMov12 > 0)
                       SELL_Stop2 = true;                                           
          }
          //----+ MAKING TRADES
          if (!OpenSellOrder_Ch(SELL_Sign2, 2, Money_Management_Dn2, 
                                            STOPLOSS_Dn2, TAKEPROFIT_Dn2))
                                                                   return(-1);
          if (ClosePos_Dn2)
                if (!CloseOrder_Ch(SELL_Stop2, 2))
                                           return(-1);
        }
     }
    //+------------------------------------------------------------------------+
    //----++ CODE FOR LONG POSITIONS
   if (Test_Up3) 
    {
      int IBARS_Up3 = iBars(NULL, Timeframe_Up3);
      
      if (IBARS_Up3 >= MinBar_Up3)
       {
         if (LastBars_Up3 != IBARS_Up3)
          {
           //----+ Initialization of variables 
           BUY_Sign3 = false;
           BUY_Stop3 = false;
           LastBars_Up3 = IBARS_Up3; 
           
           //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS        
           for(bar = 1; bar <= 3; bar++)
                     Mov[bar - 1]=                  
                         iCustom(NULL, Timeframe_Up3, 
                              "JLSMA", Period_Up3, Length_Up3, Phase_Up3,  
                                                         0, IPC_Up3, 0, bar);
           
           //----+ DETERMINING SIGNALS FOR TRADES 
           dMov12 = Mov[0] - Mov[1];
           dMov23 = Mov[1] - Mov[2]; 
                                          
           if (dMov23 < 0)
              if (dMov12 > 0)
                        BUY_Sign3 = true;
                          
           if (dMov12 < 0)
                        BUY_Stop3 = true;                                           
          }
          //----+ MAKING TRADES
          if (!OpenBuyOrder_Ch(BUY_Sign3, 3, Money_Management_Up3, 
                                          STOPLOSS_Up3, TAKEPROFIT_Up3))
                                                                 return(-1);
          if (ClosePos_Up3)
                if (!CloseOrder_Ch(BUY_Stop3, 3))
                                          return(-1);
        }
     }
     
   //----++ CODE FOR SHORT POSITIONS
   if (Test_Dn3) 
    {
      int IBARS_Dn3 = iBars(NULL, Timeframe_Dn3);
      
      if (IBARS_Dn3 >= MinBar_Dn3)
       {
         if (LastBars_Dn3 != IBARS_Dn3)
          {
           //----+ Initialization of variables 
           SELL_Sign3 = false;
           SELL_Stop3 = false;
           LastBars_Dn3 = IBARS_Dn3; 
           
           //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS        
           for(bar = 1; bar <= 3; bar++)
                     Mov[bar - 1]=                  
                         iCustom(NULL, Timeframe_Dn3, 
                              "JLSMA", Period_Dn3, Length_Dn3, Phase_Dn3,  
                                                         0, IPC_Dn3, 0, bar);
                                                         
           //----+ DETERMINING SIGNALS FOR TRADES
           dMov12 = Mov[0] - Mov[1];
           dMov23 = Mov[1] - Mov[2]; 
                                           
           if (dMov23 > 0)
              if (dMov12 < 0)
                       SELL_Sign3 = true;
                          
           if (dMov12 > 0)
                       SELL_Stop3 = true;                                           
          }
          //----+ MAKING TRADES
          if (!OpenSellOrder_Ch(SELL_Sign3, 3, Money_Management_Dn3, 
                                            STOPLOSS_Dn3, TAKEPROFIT_Dn3))
                                                                   return(-1);
          if (ClosePos_Dn3)
                if (!CloseOrder_Ch(SELL_Stop3, 3))
                                          return(-1);
        }
     }
    //+------------------------------------------------------------------------+
//----+ 
    
    return(0);
  }
//+------------------------------------------------------------------+

Aqueles que querem ter um EA sem as limitações declaradas pelo Championship podem ir para Exp_16.mq4. Na verdade, podemos ver a diversificação de estratégias de trading entre três algoritmos diferindo umas das outras de certa forma. Geralmente, temos três estratégias de trading automatizadas absolutamente independentes em um Expert Advisor. Ao escrever o código, modifiquei os nomes das variáveis em cada ATS para evitar coincidências.

Para realizar trades, usei funções similares àquelas no arquivo Lite_EXPERT1.mqh, que são representadas pelo arquivo Lite_EXPERT_Champ.mqh. Essas funções exigiram modificações e correções mínimas em seus códigos para cumprir as exigências do Championship. Somente usar o código de tais funções nos códigos de outros EAs participantes é legal, uma vez que eles são apenas elementos executivos do EA que não tem nenhuma relação com seu preenchimento intelectual que, na verdade, controla esses elementos!

Então, não há necessidade especial para entrar em todos os detalhes dessas funções ou criar algo similar e ainda seu. Seria suficiente ler meus artigos anteriores nessa série para ser capaz de usá-los. No geral, o uso de tais funções na escrita de EAs é tão eficaz quando o uso de chips no desenvolvimento e fabricação de dispositivos eletrônicos.


Abaixo está uma breve descrição do que foi considerado na construção dessas funções.
1. Todas as funções para posições de abertura e localização de ordens pendentes detectam a quantidade de posições já abertas e localizam ordens pendentes e, se a quantidade passar de dois, não tome nenhuma atitude.

2. A distância mínima do preço de abertura de ordem, no qual as funções OpenBuyOrder_Ch(), OpenSellOrder_Ch(), OpenBuyLimitOrder_Ch(), OpenBuyStopOrder_Ch(), OpenSellLimitOrder_Ch() e OpenSellStopOrder_Ch() localizam TakeProfit é sempre maior do que aquela definida pelo Championship Rules como distância de scalping. A distância mínima de StopLoss é determinada pelas propriedades do símbolo negociado e é exigida do servidor. Isso também se refere a ordens pendentes. Entretanto, você deve considerar o fato de que as ordens pendentes às vezes são processadas em preços que se tornam piores do que os exigidos. Suas TakeProfits podem entrar na "faixa" de uma estratégia de scalping, nesse caso! Então, seria melhor ficar longe de estratégias de scalping. Senão, em um número significativo de gaps (que é bastante possível no final do ano), você pode descobrir que seu EA acabou tendo diretamente a definição de um estratégia de scalping!
Entretanto, seria instrutivo lembrar que, se TakeProfits são grande demais, o EA pode fazer bem menos trades, o que pode causar sua desqualificação também!

3. O tamanho menor e maior de uma posição a ser aberta, assim como o passo mínimo de modificações, determinadas pelo Championship Rules são escritos em todas essas funções com os valores das variáveis a serem inicializadas. Então, tais erros já foram evitados!

4. Antes de abrir uma posição, as funções OpenBuyOrder_Ch() e OpenSellOrder_Ch() verificam o tamanho dessa posição e verificam a própria posição para a presença de dinheiro suficiente no depósito para tal tamanho e reduzem a quantidade de lotes para valores aceitáveis. Então, ao trabalhar com essas funções, seu EA está seguro de erros como "volume de trade inválido", em qualquer caso. Infelizmente, é impossível corrigir o tamanho do lote nas ordens pendentes dessa maneira, uma vez que é impossível prever a quantidade de ativos livres no momento que a ordem pendente é acionada. Então um escritor de EA deve estar muito atento ao inicializar variáveis externas 'Money_Management' de funções OpenBuyLimitOrder_Ch(), OpenBuyStopOrder_Ch(), OpenSellLimitOrder_Ch() e OpenSellStopOrder_Ch(), especialmente por causa dos grandes valores de StopLosses.

5. Todas as funções para gerenciamento de posições fazem pausas corretas entre trades de acordo com os códigos de erros ocorrentes.

6. Antes de fechar uma posição ou deletar uma ordem pendente, ou mover as StopLosses, as funções CloseOrder_Ch(), CloseOrder_Ch() e Make_TreilingStop_Ch() verificam a posição para ver se estão congeladas, e se estiverem, elas não aceitam ações.

7. Antes de fechar uma posição, a função CloseOrder_Ch() verifica seu excedente líquido para que não seja como um scalping. Se a posição estiver dentro da faixa de scalping, ela não aceita ações.

8. A função Make_TreilingStop_Ch() não move a StopLoss para a faixa de preço dentro da qual o lucro da posição fechado por essa StopLoss pode entrar na "faixa de scalping".

Conclusão

Bem, isso é tudo que eu queria falar sobre comportamento exemplar de um EA no Automated Trading Championship. Claro, tem mais uma coisa, o problema real se refere ao consumo de luxo do EA dos recursos de CPU. Entretanto, na maioria dos casos, esse problemas geralmente depende de indicadores escritos de forma não eficaz que o EA solicita durante suas operações. E são outros quinhentos.

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

Arquivos anexados |
EXPERTS.zip (7.42 KB)
INCLUDE.zip (20.82 KB)
indicators.zip (7.85 KB)
TESTER.zip (4.49 KB)
Operações de arquivo agrupadas Operações de arquivo agrupadas
Às vezes é necessário realizar operações idênticas com um grupo de arquivos. Se você tem uma lista de arquivos incluída em um grupo, então isso não é problema. Entretanto, se você precisar fazer essa lista, então surge uma questão: "Como posso fazer isso?" O artigo propõe fazer isso usando funções FindFirstFile() e FindNextFile() incluídas no kernel32.dll.
Operações de arquivo via WinAPI Operações de arquivo via WinAPI
O ambiente do MQL4 é baseado no conceito seguro de "sandbox": ler e salvar arquivos usando a linguagem é permitido somente em algumas pastas pré-definidas Isso protege o usuário do MetaTrader 4 do perigo em potencial de danificar dados importantes no HDD. Entretanto, às vezes, é necessário deixar essa área segura. Esse artigo dedica-se ao problema de como fazer isso facilmente e de forma correta.
Passo a passo do HTML usando MQL4 Passo a passo do HTML usando MQL4
Hoje em dia, o HTML é um dos tipos de documentos amplamente disseminados. O terminal do cliente MetaTrader 4 permite que você salve declarações, testes e relatórios de otimização como arquivos .htm. Às vezes, é necessário conseguir as informações de tais arquivos em um programa MQL4. O artigo descreve uma das variações de como conseguir a estrutura de tag e os conteúdos de HTML.
Modificando os parâmetros externos dos programas MQL4 sem reiniciá-los Modificando os parâmetros externos dos programas MQL4 sem reiniciá-los
O artigo descreve um método para modificar os parâmetros externos de programas MQL4 enquanto estão em funcionamento, sem reiniciá-los.