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

 
Bogdan Bovykin:

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

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

ок

Если ВЫ писали утилиту сами, ВЫ можете в тестере в ИНИТ открыть сделку, и помощник будет ею управлять.  

 

Если советник прошел тесты в терминале И открывает сделки, то в автоматической проверке пишет ошибку о том, что не открыто ни одной сделки (пара и ТФ те же), соответственно он не проходит "Автоматическую проверку"

Совпадение? Не думаю!

Как поступить?

 
такая же ошибка была недавно, просто в ините пришлось принудительно открыть сделку
 

Возможно ли, чтобы MetaQuotes создала шаблон для разработчиков? Это облегчит работу разработчикам, а также сэкономит MetaQuotes кучу денег и ресурсов на проверке присланных советников.

Шаблон для разработчиков находится в кодовой базе

https://www.mql5.com/ru/code/mt4/experts/best

 
Alain Verleyen:

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

//+------------------------------------------------------------------+
//| Возвращает максимально допустимый объем для ордера на символ |
//+------------------------------------------------------------------+
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)  There is no opened positions
     {
      //--- если мы исчерпали объем
      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, если нет уже открытой позиции без учета отложенных.

Почему? В этом коде мы проверяем и объем отложенных ордеров.
 
Alain Verleyen:


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

Спасибо! Исправлено

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.PriceOpen(),orderinfo.StopLoss(),orderinfo.TakeProfit());
     }
//--- подошел к концу, никаких изменений для заказа
   return(false);       // нет смысла изменять 
  }
 
Alain Verleyen:

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

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


Все исправлено, спасибо!

 
Alain Verleyen:

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);

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

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

Это просто более безопасный подход.

 
Alain Verleyen:

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)

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

Спасибо! исправлено
 
bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);

//--

bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-tp)>point);