Автоматический валидатор - проблемы

 

Пытаюсь обновить версию советника и получаю ошибку.

Тот же советник в тестере стратегий.


Паралельно пишу советники и для MT4, там все ОК. Код у советников для 4 и 5 одинаковый, отличаются только include файлом (они разные для 4 и 5).

Последний раз данный советник обновлял в январе - было все ОК.

Версия программы - MetaTrader 5 x64 build 2025 started (MetaQuotes Software Corp.)

- Terminal Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron  N2815 @ 1.86GHz, Memory: 1866 / 3967 Mb, Disk: 5 / 35 Gb, GMT+3

 
 
Uladzimir Kirychenka:

Пытаюсь обновить версию советника и получаю ошибку.

Тот же советник в тестере стратегий.


Паралельно пишу советники и для MT4, там все ОК. Код у советников для 4 и 5 одинаковый, отличаются только include файлом (они разные для 4 и 5).

Последний раз данный советник обновлял в январе - было все ОК.

Версия программы - MetaTrader 5 x64 build 2025 started (MetaQuotes Software Corp.)

- Terminal Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron  N2815 @ 1.86GHz, Memory: 1866 / 3967 Mb, Disk: 5 / 35 Gb, GMT+3

Притворись идиотом и поставьте депозит 1$ или лот 100500 и проверьте будут-ли торговые операции. И будут-ли при этом оповещения что только идиот может поставить такие параметры.

 
Alexey Viktorov:

Притворись идиотом и поставьте депозит 1$ или лот 100500 и проверьте будут-ли торговые операции. И будут-ли при этом оповещения что только идиот может поставить такие параметры.

Такая же проблема. Пробовал - не помогает ). С 13 апреля не могу обновиться. Если делать с проверкой всего и вся - выходит одна надпись по всем символам "trehe are no trading operations". Без проверок вылетает ошибка - не достаточно средств для открытия позиции. А версия для МТ4, так же как и у автора ТС обновилась без проблем.

123

По рисунку видно минимальный лот - 2000, баланс- 10000, явно не хватает открыться, хоть ставь проверку что денег не хватает, хоть не ставь. Все равно проверку не проходит.

И что делать в таких случаях?

 

Конечно сделок не будет. А какие должны быть оповещения? У меня только в OnInit если размер лота не входит в диапазон SYMBOL_VOLUME_MIN и SYMBOL_VOLUME_MAX, тогда ошибка инициализации INIT_PARAMETERS_INCORRECT

 
Uladzimir Kirychenka:

Конечно сделок не будет. А какие должны быть оповещения? У меня только в OnInit если размер лота не входит в диапазон SYMBOL_VOLUME_MIN и SYMBOL_VOLUME_MAX, тогда ошибка инициализации INIT_PARAMETERS_INCORRECT

Помню, у меня примерно так же было тогда еще модераторы проверяли после авто. проверки. В случае некорректных параметров тоже самое OnInit завершал с кодом INIT_PARAMETERS_INCORRECT. И авто. проверка выдавала такую же ошибку, что нет торговых операции. Так вот, тогда модератор мне посоветовал, не завершать OnInit() с этим кодом, а просто выдать Alert.

 

Наверно раз в месяц, кто-то поднимает этот вопрос. Уже который раз.

Все дело в том, что при торговле ( в реале) не только размер баланса может меняться, но и размер лота.

И во время тестирования размер депозита (от 1 до 10000000) или лота(от 1000000 до 0.01)  могут меняться.

И поэтому эти проверки надо делать не один раз в OnInit, а постоянно, в цикле (например в OnTick).

И чтобы не было переполнение журнала, надо предупреждение (Print Message или Alert) выводить только один раз.

 
Uladzimir Kirychenka:

Конечно сделок не будет. А какие должны быть оповещения? У меня только в OnInit если размер лота не входит в диапазон SYMBOL_VOLUME_MIN и SYMBOL_VOLUME_MAX, тогда ошибка инициализации INIT_PARAMETERS_INCORRECT

Я понимаю что очень сложно притвориться идиотом, но это умение иногда помогает. Попробуйте ещё раз. Вы поставили советник, на счёте 1$, поставили лот 100500 и ждёте ... Ждёте день, второй, третий... потом начинаете негодовать, "За что-же я заплатил. Почему не работает эта хрень?" и никто ничего не сообщает, никто не хочет сказать типа "Ты идиот... С таким депозитом нельзя работать на рынке форекс. Только идиот может поставить лот 100500"... Вот как-то так.

 
Petros Shatakhtsyan:

Наверно раз в месяц, кто-то поднимает этот вопрос. Уже который раз.

Все дело в том, что при торговле ( в реале) не только размер баланса может меняться, но и размер лота.

И во время тестирования размер депозита (от 1 до 10000000) или лота(от 1000000 до 0.01)  могут меняться.

И поэтому эти проверки надо делать не один раз в OnInit, а постоянно, в цикле (например в OnTick).

И чтобы не было переполнение журнала, надо предупреждение (Print Message или Alert) выводить только один раз.

Предельно простой код - и тот не может пройти валидацию. Вроде, перечисленным Вами условиям удовлетворяет.

void OnTick()
  {
   ENUM_POSITION_TYPE PosType=POSITION_TYPE_SELL;
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult check;
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check);
   long digit;
   double point,Bid;
   SymbolInfoDouble(_Symbol,SYMBOL_BID,Bid);
   request.type   = ORDER_TYPE_SELL;
   request.price  = Bid;
   request.action = TRADE_ACTION_DEAL;
   request.symbol = _Symbol;
   request.volume = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   request.sl=0;
   request.tp=0;
   request.deviation=10;
   request.magic=55555;
   request.comment=NULL;
   request.type_filling=0;
   if(PositionsTotal()==0
   &&CheckMoneyForTrade(_Symbol,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),ORDER_TYPE_SELL)==true
   ){
   OrderSend(request,result);
   }else{
      ExtExpert.Deinit();
      return;
   }
  }
  bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }
с проверкой на деньги выдает - there are no trading operations, без проверки - not enough money
 
Petros Shatakhtsyan:

Наверно раз в месяц, кто-то поднимает этот вопрос. Уже который раз.

Все дело в том, что при торговле ( в реале) не только размер баланса может меняться, но и размер лота.

И во время тестирования размер депозита (от 1 до 10000000) или лота(от 1000000 до 0.01)  могут меняться.

И поэтому эти проверки надо делать не один раз в OnInit, а постоянно, в цикле (например в OnTick).

И чтобы не было переполнение журнала, надо предупреждение (Print Message или Alert) выводить только один раз.

Данные проверки (LotMin, LotMax, LotNormalizeStep, check balance, OrderCheck) осуществляются каждый раз при открытий позиций. А в OnInit проверка только лота. Логику проверки баланса в OnInit не представляю. 

PS: Alert не спасает от ошибок Валидатора ((((((((((

 
Uladzimir Kirychenka:

Данные проверки (LotMin, LotMax, LotNormalizeStep, check balance, OrderCheck) осуществляются каждый раз при открытий позиций. А в OnInit проверка только лота. Логику проверки баланса в OnInit не представляю. 

PS: Alert не спасает от ошибок Валидатора ((((((((((

У Валидатора нет ошибок :)

Валидатор как-раз показывает, что в предоставленном коде

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

 
Vladimir Karputov:

У Валидатора нет ошибок :)

Валидатор как-раз показывает, что в предоставленном коде

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

))

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