Помогите разобраться с модификацией ордера ФОРТС

 

Добрый день!

Устанавливаю ордер, а затем модифицирую его

//+------------------------------------------------------------------+
//| Expert modify order function                                     |
//+------------------------------------------------------------------+
void ModifyOrder( const string aSymbol, const double price )
{
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  
  request.action = TRADE_ACTION_MODIFY;
  request.magic  = MagicNumber;
  request.symbol = aSymbol;
  request.order  = set_order_ticket;
  request.price  = price;
  request.type_time = ORDER_TIME_DAY;
  
  if ( OrderSend( request, result ) )
  {
    if ( result.retcode == TRADE_RETCODE_PLACED ) 
    {
      set_order_ticket = result.order;
    }
  }
}

В первый раз ордер модифицируется, а потом нет (см. вложенный файл).

 

 

ПОЧЕМУ? 

 
Mikalas:

ПОЧЕМУ? 

В вечернюю сессию сервер подменяет метод экспирации ордера. Вот ответ сервисдеска по этой проблеме:

Рассмотрели Вашу проблему. Поведение платформы корректное.

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

Т.е. бизнес день биржи для календарной даты X состоит из вечерней сессии календарного дня X-1 и основной торговой сессии в календарного дня X. Т.е. сегодня 6 августа с 19-00 начнется вечерняя торговая сессия торгового дня 7го августа. Таким образом, при модификации ордера Вы получаете полностью обновленное описание ордера с корректной датой истечения - Today(истечение после окончания текущей торговой сессии).
В примере выше Вы выставили 30го июля ордер с истечением 31го июля, но 30го июля после 19-00 началась вечерняя торговая сессия 31го июля и Вы в эту сессию модифицировали ордер. После модификации выставился корректный тип истечения - Today(истечение после окончания текущей торговой сессии).

Дополнительное на своей стороне проверим, почему дата истечения не выставилась корректно в период основного клиринга при переносе многодневных ордеров на следующую сессию. Судя по всему на момент клиринга данные ордера не маркируются на бирже как Today. Проверим дополнительно.

 Решение: брать тип экспирации из модифицируемого ордера.

 

Добрый день!

Уважаемый Yurich!

Из справки MQL5:

ORDER_TIME_DAY - Ордер будет действовать только в течение текущего торгового дня

Конец выдержки из справки.

Дня - это значит до 23:49:59, а не торговой сессии. 

т.е Если я установил ордер 19.09.2013 с параметром ORDER_TIME_DAY,

то ордер должен экспирироваться 19.09.2013 до 23:49:59 

 

Беру у установленного ордера время экспирации:

if ( OrderSelect( set_order_ticket ) )
{
 datetime exp_time = ( datetime )OrderGetInteger( ORDER_TIME_EXPIRATION );
}

Модифицирую ордер:

void ModifyOrder( const string aSymbol, const double price, const datetime expiration )
{
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  
  request.action = TRADE_ACTION_MODIFY;
  request.magic  = MagicNumber;
  request.symbol = aSymbol;
  request.order  = set_order_ticket;
  request.price  = price;
  request.type_time = ORDER_TIME_SPECIFIED;
request.expiration = expiration;

  
  if ( OrderSend( request, result ) )
  {
    if ( result.retcode == TRADE_RETCODE_PLACED ) 
    {
      set_order_ticket = result.order;
    }
  }
}

Ордер НЕ модифицируется с ответом "INVALID EXPIRATION"

Как же модифицировать ордер? 

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

Добрый вечер!

Нашел "косяк".

Если взять дату эскпирации установленного 19,09,2013 ордера, 

if ( OrderSelect( set_order_ticket ) )
{
  datetime exp_time = ( datetime )OrderGetInteger( ORDER_TIME_EXPIRATION );
........................................................

то exp_time = D'2013.09.19 00:00:00', т.е он УЖЕ ПРОСРОЧЕН!!! 

Время ORDER_TIME_DAY должно быть 23:49:59, а 00:00:00 это утро 19.09.2013 

Остаётся загадкой как же ордер модифицируется в первый раз, а так же устанавливается? :) 

 

Добрый день!

Неужели никто не знает как нужно модифицировать ордер?

Если указывать время экспирации  D'2013.09.27 23:49:59'

void ModifyOrder( const string aSymbol, const double price )
{
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  
  request.action = TRADE_ACTION_MODIFY;
  request.magic  = MagicNumber;
  request.symbol = aSymbol;
  request.order  = set_order_ticket;
  request.price  = price;
  request.type_time = ORDER_TIME_SPECIFIED;
  request.expiration = D'2013.09.27 23:49:59';

  
  if ( OrderSend( request, result ) )
  {
    if ( result.retcode == TRADE_RETCODE_PLACED ) 
    {
      set_order_ticket = result.order;
    }
  }
}

 То же "Invalid expiration"!!?????

 
Mikalas:

Добрый день!

Неужели никто не знает как нужно модифицировать ордер?

Если указывать время экспирации  D'2013.09.27 23:49:59'

 То же "Invalid expiration"!!?????

Модифицировал лимитные ордера. Везде было 

request.type_time=ORDER_TIME_DAY;

 проблем не было. Сейчас не торгую на Фортс.