Ошибка в CTrade::OrderModify

 

Добрый день, уважаемый разработчик!

Мне кажется, что в функции CTrade::OrderModify при заполнении MqlTradeRequest упущена установка m_request.type_filling=m_type_filling;

Это приводит у тому, что в случае политики исполнения ордеров ORDER_FILLING_IOC при модификации отложенного ордера возникает сообщение Unsupported filling c Err 10030, так как по умолчанию взята политика

ORDER_FILLING_FOK. 

С уважением, VVK963. 

 
Заставляет задуматься, что Вы аж ~второй, кто это заметил

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2016.10.20 08:16

Правильно ли я понимаю, что на бирже модификация ордеров через СБ работать не будет?

//+------------------------------------------------------------------+
//| Modify specified pending order                                   |
//+------------------------------------------------------------------+
bool CTrade::OrderModify(const ulong ticket,const double price,const double sl,const double tp,
                         const ENUM_ORDER_TYPE_TIME type_time,const datetime expiration,const double stoplimit)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- clean
   ClearStructures();
//--- setting request
   m_request.action      =TRADE_ACTION_MODIFY;
   m_request.magic       =m_magic;
   m_request.order       =ticket;
   m_request.price       =price;
   m_request.stoplimit   =stoplimit;
   m_request.sl          =sl;
   m_request.tp          =tp;
   m_request.type_time   =type_time;
   m_request.expiration  =expiration;
//--- action and return the result
   return(OrderSend(m_request,m_result));
  }

filling не задается.

Т.е. СБ-OrderModify совсем не пользуются на MT5! И черт знает, это MT5 так непопулярен или СБ.

На эту тему еще было написано. Заявка в Сервисдеске разработчиками взята на рассмотрение.

Интересно, не то, что у разработчиков баг, а то, что баг, который должен был быть выявлен любым трейдером, кто пользуется СБ на MT5, еще несколько лет назад, озвучен на данный момент только Вами.

 
vvk963:

Мне кажется, что в функции CTrade::OrderModify при заполнении MqlTradeRequest упущена установка m_request.type_filling=m_type_filling; 

Исходя из первичной документации при MqlTradeRequest::action=TRADE_ACTION_MODIFY поле MqlTradeRequest::type_filling не участвует в запросе. Соответственно его заполнение не имеет смысла 

fxsaber:
Заставляет задуматься, что Вы аж ~второй, кто это заметил

При MqlTradeRequest::action =TRADE_ACTION_MODIFY сама по себе строка

m_request.magic       =m_magic;

сомнительная. Я направлял как то сообщение в Сервисдеск о невозможности модифицировать magic как об ошибке - на что мне ответили что так задумано и magic - это священная корова и его менять нельзя ни при каких обстоятельствах

 
A100:

Исходя из первичной документации при MqlTradeRequest::action=TRADE_ACTION_MODIFY поле MqlTradeRequest::type_filling не участвует в запросе. Соответственно его заполнение не имеет смысла

Может показаться, что filling нужен только для маркет-ордеров - TRADE_ACTION_DEAL. Однако, есть стоповые отложки, которые активируются торговым сервером в виде маркетов. Поэтому и для TRADE_ACTION_PENDING и для TRADE_ACTION_MODIFY необходимо задание filling.

А вот зачем задавать лимитными заявкам filling - не ясно.

Можно только рекомендовать написание своего варианта заполнения Request.type_filling = GetFilling(Request.symbol; при модификации. В MT4Orders это делается так

ENUM_ORDER_TYPE_FILLING GetFilling( const string Symb, const uint Type = ORDER_FILLING_FOK )
{
  const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE);
  const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE);

  return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
         (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
 
fxsaber:

Можно только рекомендовать написание своего варианта заполнения Request.type_filling = GetFilling(Request.symbol; при модификации. В MT4Orders это делается так

Если на практике комбинация

m_request.action      =TRADE_ACTION_MODIFY;
m_request.magic       =m_magic;
m_request.type_filling=m_type_filling;
работает, то это значит что документация устарела. Торговая часть является базовой частью документации и должна быть всегда в актуальном состоянии
 
A100:

Если на практике комбинация

m_request.action      =TRADE_ACTION_MODIFY;
m_request.magic       =m_magic;
m_request.type_filling=m_type_filling;
работает, то это значит что документация устарела.

Не устарела. Изначально была не верна (аргумент выше). Разработчики тестят все на Metaquotes-Demo. А там нарваться на Unsupported filling mode гораздо сложнее, чем на других серверах.

C filling полный кавардак. Заявка в СД также в рассмотрении. Мне только не ясно, почему трейдеры, которые торгуют на бирже, отмалчиваются? Ведь почти сразу должно бросаться в глаза такое.

 
fxsaber:

Не устарела. Изначально была не верна (аргумент выше). Разработчики тестят все на Metaquotes-Demo. А там нарваться на Unsupported filling mode гораздо сложнее, чем на других серверах.

C filling полный кавардак. Заявка в СД также в рассмотрении. Мне только не ясно, почему трейдеры, которые торгуют на бирже, отмалчиваются? Ведь почти сразу должно бросаться в глаза такое.

Почему отмалчиваются?

Кто действительно торгует на Бирже, не используют стандартную библиотеку и всё нормально работает. 

 
prostotrader:

Почему отмалчиваются?

Кто действительно торгует на Бирже, не используют стандартную библиотеку и всё нормально работает. 

Да речь не про СБ, а про filling, который не работает.
 
Всё раьртает
 
A100:

Если на практике комбинация

m_request.action      =TRADE_ACTION_MODIFY;
m_request.magic       =m_magic;
работает, то это значит что документация устарела. Торговая часть является базовой частью документации и должна быть всегда в актуальном состоянии

По факту такая комбинация не работает. Результат: в торговом запросе нет изменений

А зачем тогда в реализации стандартной библиотеки

bool CTrade::OrderModify(const ulong ticket,const double price,const double sl,const double tp,
                         const ENUM_ORDER_TYPE_TIME type_time,const datetime expiration,const double stoplimit)

такая строка

m_request.magic       =m_magic;
Кто ее составлял - он же не сам ее придумал?! В документации (пример по TRADE_ACTION_MODIFY) также нет присваивания MqlTradeRequest::magic 
 
A100:

По факту такая комбинация не работает. Результат: в торговом запросе нет изменений

А зачем тогда в реализации стандартной библиотеки

bool CTrade::OrderModify(const ulong ticket,const double price,const double sl,const double tp,
                         const ENUM_ORDER_TYPE_TIME type_time,const datetime expiration,const double stoplimit)

такая строка

m_request.magic       =m_magic;
Кто ее составлял - он же не сам ее придумал?! В документации (пример по TRADE_ACTION_MODIFY) также нет присваивания MqlTradeRequest::magic 
Стандартная ситуация при копи-пасте. Исходники СБ ни в коем случае нельзя использовать, как документацию. Да и самой документации лучше не доверять на 100% - проверять всегда.