Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
MetaQuotes Software Corp.
Модератор
188185
MetaQuotes Software Corp.  

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

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

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

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


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

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

Автор: MetaQuotes Software Corp.

Andrey Barinov
39470
Andrey Barinov  

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

 

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
Админ
12664
Rashid Umarov  
Andrey Barinov:

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

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

Резонно - поправим.
Yurij Izyumov
31451
Yurij Izyumov  

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

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
106826
Vladislav Andruschenko  

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

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

с недавних времен года 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
36330
Ramiz Mavludov  

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

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
23031
Alexey Volchanskiy  

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

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

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

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

Ivan Usenkov
3623
Ivan Usenkov  

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

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

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

нужно: 

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

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

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

double orders_volume_on_symbol=PendingsVolume(symbol);

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

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

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