Modification failed due to order or position being close to market

 

Здравствуйте, не могу понять причину этих ошибок при публикации советника МТ5 на Маркете:

test on EURUSD,H1 (hedging)

2019.04.08 15:43:35 failed cancel order #26 buy stop 1.3 EURUSD at 1.12556 tp: 1.12671 [Invalid stops]

2019.04.30 11:28:39 failed instant sell 1.05 EURUSD at 1.11989, close #104 buy 1.05 EURUSD 1.11920 [Modification failed due to order or position being close to market]

2019.04.30 11:28:39 failed instant sell 0.65 EURUSD at 1.11989, close #103 buy 0.65 EURUSD 1.11862 [Modification failed due to order or position being close to market]

2019.04.30 11:28:39 failed instant sell 0.4 EURUSD at 1.11989, close #102 buy 0.4 EURUSD 1.11800 [Modification failed due to order or position being close to market]

2019.05.29 10:02:13 failed instant buy 1.05 EURUSD at 1.11548, close #199 sell 1.05 EURUSD 1.11617 [Modification failed due to order or position being close to market]

2019.05.29 10:02:13 failed instant buy 0.65 EURUSD at 1.11548, close #198 sell 0.65 EURUSD 1.11677 [Modification failed due to order or position being close to market]

2019.05.29 10:02:13 failed instant buy 0.4 EURUSD at 1.11548, close #197 sell 0.4 EURUSD 1.11737 [Modification failed due to order or position being close to market]

2019.06.20 04:03:41 failed instant sell 1.05 EURUSD at 1.12612, close #297 buy 1.05 EURUSD 1.12488 [Modification failed due to order or position being close to market]

2019.06.20 04:03:41 failed instant sell 0.65 EURUSD at 1.12612, close #296 buy 0.65 EURUSD 1.12428 [Modification failed due to order or position being close to market]

2019.06.20 04:03:41 failed instant sell 0.4 EURUSD at 1.12612, close #295 buy 0.4 EURUSD 1.12368 [Modification failed due to order or position being close to market]

strategy tester report 149 total trades

Например, получается что в 11:28:39 советник пытается закрыть серию ордеров BUY по курсу 1.11989, выставляя встречные ордера SELL

Значения 1.11920, 1,11862, 1.11800 по видимому цены открытия ордеров BUY, так в чем проблема?

Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Ценовые константы - Константы индикаторов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Aleksander Gladkov:

Судя по логам, надо смотреть, что показывает

SymbolInfoInteger(_Symbol, SYMBOL_TRADE_FREEZE_LEVEL);
 
Aleksandr Slavskii #:

Судя по логам, надо смотреть, что показывает

Я не могу увидеть, этот параметр при тестировании валидатором Маркет.

К тому же, ругает ордер BUY открытый по курсу 1.11800 при попытке закрытия на уровне 1.11989.

То есть получается

SymbolInfoInteger(_Symbol, SYMBOL_TRADE_FREEZE_LEVEL);

Должен показывать значение больше чем 189?

Для закрытия позиции использую класс CTrade: m_trade.PositionClose(m_position.Ticket())

 
Aleksander Gladkov #:

Я не могу увидеть, этот параметр при тестировании валидатором Маркет.

К тому же, ругает ордер BUY открытый по курсу 1.11800 при попытке закрытия на уровне 1.11989.

То есть получается

Должен показывать значение больше чем 189?

Для закрытия позиции использую класс CTrade: m_trade.PositionClose(m_position.Ticket())

У ордера TP установлен?
 

Вот, попробовал еще раз и получил:

test on EURUSD,H1 (hedging)
2020.04.07 09:57:37 failed instant sell 1.05 EURUSD at 1.08568, close #36 buy 1.05 EURUSD 1.08501 [Modification failed due to order or position being close to market]
2020.04.07 09:57:37 failed instant sell 0.65 EURUSD at 1.08568, close #35 buy 0.65 EURUSD 1.08440 [Modification failed due to order or position being close to market]
2020.04.07 09:57:37 failed instant sell 0.4 EURUSD at 1.08568, close #34 buy 0.4 EURUSD 1.08381 [Modification failed due to order or position being close to market]
2020.04.08 09:04:28 failed instant buy 1.05 EURUSD at 1.08434, close #53 sell 1.05 EURUSD 1.08500 [Modification failed due to order or position being close to market]
2020.04.08 09:04:28 failed instant buy 0.65 EURUSD at 1.08434, close #52 sell 0.65 EURUSD 1.08560 [Modification failed due to order or position being close to market]
2020.04.08 09:04:28 failed instant buy 0.4 EURUSD at 1.08434, close #51 sell 0.4 EURUSD 1.08620 [Modification failed due to order or position being close to market]
2020.04.13 13:13:40 failed instant buy 1.05 EURUSD at 1.09081, close #77 sell 1.05 EURUSD 1.09147 [Modification failed due to order or position being close to market]
2020.04.13 13:13:40 failed instant buy 0.65 EURUSD at 1.09081, close #76 sell 0.65 EURUSD 1.09207 [Modification failed due to order or position being close to market]
2020.04.13 13:13:40 failed instant buy 0.4 EURUSD at 1.09081, close #75 sell 0.4 EURUSD 1.09267 [Modification failed due to order or position being close to market]
2020.04.15 11:04:36 failed instant buy 1.05 EURUSD at 1.09269, close #94 sell 1.05 EURUSD 1.09336 [Modification failed due to order or position being close to market]
2020.04.15 11:04:36 failed instant buy 0.65 EURUSD at 1.09269, close #93 sell 0.65 EURUSD 1.09396 [Modification failed due to order or position being close to market]
2020.04.15 11:04:36 failed instant buy 0.4 EURUSD at 1.09269, close #92 sell 0.4 EURUSD 1.09454 [Modification failed due to order or position being close to market]
2020.05.04 17:13:41 failed instant buy 1.05 EURUSD at 1.09209, close #161 sell 1.05 EURUSD 1.09275 [Modification failed due to order or position being close to market]
2020.05.04 17:13:41 failed instant buy 0.65 EURUSD at 1.09209, close #160 sell 0.65 EURUSD 1.09335 [Modification failed due to order or position being close to market]
2020.05.04 17:13:41 failed instant buy 0.4 EURUSD at 1.09209, close #159 sell 0.4 EURUSD 1.09396 [Modification failed due to order or position being close to market]
2020.05.12 15:12:36 failed instant sell 1.05 EURUSD at 1.08570, close #210 buy 1.05 EURUSD 1.08505 [Modification failed due to order or position being close to market]
2020.05.12 15:12:36 failed instant sell 0.65 EURUSD at 1.08570, close #209 buy 0.65 EURUSD 1.08444 [Modification failed due to order or position being close to market]
2020.05.12 15:12:36 failed instant sell 0.4 EURUSD at 1.08570, close #208 buy 0.4 EURUSD 1.08384 [Modification failed due to order or position being close to market]
2020.05.13 17:52:26 failed instant buy 1.05 EURUSD at 1.08480, close #228 sell 1.05 EURUSD 1.08532 [Modification failed due to order or position being close to market]
2020.05.13 17:52:26 failed instant buy 0.65 EURUSD at 1.08480, close #227 sell 0.65 EURUSD 1.08591 [Modification failed due to order or position being close to market]
2020.05.13 17:52:26 failed instant buy 0.4 EURUSD at 1.08480, close #226 sell 0.4 EURUSD 1.08652 [Modification failed due to order or position being close to market]
strategy tester report 296 total trades
 
Sergey Gridnev #:
У ордера TP установлен?

Мне трудно ответить однозначно, но это возможно.

Никогда не сталкивался с ограничением закрытия ордера при установленном TP

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

А предыдущие версии проходили тестирование и публиковались.

 

Действительно проблема была при модификации или закрытии ордеров с установленными SL или TP близкими к текущей котировке.

Решил частично за счет оптимизации параметров, а также функции проверки перед удалением отложенных ордеров:

//+------------------------------------------------------------------+
//| проверяет дистанцию от цену открытия до цены активации           |
//+------------------------------------------------------------------+
#define _Ask    SymbolInfoDouble(_Symbol,SYMBOL_ASK)
#define _Bid    SymbolInfoDouble(_Symbol,SYMBOL_BID)
bool CheckOrderForFREEZE_LEVEL(ulong ticket)
  {
//--- получим уровень SYMBOL_TRADE_FREEZE_LEVEL
   int freeze_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_level!=0)
     {
      //PrintFormat("SYMBOL_TRADE_FREEZE_LEVEL=%d: Нельзя модифицровать ордер"+
      //            "  ближе %d пунктов от цены активации",freeze_level,freeze_level);
     }
//--- выберем ордер для работы
   if(!OrderSelect(ticket))
     {
      //--- не удалось выбрать ордер
      return(false);
     }
//--- получим данные ордера
   double price=OrderGetDouble(ORDER_PRICE_OPEN);
   double sl=OrderGetDouble(ORDER_SL);
   double tp=OrderGetDouble(ORDER_TP);
   ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
//--- результат проверки
   bool check=false;
//--- проверяем типа ордера
   switch(type)
     {
      //--- отложенный ордер BuyLimit
      case  ORDER_TYPE_BUY_LIMIT:
        {
         //--- проверим дистанцию от цены открытия до цены активации
         check=((_Ask-price)>freeze_level*_Point);
         //if(!check)
         //   PrintFormat("Ордер %s #%d нельзя модифицировать: Ask-Open=%d пунктов < SYMBOL_TRADE_FREEZE_LEVEL=%d пунктов",
         //               EnumToString(type),ticket,(int)((_Ask-price)/_Point),freeze_level);
         return(check);
        }
      //--- отложенный ордер BuyLimit
      case  ORDER_TYPE_SELL_LIMIT:
        {
         //--- проверим дистанцию от цены открытия до цены активации
         check=((price-_Bid)>freeze_level*_Point);
         //if(!check)
         //   PrintFormat("Ордер %s #%d нельзя модифицировать: Open-Bid=%d пунктов < SYMBOL_TRADE_FREEZE_LEVEL=%d пунктов",
         //               EnumToString(type),ticket,(int)((price-_Bid)/_Point),freeze_level);
         return(check);
        }
      break;
      //--- отложенный ордер BuyStop
      case  ORDER_TYPE_BUY_STOP:
        {
         //--- проверим дистанцию от цены открытия до цены активации
         check=((price-_Ask)>freeze_level*_Point);
         //if(!check)
         //   PrintFormat("Ордер %s #%d нельзя модифицировать: Ask-Open=%d пунктов < SYMBOL_TRADE_FREEZE_LEVEL=%d пунктов",
         //               EnumToString(type),ticket,(int)((price-_Ask)/_Point),freeze_level);
         return(check);
        }
      //--- отложенный ордер SellStop
      case  ORDER_TYPE_SELL_STOP:
        {
         //--- проверим дистанцию от цены открытия до цены активации
         check=((_Bid-price)>freeze_level*_Point);
         //if(!check)
         //   PrintFormat("Ордер %s #%d нельзя модифицировать: Bid-Open=%d пунктов < SYMBOL_TRADE_FREEZE_LEVEL=%d пунктов",
         //               EnumToString(type),ticket,(int)((_Bid-price)/_Point),freeze_level);
         return(check);
        }
      break;
     }
//--- ордер не прошел проверку
   return (false);
  }

Причина обращения: