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

 
Vladimir Karputov:

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

Все по моему понял в чем косяк, у меня же подсчет тоже разделен еще и по типу позиции, сейчас переделаю, если не прокатит то отпишусь

 

не помогло, вставил отдельную функцию подсчета

void  CStrategy::OpenVolume(void)
  {
   m_lot_open_symbol=0;

   int total=PositionsTotal();

   for(int i=0; i<total; i++)
     {
      if(!Position.SelectByIndex(i))continue;
      if(Position.Symbol()!=m_symbol)continue;
      m_lot_open_symbol+=Position.Volume();
     }

  }
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);
   OpenVolume();
   if(max_volume!=0.0 && max_volume-m_lot_open_symbol<=0)return(false);
   Print("max_volume = ",max_volume,": m_lot_open = ",m_lot_open_symbol,": max_volume-m_lot_open = ",max_volume-m_lot_open_symbol);
   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);
  }
 
все заработало прописал так 
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);
   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 lot=NormalizeVolume(symbol,volume);
   if(m_deposit_load>=Deposit_Load)
     {
      m_print_rezult="Deposit loading exceeded";
      return(false);
     }
   int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   double bid=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_BID),digits);
   double ask=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_ASK),digits);
   double 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);
        }
     }

   OpenVolume();
   double max_volume=SymbolInfoDouble(symbol,SYMBOL_VOLUME_LIMIT);
   if(max_volume!=0.0 && lot>max_volume-m_lot_open_symbol)return(false);
   Print("max_volume = ",max_volume,": m_lot_open = ",m_lot_open_symbol,": max_volume-m_lot_open = ",max_volume-m_lot_open_symbol);

   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);
  }
 

Здравствуйте. Во время обновления советника в маркете автоматическая валидация завершается с ошибками

отчет

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

Изучив обстановку в маркете, пришел к выводу - такая ошибка возникает у меня одного. Может меня забанили за очень частую попытку пройти процедуру автоматической валидации?

 
Denis Nikolaev:

Здравствуйте. Во время обновления советника в маркете автоматическая валидация завершается с ошибками

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

Изучив обстановку в маркете, пришел к выводу - такая ошибка возникает у меня одного. Может меня забанили за очень частую попытку пройти процедуру автоматической валидации?

Вы еще на форуме гляньте, увидите - Вы не одиноки ).

 
Denis Nikolaev:

Здравствуйте. Во время обновления советника в маркете автоматическая валидация завершается с ошибками

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

Изучив обстановку в маркете, пришел к выводу - такая ошибка возникает у меня одного. Может меня забанили за очень частую попытку пройти процедуру автоматической валидации?

Могу лишь предположить, что валидатор проверяет работу с различными вариантами минимальных лотов, 0.1, 0.01, 0.001.

Первый вариант минимальный лот 0.1: Возможно ваш советник в расчетах должен открыть 0.01, проходит проверку на возможность открытия лота, и не открывает, т.к. 0.01<0.1.

Второй вариант минимальный лот 0.001: Валидатор, возможно, задает депозит 10 долларов и минимальный лот 0.001, и тоже ждет открытых позиций, а у вас лот 0.01 не проходит проверку из-за высокой маржи, и в итоге опять нет открытых позиций.

Во всех случаях нужно оповестить пользователя в журнал о том, что минимальный лот счета 0.1 больше заданного, и во втором случае оповестить о том, что не хватает маржи на открытие лота.

Советую найти счета со всеми видами минимальных лотов, и провести тестирование.


P.S. В предыдущий раз значит были другие котировки и ваш советник смог открыть на тех котировках какую то минимальную позицию при минимальном тестируемом депозите, сейчас же позиции не открывает и в журнал ничего не пишет.

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Sergey Rozhnov:

Могу лишь предположить, что валидатор проверяет работу с различными вариантами минимальных лотов, 0.1, 0.01, 0.001.

Первый вариант минимальный лот 0.1: Возможно ваш советник в расчетах должен открыть 0.01, проходит проверку на возможность открытия лота, и не открывает, т.к. 0.01<0.1.

Второй вариант минимальный лот 0.001: Валидатор, возможно, задает депозит 10 долларов и минимальный лот 0.001, и тоже ждет открытых позиций, а у вас лот 0.01 не проходит проверку из-за высокой маржи, и в итоге опять нет открытых позиций.

Во всех случаях нужно оповестить пользователя в журнал о том, что минимальный лот счета 0.1 больше заданного, и во втором случае оповестить о том, что не хватает маржи на открытие лота.

Советую найти счета со всеми видами минимальных лотов, и провести тестирование.


P.S. В предыдущий раз значит были другие котировки и ваш советник смог открыть на тех котировках какую то минимальную позицию при минимальном тестируемом депозите, сейчас же позиции не открывает и в журнал ничего не пишет.

Спасибо за ответ, попробую

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