Проблема с автоматической валидацией советника

 

не проходит автоматическая валидация выдает такую ошибку

test on EURUSD,H1 (netting)
 2016.04.13 18:00:00   failed instant buy 5.00 EURUSD at 1.12844 [Volume limit reached]
 2016.04.13 18:00:00   failed instant buy 5.00 EURUSD at 1.12845 [Volume limit reached]
 2016.04.13 18:00:00   failed instant buy 5.00 EURUSD at 1.12844 [Volume limit reached]
 2016.04.13 18:00:00   failed instant buy 5.00 EURUSD at 1.12845 [Volume limit reached]
 2016.04.13 18:00:00   failed instant buy 5.00 EURUSD at 1.12844 [Volume limit reached]
 2016.04.13 18:00:01   failed instant buy 5.00 EURUSD at 1.12845 [Volume limit reached]
 2016.04.13 18:00:01   failed instant buy 5.00 EURUSD at 1.12844 [Volume limit reached]
 2016.04.13 18:00:01   failed instant buy 5.00 EURUSD at 1.12845 [Volume limit reached]
 2016.04.13 18:00:01   failed instant buy 5.00 EURUSD at 1.12844 [Volume limit reached]
 2016.04.13 18:00:01   failed instant buy 5.00 EURUSD at 1.12845 [Volume limit reached]
 2016.04.13 18:00:02   failed instant buy 5.00 EURUSD at 1.12844 [Volume limit reached]
 2016.04.13 18:00:02   failed instant buy 5.00 EURUSD at 1.12845 [Volume limit reached]
 2016.04.13 18:00:02   failed instant buy 5.00 EURUSD at 1.12844 [Volume limit reached]
 2016.04.13 18:00:02   failed instant buy 5.00 EURUSD at 1.12845 [Volume limit reached]
 2016.04.13 18:00:03   failed instant buy 5.00 EURUSD at 1.12844 [Volume limit reached]
 2016.04.13 18:00:03   failed instant buy 5.00 EURUSD at 1.12845 [Volume limit reached]
 2016.04.13 18:00:03   failed instant buy 5.00 EURUSD at 1.12844 [Volume limit reached]
 2016.04.13 18:00:03   failed instant buy 5.00 EURUSD at 1.12846 [Volume limit reached]
 2016.04.13 18:00:03   failed instant buy 5.00 EURUSD at 1.12845 [Volume limit reached]
 2016.04.13 18:00:04   failed instant buy 5.00 EURUSD at 1.12846 [Volume limit reached]
 2016.04.13 18:00:04   failed instant buy 5.00 EURUSD at 1.12845 [Volume limit reached]
strategy tester report 63 total trades

Перед открытием вставил такую проверку все равно не проходит, подскажите как побороть данную проблему

   double max_volume=SymbolInfoDouble(symbol,SYMBOL_VOLUME_LIMIT);
   if(max_volume!=0.0 && max_volume-m_lot_open<=0)return(false);
 

Статью Какие проверки должен пройти торговый робот перед публикацией в Маркете читали?

И что именно Вы в своём коде подсчитываете? Только позиции?

 
Vladimir Karputov:

Статью Какие проверки должен пройти торговый робот перед публикацией в Маркете читали?

И что именно Вы в своём коде подсчитываете? Только позиции?

да читал, так как отложки не используются, подсчет только открытых

 
Sergey Gritsay:

да читал, так как отложки не используются, подсчет только открытых

А SYMBOL_VOLUME_MAX проверяете?

 
Vladimir Karputov:

А SYMBOL_VOLUME_MAX проверяете?

да, он у меня рассчитан в другом блоке

double CStrategy::NormalizeVolume(const string symbol,const double lot)
  {
   double value=lot;
   double MinLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double MaxLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double volume_step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   int volume_digits=(int)(MathLog(1.0/volume_step)/MathLog(10.0));

   if(value<MinLot)value=MinLot;
   if(value>MaxLot)value=MaxLot;

   return(NormalizeDouble(value,volume_digits));
  }

вот полный блок открытия 

