Про валидатор. Ошибка нет операций, хотя они есть и много - страница 4

 

В OnInit() есть принудительное завершение работы советника c кодом возврата INIT_FAILED или INIT_PARAMETERS_INCORRECT при передачи ему неверных параметров?

У меня была такая ошибка в валидаторе из за того, что в OnInit() стояла проверка на ввод неверных параметров  и осуществлялся возврат с кодом  INIT_PARAMETERS_INCORRECT. Советник в результате этого на проходил автомодерацию. Убрав возврат и путем шаманских действий и привидения неверных параметров к верным, удалось пройти валидатор.

...

Кстати, заметил неприятную вещь. Если использовать входной параметр типа uint, что бы нельзя было задать отрицательное значение input переменной. Однако это не работает каким то образом отрицательное число неявно преобразуется в положительное и в результате параметр получает неадекватное значение. Теперь не использую в Input тип uint так как не известно что придет в голову конечному пользователю. И проверку параметра на отрицательное число делаю уже в OnInit()

 

Всё, ребята. Лот победил. Первый раз такой гемор вокруг лота. Это кошмар какой-то.

   if(IsNewOrderAllowed() && (CountTrades(OP_BUY,MagicFirst)==0 ||CountTrades(OP_SELL,MagicFirst)==0))
     {
     double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
     double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
     
     if(Lot<min_volume) Lot=min_volume;
     if(Lot>max_volume) Lot=max_volume;

      double bid = MarketInfo(Symbol(),MODE_BID);
      double priceB = bid-distance*_Point;
      double priceS = bid+distance*_Point;
      Lot=NormalizeDouble(Lot,2);
      if(CheckVolumeValue(Lot) && CountTrades(OP_BUYLIMIT,MagicFirst)==0 && CountTrades(OP_BUY,MagicFirst)==0) OrderSend(Symbol(),OP_BUYLIMIT,Lot,NormalizeDouble(priceB,_Digits),30,0,0,"",MagicFirst,0,clrLimeGreen);
      if(CheckVolumeValue(Lot) && CountTrades(OP_SELLLIMIT,MagicFirst)==0 && CountTrades(OP_SELL,MagicFirst)==0) OrderSend(Symbol(),OP_SELLLIMIT,Lot,NormalizeDouble(priceS,_Digits),30,0,0,"",MagicFirst,0,clrRoyalBlue);
     }
 
Evgeniy Zhdan:

Всё, ребята. Лот победил. Первый раз такой гемор вокруг лота. Это кошмар какой-то.

хе-хе :)
У меня была подобная заварушка.

Надо было всего-то: после возврата неверного объема ордера выдать сообщение трейдеру, что он тупанул.

Примерно:

 
if(Lot<min_volume)
     {
      Print("Lot  "+Lot+" very small. Minimum lot for trade = "+min_volume);// запись в журнал
      Comment("Lot  " +Lot+ " very small. Minimum lot for trade = "+min_volume);// сообщение пользователю
      return (0);
     }

if(Lot>max_volume && max_volume>0.0)
     {
      Print("Lot  "+Lot+"  very big. Maximum lot for trade = "+max_volume);// запись в журнал
      Comment("Lot  "+Lot+" very big. Maximum lot for trade = "+max_volume);// сообщение пользователю
      return (0);
     }

После чего советник прошел все валидации.

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

* * *

Кстати, в твоём коде принудительное приведение объёма ордеров к требуемым значениям (мин/макс) - "не этична" для пользователей. По любому, пользователь должен сам устанавливать объем ордера, а не "машина". Либо, при таком приведении - надо выдавать пользователю во весь экран предупреждение, что объём изменён. Или, как вариант, встроить функцию подтверждения для пользователя на автоматическое изменение объёма.

 
Victor Golovkov:

хе-хе :)
У меня была подобная заварушка.

Надо было всего-то: после возврата неверного объема ордера выдать сообщение трейдеру, что он тупанул.

Примерно:

После чего советник прошел все валидации.

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

* * *

