Контроль. Можно торговать?

 

Написал вот такую ф-цию под МТ4 (легко переделать под МТ5)   которая контролирует состояние готовности советника торговать. Интересует мнение бывалых о возможных подводных камнях или .....

Ф-ция вызывается в самом начале советника и если получает false то тогда return.

void OnTick()
{
   if(!ChecAllowTrade() ) return;
   
   // more ........
}


bool ChecAllowTrade()
{
   if(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION) ) return(true);
   
   int It = 0;
   bool RfrshON = false;
   int TryWait = 500;
   
   
   //------------ Message
   long SyTrMode2 = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_MODE);
   
   static datetime CheckSecMem=0;
   
   //if(CheckSecMem < TimeCurrent() - 10)
   if(SyTrMode2 != SYMBOL_TRADE_MODE_FULL && SyTrMode2 != SYMBOL_TRADE_MODE_DISABLED && CheckSecMem < TimeCurrent() - 10)
   {
      CheckSecMem = TimeCurrent();
   
      string TxtTrMode2="<";

      if(SyTrMode2 == SYMBOL_TRADE_MODE_LONGONLY)   TxtTrMode2 = "SYMBOL_TRADE_MODE_LONGONLY";
      if(SyTrMode2 == SYMBOL_TRADE_MODE_SHORTONLY)  TxtTrMode2 = "SYMBOL_TRADE_MODE_SHORTONLY";
      if(SyTrMode2 == SYMBOL_TRADE_MODE_CLOSEONLY)  TxtTrMode2 = "SYMBOL_TRADE_MODE_CLOSEONLY";      
      
      Print(">> SymbolInfoInteger(_Symbol, SYMBOL_TRADE_MODE)= ", SyTrMode2, "   ", TxtTrMode2);
   } 
   
   
   while(
      !TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) || !MQLInfoInteger(MQL_TRADE_ALLOWED) ||
      !TerminalInfoInteger(TERMINAL_CONNECTED)     || !AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) ||
      !AccountInfoInteger(ACCOUNT_TRADE_EXPERT)    || 
      SymbolInfoInteger(_Symbol, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_DISABLED )
   {

      if(It == 0)
      {
         string TxtTrMode="";
         
         long SyTrMode = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_MODE);
         
         if(SyTrMode == SYMBOL_TRADE_MODE_DISABLED)   TxtTrMode = "SYMBOL_TRADE_MODE_DISABLED";
         if(SyTrMode == SYMBOL_TRADE_MODE_LONGONLY)   TxtTrMode = "SYMBOL_TRADE_MODE_LONGONLY";
         if(SyTrMode == SYMBOL_TRADE_MODE_SHORTONLY)  TxtTrMode = "SYMBOL_TRADE_MODE_SHORTONLY";
         if(SyTrMode == SYMBOL_TRADE_MODE_CLOSEONLY)  TxtTrMode = "SYMBOL_TRADE_MODE_CLOSEONLY";
         if(SyTrMode == SYMBOL_TRADE_MODE_FULL)       TxtTrMode = "SYMBOL_TRADE_MODE_FULL";
         
      
         Print("! Disallow trade. Causes:");
         Print("SymbolInfoInteger(_Symbol, SYMBOL_TRADE_MODE)= ", SyTrMode, "   ", TxtTrMode);
         Print("TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)= ", TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) );
         Print("MQLInfoInteger(MQL_TRADE_ALLOWED)= ", MQLInfoInteger(MQL_TRADE_ALLOWED) );
         Print("TerminalInfoInteger(TERMINAL_CONNECTED)= ", TerminalInfoInteger(TERMINAL_CONNECTED) );
         Print("AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)= ", AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) );
         Print("AccountInfoInteger(ACCOUNT_TRADE_EXPERT)= ", AccountInfoInteger(ACCOUNT_TRADE_EXPERT) );  
      }      



      RfrshON = true; // it is necessary to update market information
      
      It++;
      if(It >= TryWait)
      {
         Print("! Disallow trade after waiting 5 seconds");
         return(false); 
      }
      
      Sleep(10);   
   }//  while(
   
   
   if(It > 0)
   {
      Print("! Ok. Allow trade ");
   }
   

   if(RfrshON == true)
   {
      RefreshRates(); // обновляем данные рынка после паузы
   }   
   
   return(true);
}  
 

Идея этой ф-ции определить, а надо ли вообще советнику делать что либо - вызывать индикаторы, искать патерны, что-то считать...

Конечно перед открытием ордера (модификации, удаления и т.д.) , надо дополнительно проверять разрешение на торговлю, свободный поток и т.д.