bool CStrategy::OrderOpen(const string symbol,const int type,const double volume)
  {
   if(!MQLInfoInteger(MQL_TESTER))if(!disabled(symbol))return(false);
   if(!IsNewOrderAllowed())return(false);
   double max_volume=SymbolInfoDouble(symbol,SYMBOL_VOLUME_LIMIT);
   if(max_volume!=0.0 && max_volume-m_lot_open<=0)return(false);
   Print("max_volume = ",max_volume,": m_lot_open = ",m_lot_open,": max_volume-m_lot_open = ",max_volume-m_lot_open);
   if(type==WRONG_VALUE)return(false);
   if(MaxOpenOrdersBuy!=0 && type==OP_BUY && m_total_order2>=MaxOpenOrdersBuy)return(false);
   if(MaxOpenOrdersSell!=0 && type==OP_SELL && m_total_order2>=MaxOpenOrdersSell)return(false);

   double price_open=0.0;
   double lot;
   int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   double bid=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_BID),digits);
   double ask=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_ASK),digits);
   lot=NormalizeVolume(symbol,volume);
   if(m_deposit_load>=Deposit_Load)
     {
      m_print_rezult="Deposit loading exceeded";
      return(false);
     }

   price_open=(type==OP_BUY)?ask:bid;

   if(AccountInfo.FreeMarginCheck(symbol,(ENUM_ORDER_TYPE)type,lot,price_open)<=0.0)
     {
      if(MinLots==ON)lot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
      if(AccountInfo.FreeMarginCheck(symbol,(ENUM_ORDER_TYPE)type,lot,price_open)<=0.0)
        {
         m_print_rezult="not enough money";
         return(false);
        }
     }
   if(NormalizeDouble(NormalizePrice(symbol,price_open),digits)!=price_open)return(false);

   ResetLastError();
   if(type==OP_BUY)trade.Buy(lot,symbol,0,0,0,m_comment);
   else trade.Sell(lot,symbol,0,0,0,m_comment);

   if(trade.ResultRetcode()==TRADE_RETCODE_DONE)
     {
      StringConcatenate(m_print_rezult,"open deal #",trade.ResultDeal()," ",StrToType(type)," ",DoubleToString(lot,2)," ",symbol," ",TimeframeToString(m_time_frames));
      Print(m_print_rezult);
      return(true);
     }
   else
     {
      StringConcatenate(m_print_rezult,"error open deal ",StrToType(type)," ",DoubleToString(lot,2)," ",symbol," ",TimeframeToString(m_time_frames),": ",GetLastError());
      Print(m_print_rezult);
      return(false);
     }
   return(false);
  }
 
Кто такой "m_lot_open"?
 
Vladimir Karputov:
Кто такой "m_lot_open"?

это общий объем открытых позиций по инструменту

 
Sergey Gritsay:

это общий объем открытых позиций по инструменту

Где это видно?

 
Vladimir Karputov:

Где это видно?

void  CStrategy::OredrsInfo(void)
  {
   m_total_order=0;
   m_total_order2=0;
   m_lot_open=0;
   m_lot_open2=0;
   m_profit=0;
   m_profit2=0;
   m_open_prace=0;
   m_swap=0;

   int total=PositionsTotal();

   for(int i=0; i<total; i++)
     {
      if(!Position.SelectByIndex(i))continue;
      if(Position.Magic()!=m_magic)continue;
      if(Position.Symbol()!=m_symbol)continue;
      if(TypeOpenPosition==BUY_AND_SELL)
        {
         m_total_order++;
         m_profit+=Position.Profit()+Position.Commission()+Position.Swap();
         m_lot_open+=Position.Volume();
         m_swap+=Position.Swap();
         if(Position.PositionType()==m_type)
           {
            m_total_order2++;
            m_open_prace=Position.PriceOpen();
            m_lot_open2+=Position.Volume();
            m_profit2+=Position.Profit()+Position.Commission()+Position.Swap();
            m_swap+=Position.Swap();
           }
        }
      else
        {
         if(Position.PositionType()==m_type)
           {
            m_total_order++;
            m_total_order2++;
            m_open_prace=Position.PriceOpen();
            m_lot_open+=Position.Volume();
            m_profit+=Position.Profit()+Position.Commission()+Position.Swap();
            m_swap+=Position.Swap();
           }
        }
     }

  }
 
Sergey Gritsay:

Тю, а что же Вы magic используете? Или если два magica Открыли две позиции по EURUSD Вы будете считать только одну позицию?

 
Vladimir Karputov:

Тю, а что же Вы magic используете? Или если два magica Открыли две позиции по EURUSD Вы будете считать только одну позицию?

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

Причина обращения: