Настройка времени экспирации отложенных ордеров
Добрый день,
подскажите, пожалуйста, кто знает, как установить дату экспирации в отложенном ордере. Ордера выставляю через библиотеку 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; } }
А вообще Вам лучше писать в раздел "Биржевой трейдинг"
Никогда не работал с переносом ордера, но попробуйте так:
А вообще Вам лучше писать в раздел "Биржевой трейдинг"
Спасибо,
но я так пробовал, выдает ошибку экспирации. Нашел в справке, что возможность задать врем экспир отложенного ордера хранится в SYMBOL_EXPIRATION_MODE, сейчас проверил для РТС значение 2 (ордер действует до конца дня), но как тогда переносятся ордера установленные вручную, и почему в них дату экспирации можно менять я не понимаю.
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; } }
Спасибо еще раз,
и беру свои слова назад, вроде бы я делал так же, но Ваш код работает, а мой нет. Буду разбираться по буквам.
Успехов!
Пожалуйста, только пишите далее в раздел "Биржевой трейдинг"

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день,
подскажите, пожалуйста, кто знает, как установить дату экспирации в отложенном ордере. Ордера выставляю через библиотеку Trade.mqh. Рынок FORTS индекс на РТС.
Как я понял в настройках по умолчанию в Trade.mqh ордер устанавливается до отмены ORDER_TYPE_GTC, но после установки смотрю дату экспирации скриптом OrderInfoSample и она до 00 сегодняшнего дня, т.е. по факту через ночь не перейдет.
Пробовал устанавливать дату экспирации явно, через ORDER_TYPE_SPECIFIED и точное указание времени, и то же самое.
Вычитал где-то, что МТ вообще позиции через ночь не переносит, но отложенные ордера выставленные вручную спокойно переносятся, а выставленные советником удаляются.
Заранее спасибо!