Кстати, в твоём коде принудительное приведение объёма ордеров к требуемым значениям (мин/макс) - "не этична" для пользователей. По любому, пользователь должен сам устанавливать объем ордера, а не "машина". Либо, при таком приведении - надо выдавать пользователю во весь экран предупреждение, что объём изменён. Или, как вариант, встроить функцию подтверждения для пользователя на автоматическое изменение объёма.

Про этичность согласен. Я выше писал об этом. Про принт или коммент не знал, что этого будет достаточно. Возьму на заметку. Спасибо

 
Vitalii Ananev:

В OnInit() есть принудительное завершение работы советника c кодом возврата INIT_FAILED или INIT_PARAMETERS_INCORRECT при передачи ему неверных параметров?

У меня была такая ошибка в валидаторе из за того, что в OnInit() стояла проверка на ввод неверных параметров  и осуществлялся возврат с кодом  INIT_PARAMETERS_INCORRECT. Советник в результате этого на проходил автомодерацию. Убрав возврат и путем шаманских действий и привидения неверных параметров к верным, удалось пройти валидатор.

...

Кстати, заметил неприятную вещь. Если использовать входной параметр типа uint, что бы нельзя было задать отрицательное значение input переменной. Однако это не работает каким то образом отрицательное число неявно преобразуется в положительное и в результате параметр получает неадекватное значение. Теперь не использую в Input тип uint так как не известно что придет в голову конечному пользователю. И проверку параметра на отрицательное число делаю уже в OnInit()

Как так в input uint-переменную вводилось отрицательное число?

Это невозможно сделать ни в тестере, ни в демо-реале.

В любом случае - плохая привычка в коде использовать значение input-переменной.

В OnInit() нужно присвоить её значение глобальной переменной с дополнительными необходимыми проверками.

Часто нельзя использовать нулевое значение во входных параметрах, так же часто нельзя задать, например, период меньше 1, 2, 3, и т.д... Проведя все такие проверки для каждой input-переменной при присвоении её значения глобальной переменной, мы исключаем злонамеренный ввод некорректных значений в программу.

 
Artyom Trishkin:

Как так в input uint-переменную вводилось отрицательное число?

Это невозможно сделать ни в тестере, ни в демо-реале.

В любом случае - плохая привычка в коде использовать значение input-переменной.

В OnInit() нужно присвоить её значение глобальной переменной с дополнительными необходимыми проверками.

Часто нельзя использовать нулевое значение во входных параметрах, так же часто нельзя задать, например, период меньше 1, 2, 3, и т.д... Проведя все такие проверки для каждой input-переменной при присвоении её значения глобальной переменной, мы исключаем злонамеренный ввод некорректных значений в программу.

Попробуйте в MT4. Сделайте input переменную типа uint. Потом скомпилируйте и введите в параметрах отрицательное число. 

 
Vitalii Ananev:

Попробуйте в MT4. Сделайте input переменную типа uint. Потом скомпилируйте и введите в параметрах отрицательное число. 

Попробовал. Ни в input uint, ни в extern uint меньше нуля не вводится.

 Просто знак "-" невозможно ввести.

 
Artyom Trishkin:

Попробовал. Ни в input uint, ни в extern uint меньше нуля не вводится.

 Просто знак "-" невозможно ввести.

Странно. У меня почему то вводится.

Тип uint. Ок нажимаешь все нормально сохраняется. Но вот при тестировании куча ошибок. Не верный тейк профит

 
Vitalii Ananev:

Странно. У меня почему то вводится.

Тип uint. Ок нажимаешь все нормально сохраняется. Но вот при тестировании куча ошибок. Не верный тейк профит

Кстати у меня когда то давно был такой прикол. Он был и прошёл. Я даже тему создавал, или модератору писал не помню. 
Но точно было что-то похоже. Года 2 назад. 
 
Vitalii Ananev:

Странно. У меня почему то вводится.

Тип uint. Ок нажимаешь все нормально сохраняется. Но вот при тестировании куча ошибок. Не верный тейк профит

Я проверял в тестере. В оптимизаторе не смотрел. Сейчас уже не у компа. Позже.
Причина обращения: