Обсуждение статьи "Какие проверки должен пройти торговый робот перед публикацией в Маркете" - страница 2

 

Спасибо, статья очень нужная.

Мне не очень понятно в подтеме "Ограничение на количество лотов по одному символу" приведен дважды код функции PositionVolume().
Чуть ниже описание функции NewOrderAllowedVolume() и в ней вызов:

double orders_volume_on_symbol=PendingsVolume(symbol);

Только описания функции PendingsVolume() нигде в статье не видно.

Если вместо функции PendingsVolume() приведена по ошибке повторно функция PositionVolume(), исправьте, пожалуйста.

 
ок гугл, как пройти валидацию, нет не так, нужен пример простейшего советника который может 100% пройти валидацию чтоб изучить его код и сравнить с собственным чтоб найти в чём может быть ошибка, а ещё лучше поподробней про валидацию - как происхожит, что делает
 

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

//+------------------------------------------------------------------+
//| Возвращает максимально допустимый объем для ордера на символ |
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- получить ограничение на максимальный объем ордера
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- получить ограничение на объем по символу
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- получить объем открытой позиции по символу
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- если мы исчерпали объем
      if(max_volume-opened_volume<=0)
         return(0);

      //--- объем открытой позиции не превышает max_volume
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

Логическая ошибка. Если позиции еще нет, вы все равно должны проверить объем отложенных позиций и рассчитать допустимый объем. Данный код возвращает allowed_volume=0, если еще нет открытой позиции, не учитывая отложенные сделки.

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- выберите порядок по билетам
   if(orderinfo.Select(ticket))
     {
      //--- размер пункта и название символа, на который был выставлен отложенный ордер
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- проверьте, есть ли изменения в цене открытия
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- проверьте, есть ли изменения в уровне StopLoss
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);
      //--- проверьте, есть ли изменения в уровне прибыли
      bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);
      //--- если есть изменения в уровнях
      if(PriceOpenChanged || StopLossChanged || TakeProfitChanged)
         return(true);  // порядок может быть изменен 
      //--- нет изменений в уровнях Open, StopLoss и Takeprofit
      else
      //--- сообщите об ошибке
         PrintFormat("Order #%d already has levels of Open=%.5f SL=.5f TP=%.5f",
                     ticket,orderinfo.StopLoss(),orderinfo.TakeProfit());
     }
//--- подошел к концу, никаких изменений для заказа
   return(false);       // нет смысла изменять 
  }

Другая логическая ошибка. Изменение SL/TP на 1 пункт разрешено. Должно быть >=

+ опечатка, должно быть "-tp)>=point);"

+ недостающий параметр (PrintFormat имеет для %, но предоставляется только 3 параметра).

bool PositionModifyCheck(ulong ticket,double sl,double tp)

Аналогичная ошибка, как и в пункте 2° выше.

И такие же ошибки также в OrderModifyCheck() версии mql4.

Спасибо за исправление этих ошибок, пожалуйста, обратите внимание, что я не проверил всю статью досконально, так что, возможно, есть еще что-то.

 

Еще несколько комментариев по поводу этой статьи, но в этот раз не связанных с ошибками, а больше касающихся моего личного мнения:

Access violation

Данная ошибка возникает при попытке обратиться к памяти, доступ к которой запрещен. В каждом таком случае необходимо связаться с разработчиками через службу поддержки в вашем профиле или через страницу "Контакты".
  • Как ни странно, это не имеет никакого отношения к статье об ошибках пользователей (кодеров). Нарушение доступа означает, что это ошибка в коде Metaquotes

Этот тип ошибок встречается относительно редко, многие из них имеют готовые коды, которые призваны помочь в поиске причины.

Константа Значение Описание
ERR_INTERNAL_ERROR 4001 Неожиданная внутренняя ошибка
ERR_WRONG_INTERNAL_PARAMETER 4002 Неверный параметр во внутреннем вызове функции клиентского терминала
  • Коды ошибок существуют для того, чтобы помочь, но "Неожиданная внутренняя ошибка" совершенно бесполезна, а "Неверный параметр во внутреннем вызове функции клиентского терминала" действительно загадочна (по крайней мере, для меня).

Новичкам рекомендуется прочитать все статьи об обработке ошибок, а также задавать вопросы на форуме и в комментариях к статьям. Другие, более опытные члены MQL5.community, помогут вам разобраться в непонятных моментах. Мы надеемся, что информация, собранная в статье, поможет вам создавать более надежные торговые роботы и в более короткие сроки.

  • Я совершенно не согласен с такой практикой, Маркет - это коммерческий сервис, предлагаемый Metaquotes, они должны взять на себя поддержку и не полагаться на сообщество. На мой взгляд, это не профессиональный подход.

Несмотря на критику, я хотел бы поблагодарить Metaquotes за их отличную работу над MT4/MT5 и призвать их продолжать повышать уровень качества и профессионализма.

 
Andrey Barinov:

Вот эта часть вызывает вопросы:

 

Почему необходимая маржа сравнивается с Equity а не с FreeMargin?

http://prntscr.com/dgd6s4

теперь чего не так?

проверяет маржу, нет достаточно денег, не торгует, но поднять сову не дает

Снимка на екрана
Снимка на екрана
  • prnt.sc
Снимано с Lightshot
 
Скажите пожалуйста,как быть! Хочу выложить продукт - советник помощник, который необходимо привязывать к отрытым сделкам для его работы. Без привязки в тестере не будет сделок и он не пройдёт проверку
 
а вы пробовали? или так навскидку сказали? 
 
Vladislav Andruschenko:
а вы пробовали? или так навскидку сказали? 
пробовал! вылетело сообщение, что не прошел проверку, ни одной сделки сов не открыл! ну он так и не откроет если он как помощник.
 
Bogdan Bovykin:
пробовал! вылетело сообщение, что не прошел проверку, ни одной сделки сов не открыл! ну он так и не откроет если он как помощник.

если это утилита, то модераторы проверяют советник лично. 

Утилиту можно настроить на тестер  чтобы он открыл хоть пару сделок и как помощник их сопроводил. Это не проблема. 

 
Vladislav Andruschenko:

если это утилита, то модераторы проверяют советник лично. 

Утилиту можно настроить на тестер  чтобы он открыл хоть пару сделок и как помощник их сопроводил. Это не проблема. 

ну то есть сделать это в виде панельки? и таким образом проверить? или как?

просто в данный момент в ручную открывать любую сделку и прикрепляется данный советник на график к тикету открытого ордера