Автоматическая валидация сводит с ума

 

Всем привет, кто-нибудь, пожалуйста, объясните, почему данный код проходит валидацию с ошибками:


Отчет тестирования версии 1.0

Состояние тестирования: Тестирование завершилось с ошибками

  • Количество ошибок1
  • Запущен2018.12.03 11:14:37
  • Завершено2018.12.03 11:17:48
  • ТипЭксперт
test on EURUSD,H1
there are no trading operations
test on NZDUSD,H1
there are no trading operations
test on GBPUSDcheck,M30
there are no trading operations
test on XAUUSDcheck,Daily
there are no trading operations

Логически-торговая составляющая - не суть.

extern int take = 2000;
extern int stop = 2000;
extern int magic = 323445;
extern int slip = 100;
extern double lot = 0.01;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OrderCount(OP_BUYSTOP) == 0 && OrderCount(OP_BUY) == 0)
     {
      if(CheckMoneyForTrade(Symbol(),OP_BUY) == true && CheckVolumeValue() == true)
        {
         if(OrderSend(Symbol(),OP_BUY,lot,Ask,slip,Ask-stop*Point,Ask+take*Point,
         "",magic,0,Blue))
         Print("bu");
        }
     }
   if(OrderCount(OP_SELLSTOP) == 0 && OrderCount(OP_SELL) == 0)
     {
      if(CheckMoneyForTrade(Symbol(),OP_SELL) == true && CheckVolumeValue() == true)
        {
         if(OrderSend(Symbol(),OP_SELL,lot,Bid,slip,Bid+stop*Point,Bid-take*Point,
         "",magic,0,Red))
         Print("se");
        }
     }



  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
// Счетчик ордеров
//+------------------------------------------------------------------+
int OrderCount(int type)
{
  int count = 0;
  for (int trade = OrdersTotal() -1; trade >=0; trade--)
  {
    if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
    {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic && OrderType() == type)
      count++;
    }
  }
  return(count);
}
bool CheckMoneyForTrade(string symb,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,type,lot);
   //-- если денег не хватает
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lot, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- проверка прошла успешно
   return(true);
  }
  
//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue()
  {
   string description;
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(lot<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(lot>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(lot/volume_step);
   if(MathAbs(ratio*volume_step-lot)>0.0000001)
     {
      description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }
 
Nikita Chernyshov:

Всем привет, кто-нибудь, пожалуйста, объясните, почему данный код проходит валидацию с ошибками:


Отчет тестирования версии 1.0

Состояние тестирования: Тестирование завершилось с ошибками

  • Количество ошибок1
  • Запущен2018.12.03 11:14:37
  • Завершено2018.12.03 11:17:48
  • ТипЭксперт

Логически-торговая составляющая - не суть.

Попробуйте без этих вот

if(CheckMoneyForTrade(Symbol(),OP_SELL) == true && CheckVolumeValue() == true)

пройти валидацию. Если ордера начнут ставится, значит в какая-то из этих функций не пропускает

 
Evgeniy Zhdan:

Попробуйте без этих вот

пройти валидацию. Если ордера начнут ставится, значит в какая-то из этих функций не пропускает

Спасибо за отлик, но без функции CheckVolumeValue() (которая взята с инструкции), он выдает такую ошибку при валидации:


Как может быть лот неправильным? Всю жизнь так проставлял и все в поряде. Пробовал вместо переменной прям прописать 0.01, тоже самое.

 
Nikita Chernyshov:

Спасибо за отлик, но без функции CheckVolumeValue() (которая взята с инструкции), он выдает такую ошибку при валидации:


Как может быть лот неправильным? Всю жизнь так проставлял и все в поряде. Пробовал вместо переменной прям прописать 0.01, тоже самое.

Ну значит попытки установки ордеров есть. Какая-то из этих функций у Вас всегда возвращает false вот и нет ордеров. Выделите какая не работает (добавьте к тесту одну из них) и ее исправьте.

 
Evgeniy Zhdan:

Ну значит попытки установки ордеров есть. Какая-то из этих функций у Вас всегда возвращает false вот и нет ордеров. Выделите какая не работает (добавьте к тесту одну из них) и ее исправьте.

Извините, вы про какие функции?

 
Nikita Chernyshov:

Извините, вы про какие функции?

эта или эта CheckMoneyForTrade(Symbol(),OP_SELL) == true && CheckVolumeValue() 

 

вот так попробуйте вставить

bool CheckVolumeValue()
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(lot<min_volume) return(false);

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(lot>max_volume) return(false);

   return(true);
  }
 
Evgeniy Zhdan:

эта или эта CheckMoneyForTrade(Symbol(),OP_SELL) == true && CheckVolumeValue() 

Обе true и в тестере сделки открываются..

 
Evgeniy Zhdan:

вот так попробуйте вставить

Изменил, в тестере сделки есть, валидацию не прошел по той же причине.

 
Nikita Chernyshov:

Обе true и в тестере сделки открываются..

Тогда что Вы от меня хотите? Вы посылаете на вход не правильный объем

 
Nikita Chernyshov:

Спасибо за отлик, но без функции CheckVolumeValue() (которая взята с инструкции), он выдает такую ошибку при валидации:


Как может быть лот неправильным? Всю жизнь так проставлял и все в поряде. Пробовал вместо переменной прям прописать 0.01, тоже самое.

Сможете ответить на вопрос: "Что такое защита от дурака?", тогда может быть сможете победить эту проблему.

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