Советник не проходит в маркет. Ошибка 130. - страница 2

 
Andrey Kornishkin:

видно ненормализованный тейк, хотя нормализация есть

Это нормализованное так выводится

void OnStart()
{
  Print(0.99872);
}

Результат

0.9987200000000001
 
Andrey Kornishkin:

Сегодня была проверка, другого эксперта. В нем минстоп стоит 20п по 5-ти знаку. Видимо этого мало. В предыдущем эксперте минстоп был 40.

Поставлю 30, плюс вывод в лог стоплевела, чтобы потом на него можно было ориентироваться.


добрый день.
лучше запрашивать данные о минимально доступном расстоянии через
SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);
 так как этот уровень может меняться, в зависимости от ситуации, например при новостях он может увеличиваться.

с уважением.
 
Andrey Kisselyov:
добрый день.
лучше запрашивать данные о минимально доступном расстоянии через
 так как этот уровень может меняться, в зависимости от ситуации, например при новостях он может увеличиваться.

с уважением.

и добавить проверку, если "SYMBOL_TRADE_STOPS_LEVEL" == 0 то то брать один-два спреда.

 
Taras Slobodyanik:

и добавить проверку, если "SYMBOL_TRADE_STOPS_LEVEL" == 0 то то брать один-два спреда.


При стоплевеле 0 и стопом в 1,2 спреда не проходит. Ставил 3, тоже.  Видимо при проверке плавающий спред доходит до 0.

Советник с фиксированным минстопом 40п по 5-ти знаку прошел.

 

Второй советник прошел с проверкой из примера: https://www.mql5.com/ru/articles/2555#invalid_SL_TP_for_position

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CheckStops(ENUM_ORDER_TYPE type,double SL,double TP)
  {
//--- получим уровень SYMBOL_TRADE_STOPS_LEVEL
   int stops_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   if(stops_level!=0)
     {
      PrintFormat("STOP LEVEL=%d: StopLoss and TakeProfit must be"+
                  " closer %d points from the closing price",stops_level,stops_level);
     }
//---
   bool SL_check=false,TP_check=false;
//--- проверяем только два типа ордеров
   switch(type)
     {
      //--- операция покупка
      case  OP_BUY:
        {
         //--- проверим StopLoss
         SL_check=(Bid-SL>stops_level*_Point);
         if(!SL_check)
            PrintFormat("For order %s StopLoss=%.5f must be less than %.5f"+
                        " (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)",
                        EnumToString(type),SL,Bid-stops_level*_Point,Bid,stops_level);
         //--- проверим TakeProfit
         TP_check=(TP-Bid>stops_level*_Point);
         if(!TP_check)
            PrintFormat("For order %s TakeProfit=%.5f must be greater than %.5f"+
                        " (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)",
                        EnumToString(type),TP,Bid+stops_level*_Point,Bid,stops_level);
         //--- вернем результат проверки
         return(SL_check&&TP_check);
        }
      //--- операция продажа
      case  OP_SELL:
        {
         //--- проверим StopLoss
         SL_check=(SL-Ask>stops_level*_Point);
         if(!SL_check)
            PrintFormat("For order %s StopLoss=%.5f must be greater than %.5f "+
                        " (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)",
                        EnumToString(type),SL,Ask+stops_level*_Point,Ask,stops_level);
         //--- проверим TakeProfit
         TP_check=(Ask-TP>stops_level*_Point);
         if(!TP_check)
            PrintFormat("For order %s TakeProfit=%.5f must be less than %.5f "+
                        " (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)",
                        EnumToString(type),TP,Ask-stops_level*_Point,Ask,stops_level);
         //--- вернем результат проверки
         return(TP_check&&SL_check);
        }
      break;
     }
   return false;
  }


Перед установкой ордера проверяем на стоплевел, если удачно открываем позицию, нет - идет только сообщение в журнале о неверных стопах:

if(CheckStops(type,sl,tp))r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),slip,sl,tp,"",Magic,0,clr);
      else Print("The level of StopLoss or TakeProfit is incorrect!");
Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • 2016.07.19
  • MetaQuotes Software Corp.
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку для обеспечения единого стандарта качества. В этой статье мы расскажем о наиболее частых ошибках, которые допускают разработчики в своих технических индикаторах и торговых роботах. А также покажем как самостоятельно проверить свой продукт перед отправкой в Маркет.
Причина обращения: