Как установить SL и TP у рыночного ордера после выставления?

 

Хочу открыть рыночный ордер, (это у меня получается успешно) и установить SL и TP от цены открытия

Использую такой код


      MqlTradeRequest request= {};
      request.action=TRADE_ACTION_DEAL;         // setting a pending order
      request.magic=1488;                          // ORDER_MAGIC
      request.symbol=_Symbol;                      // symbol
      request.volume=0.5;                          // volume in 0.1 lots
      //request.sl=ima_last;                                // Stop Loss is not specified
      request.sl=0;                                // Stop Loss is not specified
      request.type=ORDER_TYPE_BUY;                // order type
      request.type_filling = SYMBOL_FILLING_FOK;
      MqlTradeResult result= {};
      OrderSend(request,result);
      //--- write the server reply to log
      Print(__FUNCTION__,":",result.comment);
      Print("PLACED",result.retcode);
      if(result.retcode==TRADE_RETCODE_DONE)
        {
         Print("MODIFADED");
         //If the order is placed successfully, then set TP
         double confirmed_price = result.price;
         //double tp = confirmed_price + ((confirmed_price - ima_last) * 2);
         double tp = ((confirmed_price * 10000) + 300) / 10000;
         double sl = ((confirmed_price * 10000) - 150) / 10000;
         tp = NormalizeDouble(tp,asymbol.Digits());
         sl = NormalizeDouble(sl,asymbol.Digits());
         Print("CALL TP:",tp," SL:",sl);
         PositionSelect(_Symbol);
         MqlTradeRequest mod_request= {};
         mod_request.action  =TRADE_ACTION_MODIFY; // тип торговой операции
         //mod_request.position=PositionGetInteger(POSITION_TICKET);   // тикет позиции
         mod_request.order = result.order;
         mod_request.symbol=_Symbol;     // символ
         mod_request.sl      =sl;          // Stop Loss позиции
         mod_request.tp      =tp;                // Take Profit позиции
         if(!OrderSend(mod_request,result))
            PrintFormat("OrderSend error %d",GetLastError());
        }

Но при попытке изменить стопы получаю в тестере постоянно ошибку

failed modify order #10 buy 0 EURUSD at market sl: 0.00000 tp: 0.00000 -> market, sl: 1.16991 tp: 1.21491 [Invalid request]
OrderSend error 4756


Ни как не могу понять в чем дело, позиции модифицируются нормально а ордера нет.

 

https://www.mql5.com/ru/docs/constants/structures/mqltraderequest

TRADE_ACTION_SLTP для изменения значений Stop Loss и Take Profit у открытой позиции

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Структура торгового запроса - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Нет это у позиций, а как быть с ордерами?
 
0x41 #:
Нет это у позиций, а как быть с ордерами?
Мне кажется, что Вы путаете что такое позиция и ордер. Уточните. https://www.mql5.com/ru/articles/211
Ордерa, позиции и сделки в MetaTrader 5
Ордерa, позиции и сделки в MetaTrader 5
  • www.mql5.com
Надежный торговый робот не может быть создан без понимания механизмов работы торговой системы MetaTrader 5. Клиентский терминал получает от торгового сервера информацию о позициях, ордерах и сделках. Чтобы правильно обработать эти данные средствами MQL5 необходимо хорошо представлять как происходит взаимодействие mql5-программы и среды исполнения терминала.
 
0x41 #:
Нет это у позиций, а как быть с ордерами?

Ордер это приказ. приказы бывают разными, на открытие, закрытие, модификацию позиций. Реализуются приказы сделками))) 

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

 
Valeriy Yastremskiy #:

Ордер это приказ. приказы бывают разными, на открытие, закрытие, модификацию позиций. Реализуются приказы сделками))) 

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

Ордер - это приказ. Его можно отдать, отменить, изменить другим приказом.
Так было и есть в 4-ке. И всех это устраивало. Но был один нюанс - Можно было отдать два противоположных приказа.
Можно было, например, купить инструмент за 100, тут же продать его за 90 и сидеть, ожидая прибыли.
Это называлось замок, лок. На этом строились стратегии. Многим это казалось удобным.
Но ведь это противоречит здравому смыслу и элементарной арифметике.
Тут еще вспомнили, что где-то ведется неттинговая торговля. На практике как происходит?
Приходит куча приказов. Что-то покупается, что-то продается. Часть приказов отменяется по разным причинам.
Остается какое-то количество товара. Назовем это: позиция. Вместо кучи ордеров осталась одна позиция.
Еще вспомнили, что в 4-ке отображались только исполненные ордера, отвергнутые как бы пропадали.
Надо учитывать все приказы. И отдельно только те, которые исполнились. Назовем их: сделки.
Это было реализовано в 5-ке. И тут стало ясно: лок (замок) это чушь. Два противоположных приказа взаимно уничтожаются.
От них остается только головная боль в виде платы за спред и комиссию.
Во многом неттинг удобнее. Например, чтобы перевернуть позицию, надо выставить удвоенный обратный ордер.
Но тут взвыли любители локов вместе с любителями видеть на экране кучу ордеров.
Разработчики приняли Соломоново решение: в 5-ку добавили второй режим - хеджинковый.
Выбор режима осуществляется при регистрации счета.
Изменилась структура данных, изменился язык программирования. К языку MQL-4 добавился MQL-5.
Причина обращения: