Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Храни исходные коды в MQL5 Storage. Это безопасно!
MetaQuotes Software Corp.
Модератор
181349
MetaQuotes Software Corp. 2016.07.19 13:13 

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

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

Как  быстро выловить и исправить ошибки в торговом роботе

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


Откройте после тестирования советника Просмотрщик и включите режим "Только ошибки", как показано на рисунке. Если в вашем торговом роботе есть ошибки, вы сразу же их увидите. Если же ошибки не были обнаружены с первого раза, проведите серию тестирований со сменой инструментов/таймфреймов/входных параметров и разными значениями начального депозита. 99% процентов ошибок вывляются этими простыми приемами, и о них мы расскажем вам в этой статье.

Для детального изучения выявленной ошибки используйте в MetaEditor Отладку на истории — так в режиме визуального тестирования вы сможете наблюдать не только графики цен и значения используемых индикаторов, но и проследить на каждом тике значения каждой переменной программы. Это позволит вам отладить вашу торговую стратегию без необходимости тратить недели в режиме реального времени.

Автор: MetaQuotes Software Corp.

Andrey Barinov
39241
Andrey Barinov 2016.07.19 13:59  

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

 

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,equity=AccountInfoDouble(ACCOUNT_EQUITY);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>equity)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

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

Rashid Umarov
Админ
11832
Rashid Umarov 2016.07.19 14:33  
Andrey Barinov:

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

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

Резонно - поправим.
Yurij Izyumov
16791
Yurij Izyumov 2016.07.25 14:20  

Благодарю за статью, но пока так и не смог получить рабочего результата с 

bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,lots,type);
   //-- если денег не хватает
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- проверка прошла успешно
   return(true);
  }

Любые вариации AccountFreeMarginCheck выдают ошибки, советник не возможно вообще для маркета настроить, пытался у пользователей узнать, потом статья появилась, нифига, что так, что  сяк 

что добавляй в условие GetLastError()!=134 что используй выше приведенную функцию, просто заваливает ошибками  

выше приведенная функция умудряется заваливать вот таким

2016.07.25 15:15:54.200 2016.01.04 19:59  RSI_Grabber.1.1 XAUUSD,H1: invalid lots amount for FreeMarginCheck function
2016.07.25 15:15:54.200 2016.01.04 19:59  RSI_Grabber.1.1 XAUUSD,H1: Not enough money for Buy 0.1 XAUUSD Error code=4051

могу ошибаться но 0.1 это нормальный лот указанный руками. MODE_MINLOT по валютной паре 0.01 

Но если честно чем дальше ковыряюсь, тем меньше понимаю в чем проблема(-ы).

Vladislav Andruschenko
92006
Vladislav Andruschenko 2016.07.26 07:37  

возможно лот нужно нормализовать в данной функции, чтоб не было Инвалида.

ну а дальше функция пишет о том, что собственно нет денег, при этом она не посылает запрос на сервер для открытия позиций.Что удовлетворяет правилам маркета.

с недавних времен года 2 назад стал использовать такую инструкцию:

double margin=EMPTY_VALUE;
      margin=AccountFreeMarginCheck(sy,op,ll);
      if(margin>0)
        {

        ticket=OrderSend(sy,op,ll,NormalizeDouble(pp,MarketInfo(sy,MODE_DIGITS)),Slippage,NormalizeDouble(sl,MarketInfo(sy,MODE_DIGITS)),NormalizeDouble(tp,MarketInfo(sy,MODE_DIGITS)),
coomment,mn,0,clOpen);
         
        }
      else Print("Not Enought Money Margin Required"+(string)margin);

 

Собственно все работает.  

при открытии сделки - советник просто возвращает строку  Print("Not Enought Money Margin Required"+(string)margin); 

Советник проходит проверку в маркете, все довольны 

Ramiz Mavludov
26698
Ramiz Mavludov 2016.07.28 11:48  

Я использую такой вариант для точного расчета, только он мне помог решить данную проблему. Дальше уже можно свободно сравнивать.

Laverage = AccountInfoInteger(ACCOUNT_LEVERAGE);  //Плече 
RazmerKontrakta=LotSize*MarketInfo(Symbol(),MODE_LOTSIZE);  //TradeVol*1 lot 
MargaB=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits());
MargaS=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits());
FreeMargin  = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
Alexey Volchanskiy
16682
Alexey Volchanskiy 2016.07.29 13:08  

Пол-года назад тестировал один советник из Маркета, он в тестере валился на вторые-третьи сутки с ошибкой деления на ноль. Советник с несколькими десятками отзывов, то есть его покупают. И несколько сотен комментов.

Причем многие пишут, что есть эта проблема и советуют друг другу перезапускать раз в сутки!!!

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

ЗЫ: название советника не помню, но топовый и недешевый. Какой-то скальпер. 

Ivan Usenkov
3356
Ivan Usenkov 2016.07.29 19:36  

Уважаемый автор спасибо за статью.

Есть маленькая ошибочка в коде для MQL4, если позволите. Для функции CheckMoneyForTrade

double free_margin=AccountFreeMarginCheck(symb,lots,type);

нужно: 

double free_margin=AccountFreeMarginCheck(symb,type,lots);
Gelium
726
Gelium 2016.08.17 11:03  
Цирк на дроте. Вместо того, чтобы один раз запрограммировать все необходимые проверки на стороне терминала, разработчики решили не париться и заставить каждого пользователя писать и отлаживать одни и те же коды, устраивая "танцы с бубнами" вокруг одной элементарной команды OrderSend. Автору статьи огромное спасибо, за то, что потратил время на описание грабель, которых вообще не должно было бы быть при дружественном подходе разработчиков терминала к пользователям. А разработчики терминала за такой подход, лично у меня вызывают только презрение. Потому что их лень оборачивается потерей тысяч часов разработчиков на MQL.
Vasiliy Pushkaryov
4058
Vasiliy Pushkaryov 2016.10.05 12:15  

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

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

double orders_volume_on_symbol=PendingsVolume(symbol);

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

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

Aleksey Semenov
3734
Aleksey Semenov 2016.11.29 23:29  
ок гугл, как пройти валидацию, нет не так, нужен пример простейшего советника который может 100% пройти валидацию чтоб изучить его код и сравнить с собственным чтоб найти в чём может быть ошибка, а ещё лучше поподробней про валидацию - как происхожит, что делает
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий