Как правильно модифицировать ордер? - страница 2

 
Mike_Kharkov:
   да. компилировал.
  
   Можите сами проверить.
   (если есть желание.)
  
  

Ну во-первых, ошибка при определении свободной маржи (кстати зачем она нужна при модификации ордера? лот все равно не можете менять на filled позиции) 

   request.type         = ORDER_TYPE_BUY;
   request.volume       = 0.01;

   //---проверим хватает ли средств для открытия позиции
        double margin = 0.0;
                     
   if (!OrderCalcMargin(request.type, request.symbol, request.volume, price, margin))
       {
                        Print("Условия по марже, ошибка:", GetLastError());
                        return(false);
       }

 То есть, не хватает type, volume и price (я заменил для пробы request.price -> price, поскольку request.price не определена)

Во-вторых, перед вызовом OrderSend(request,result), Вы не задаете номер ордера, который нужно модифицировать в структуре request. MT5 принимает на модификацию ордер 0, которого не существует. Вот и все.

 
elugovoy:

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

Я так понимаю что в справке неточность:

 

· SL & TP Modification

Торговый приказ на модификацию уровней StopLoss и/или TakeProfit. Требуется указание 4 полей:

·action

·symbol

·sl

·tp

 

А должно быть по сути

 SL & TP Modification

Торговый приказ на модификацию уровней StopLoss и/или TakeProfit. Требуется указание 5 полей:

·action

·order 

·symbol

·sl

·tp

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

Я бы передавал тикет ордера в функцию модификации, СЛ и ТП. Затем по данным выбранного ордера заполнял нужные request поля и потом OrderSend.

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

 
вы не могли
elugovoy:

Я бы передавал тикет ордера в функцию модификации, СЛ и ТП. Затем по данным выбранного ордера заполнял нужные request поля и потом OrderSend.

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

   А вы не могли бы пример привести как правильно прописывается модификация?

   Попробовал разные варианты, в том числе и вот такой:
  
 //функция формирующая модификацию торгового запроса и проверки результата -------------------+

bool ModifyOrder(double price, double prc_bid)
{  

   MqlTradeRequest request = {0};
   MqlTradeResult  result  = {0};
   //---заполняем поля торгового запроса
   request.action       = TRADE_ACTION_MODIFY;     // Тип выполняемого действия
   request.order        = result.order;            // Тикет ордера
   request.symbol       = _Symbol;                 // Имя торгового инструмента
   request.tp           = prc_bid;                 // Цена, по которой сработает Take Profit ордер при движении цены в благоприятном направлении
   request.sl           = price - 270*_Point;      // Цена, по которой сработает Stop Loss ордер при движении цены в неблагоприятном направлении
                  
                  
                     
   //---отправка запроса на сервер и проверка результата отправки
   if (OrderSend(request,result))
       {
        Print ("Запрос отправлен, результат:",result.retcode);

         if ( result.retcode == TRADE_RETCODE_DONE)
              {
                 Print("TRADE_RETCODE_DONE");
                 return (true);
              };
       }
    else
       {
        Print("Ошибка при отправке запроса #", GetLastError());
       };

                                                  
   
   return(false);
   
   };// функция модификации торгового запроса-------------------------------------------------------------------------------------------------+
и получил вот такую ошибку:
 
Mike_Kharkov:
вы не могли    А вы не могли бы пример привести как правильно прописывается модификация?

   Попробовал разные варианты, в том числе и вот такой:
   и получил вот такую ошибку:

Так Вы не указываете номер ордера для модификации. Укажите его.

Вы обнулили структуру result, и задаете request.order = result.order , по сути 0. А нужно указать номер Вашего ордера, который Вы хотите модифицировать.

bool ModifyOrder(int pTicket, double price, double prc_bid) 

{

...

request.order = pTicket; 

... 

А сам номер тикета передавайте при вызове ModifyOrder.

 

К тому же посмотрите какой ТП вы выставляете, он равен цене Bid, чего брокер не примет никогда. Либо закрывайте ордер, либо ставьте на минимально допустимое расстояние от текущей цены.

Посмотрите веточку https://www.mql5.com/ru/articles/643 

Рецепты MQL5 - Как не получить ошибку при установке/изменении торговых уровней?
Рецепты MQL5 - Как не получить ошибку при установке/изменении торговых уровней?
  • 2013.04.02
  • Anatoli Kazharski
  • www.mql5.com
Продолжая работу над экспертом из предыдущей статьи "Рецепты MQL5 - Изучение свойств позиции в тестере MetaTrader 5", внедрим в него еще целый ряд полезных функций, а также усовершенствуем и оптимизируем уже имеющиеся. На этот раз эксперт будет снабжен внешними параметрами, которые можно будет оптимизировать в тестере MetaTrader 5. Это уже будет немного похоже на простую торговую систему.
 
elugovoy:

К тому же посмотрите какой ТП вы выставляете, он равен цене Bid, чего брокер не примет никогда. Либо закрывайте ордер, либо ставьте на минимально допустимое расстояние от текущей цены.

Посмотрите веточку https://www.mql5.com/ru/articles/643 

   Даже на ECN счетах нельзя закрытся по биду?
   (у меня на демо именно такой счет.)

   >> Либо закрывайте ордер
   А это реально сделать, как то кроме модификации?
   (я что уже только не пробовал.)
 
Mike_Kharkov:
   Даже на ECN счетах нельзя закрытся по биду?
   (у меня на демо именно такой счет.)

   >> Либо закрывайте ордер
   А это реально сделать, как то кроме модификации?
   (я что уже только не пробовал.)

Ну закрытие вычитанием лота позиции вроде бы. Хотя рекомендуют все же стандартные библиотеки.

 #include <Trade/Trade.mqh>

CTrade *pos = new CTrade;
pos.PositionClose("EURUSD",0.00005);  // Symbol, Deviation 

 А выставить ТП текущей ценой никто не даст.

 
elugovoy:

Ну закрытие вычитанием лота позиции вроде бы. Хотя рекомендуют все же стандартные библиотеки.

 А выставить ТП текущей ценой никто не даст.

В МТ4, если уровень стоп-и фриз-левела =0, то вроде можно. Ордер закроется по рынку, если Bid>tp.
Причина обращения: