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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Nikita Chernyshov
1713
Nikita Chernyshov  

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


Отчет тестирования версии 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);
  }
Evgeniy Zhdan
16796
Evgeniy Zhdan  
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)

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

Nikita Chernyshov
1713
Nikita Chernyshov  
Evgeniy Zhdan:

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

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

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


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

Evgeniy Zhdan
16796
Evgeniy Zhdan  
Nikita Chernyshov:

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


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

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

Nikita Chernyshov
1713
Nikita Chernyshov  
Evgeniy Zhdan:

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

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

Evgeniy Zhdan
16796
Evgeniy Zhdan  
Nikita Chernyshov:

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

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

Evgeniy Zhdan
16796
Evgeniy Zhdan  

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

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);
  }
Nikita Chernyshov
1713
Nikita Chernyshov  
Evgeniy Zhdan:

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

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

Nikita Chernyshov
1713
Nikita Chernyshov  
Evgeniy Zhdan:

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

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

Evgeniy Zhdan
16796
Evgeniy Zhdan  
Nikita Chernyshov:

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

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

Alexey Viktorov
27938
Alexey Viktorov  
Nikita Chernyshov:

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


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

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

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий