Настройка времени экспирации отложенных ордеров

 

Добрый день,

подскажите, пожалуйста, кто знает, как установить дату экспирации в отложенном ордере. Ордера выставляю через библиотеку Trade.mqh.  Рынок FORTS индекс на РТС.

Как я понял в настройках по умолчанию в Trade.mqh ордер устанавливается до отмены ORDER_TYPE_GTC, но после установки смотрю дату экспирации скриптом OrderInfoSample и она до 00 сегодняшнего дня, т.е. по факту через ночь не перейдет.

Пробовал устанавливать дату экспирации явно, через ORDER_TYPE_SPECIFIED и точное указание времени, и то же самое.

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

Заранее спасибо!

 
YuryK1980:

Добрый день,

подскажите, пожалуйста, кто знает, как установить дату экспирации в отложенном ордере. Ордера выставляю через библиотеку Trade.mqh.  Рынок FORTS индекс на РТС.

Как я понял в настройках по умолчанию в Trade.mqh ордер устанавливается до отмены ORDER_TYPE_GTC, но после установки смотрю дату экспирации скриптом OrderInfoSample и она до 00 сегодняшнего дня, т.е. по факту через ночь не перейдет.

Пробовал устанавливать дату экспирации явно, через ORDER_TYPE_SPECIFIED и точное указание времени, и то же самое.

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

Заранее спасибо!

Никогда не работал с переносом ордера, но попробуйте так:

//+------------------------------------------------------------------+
//|                                                       test_2.mq5 |
//|                                      Copyright 2017 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
ulong ticket;
uint req_id;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  double a_price = SymbolInfoDouble(Symbol(), SYMBOL_ASK); //Цена для ордера
  Place(a_price, 1, false); // Установка ордера
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Place order                                                      |
//+------------------------------------------------------------------+
void Place(const double price, const double volume, const bool buy_sell)
{
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  ticket = 0;
  req_id = 0;
//--- Fill structure
  request.action = TRADE_ACTION_PENDING;
  request.magic  = 97771277;
  request.symbol = Symbol();
  request.volume = volume;
  request.price  = price;
  if(buy_sell == true)
  {
    request.type = ORDER_TYPE_BUY_LIMIT;
  }
  else
  {
    request.type = ORDER_TYPE_SELL_LIMIT;
  } 
  request.comment = "Отложенный ордер...";      
  request.type_filling = ORDER_FILLING_RETURN;
  request.type_time = ORDER_TIME_SPECIFIED_DAY;
  request.expiration = datetime(ulong(TimeTradeServer()) + 24 * 3600); //Ордер должен экспирироваться через сутки
//--- Send order
  if(OrderSendAsync(request, result) == true)
  {
    if((result.retcode == TRADE_RETCODE_PLACED) || (result.retcode == TRADE_RETCODE_DONE)) 
    {
      req_id = result.request_id;
    }
    else
    {
      Print("Ордер не установлен! ");
    }
  }
  else
  {
    Print("Ордер не отослан!");
  }
}


//+------------------------------------------------------------------+
// Expert Trade Transaction function                                 |
//+------------------------------------------------------------------+
void OnTradeTransaction( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result )
{
  switch(trans.type)
  {
    case TRADE_TRANSACTION_REQUEST:
      if((req_id > 0) && (result.request_id == req_id))
      {
        if((result.retcode == TRADE_RETCODE_PLACED) || (result.retcode == TRADE_RETCODE_DONE))
        {
          if(result.order > 0)
          {
            ticket = result.order;  //Получение установленного ордера
          }
        }
      }
    break;
  }   
}

А вообще Вам лучше писать в раздел "Биржевой трейдинг"

 
prostotrader:

Никогда не работал с переносом ордера, но попробуйте так:

А вообще Вам лучше писать в раздел "Биржевой трейдинг"

Спасибо,

но я так пробовал, выдает ошибку экспирации. Нашел в справке, что возможность задать врем экспир отложенного ордера хранится в SYMBOL_EXPIRATION_MODE, сейчас проверил для РТС значение 2 (ордер действует до конца дня), но как тогда переносятся ордера установленные вручную, и почему в них дату экспирации можно менять я не понимаю.

 

YuryK1980:

как тогда переносятся ордера установленные вручную, и почему в них дату экспирации можно менять я не понимаю. 

Запустите какой-нибудь прослушиватель торговых приказов и выставьте руками нужный ордер. Сразу увидите, как были заполнены поля торгового запроса.

 

Спасибо еще раз,

и беру свои слова назад, вроде бы я делал так же, но Ваш код работает, а мой нет.  Буду разбираться по буквам.

Успехов!

 
YuryK1980:

Спасибо,

но я так пробовал, выдает ошибку экспирации. Нашел в справке, что возможность задать врем экспир отложенного ордера хранится в SYMBOL_EXPIRATION_MODE, сейчас проверил для РТС значение 2 (ордер действует до конца дня), но как тогда переносятся ордера установленные вручную, и почему в них дату экспирации можно менять я не понимаю.

Именно так как в моем коде пробовали?

Дело в том, что на ФОРТС не поддерживаются 

SYMBOL_EXPIRATION_GTC

SYMBOL_EXPIRATION_SPECIFIED

//+------------------------------------------------------------------+
//|                                                       test_2.mq5 |
//|                                      Copyright 2017 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
ulong ticket;
uint req_id;

bool CheckMarketParam(const string a_symbol)
{
  //---Type time
  int tipe_time = int(SymbolInfoInteger(a_symbol, SYMBOL_EXPIRATION_MODE));
/*  if((SYMBOL_EXPIRATION_GTC & tipe_time) != SYMBOL_EXPIRATION_GTC)
  {
    MessageBox("Символ " + a_symbol + " не поддерживает SYMBOL_EXPIRATION_GTC!", "Ошибка", MB_OK | MB_ICONHAND);
    return(false);
  }*/
  if((SYMBOL_EXPIRATION_DAY & tipe_time) != SYMBOL_EXPIRATION_DAY)
  {
    MessageBox("Символ " + a_symbol + " не поддерживает SYMBOL_EXPIRATION_DAY!", "Ошибка", MB_OK | MB_ICONHAND);
    return(false);
  }
/*  if((SYMBOL_EXPIRATION_SPECIFIED & tipe_time) != SYMBOL_EXPIRATION_SPECIFIED)
  {
    MessageBox("Символ " + a_symbol + " не поддерживает SYMBOL_EXPIRATION_SPECIFIED!", "Ошибка", MB_OK | MB_ICONHAND);
    return(false);
  }*/
  if((SYMBOL_EXPIRATION_SPECIFIED_DAY & tipe_time) != SYMBOL_EXPIRATION_SPECIFIED_DAY)
  {
    MessageBox("Символ " + a_symbol + " не поддерживает SYMBOL_EXPIRATION_SPECIFIED_DAY!", "Ошибка", MB_OK | MB_ICONHAND);
    return(false);
  }
  return(true);
}
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  double a_price = SymbolInfoDouble(Symbol(), SYMBOL_ASK); //Цена для ордера
  if(CheckMarketParam(Symbol()) == false) return(INIT_FAILED);
  Place(a_price, 1, false); // Установка ордера
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Place order                                                      |
//+------------------------------------------------------------------+
void Place(const double price, const double volume, const bool buy_sell)
{
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  ticket = 0;
  req_id = 0;
//--- Fill structure
  request.action = TRADE_ACTION_PENDING;
  request.magic  = 97771277;
  request.symbol = Symbol();
  request.volume = volume;
  request.price  = price;
  if(buy_sell == true)
  {
    request.type = ORDER_TYPE_BUY_LIMIT;
  }
  else
  {
    request.type = ORDER_TYPE_SELL_LIMIT;
  } 
  request.comment = "Отложенный ордер...";      
  request.type_filling = ORDER_FILLING_RETURN;
  request.type_time = ORDER_TIME_SPECIFIED_DAY;
  request.expiration = datetime(ulong(TimeTradeServer()) + 24 * 3600); //Ордер должен экспирироваться через сутки
//--- Send order
  if(OrderSendAsync(request, result) == true)
  {
    if((result.retcode == TRADE_RETCODE_PLACED) || (result.retcode == TRADE_RETCODE_DONE)) 
    {
      req_id = result.request_id;
    }
    else
    {
      Print("Ордер не установлен! ");
    }
  }
  else
  {
    Print("Ордер не отослан!");
  }
}


//+------------------------------------------------------------------+
// Expert Trade Transaction function                                 |
//+------------------------------------------------------------------+
void OnTradeTransaction( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result )
{
  switch(trans.type)
  {
    case TRADE_TRANSACTION_REQUEST:
      if((req_id > 0) && (result.request_id == req_id))
      {
        if((result.retcode == TRADE_RETCODE_PLACED) || (result.retcode == TRADE_RETCODE_DONE))
        {
          if(result.order > 0)
          {
            ticket = result.order;  //Получение установленного ордера
          }
        }
      }
    break;
  }   
}
 
YuryK1980:

Спасибо еще раз,

и беру свои слова назад, вроде бы я делал так же, но Ваш код работает, а мой нет.  Буду разбираться по буквам.

Успехов!

Пожалуйста, только пишите далее в раздел "Биржевой трейдинг"

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