Ошибка при модификации отложенного лимитного ордера - [Order has been changed already]

 
Счет демо, МТ5, ЕСН.

1.Часто пишет ошибку модификации - [Order has been changed already].

Order has been changed already

Код попытаюсь вставить.
Вкратце алгоритм модификации:
-проверяем старую и новую цены. Если равны - выходим.
-проверяем флаг "ордер на модификации". Если установлен - выходим.
-отправляем запрос
-запрос прошел- ставим флаг "ордер на модификации", запоминаем тикет и цену.

В OnTradeTransaction проверяем изменилась ли цена. Изменилась, флаг снимаем, можно модифицировать снова.
Как еще проверить - не знаю. 
В справке совет: проверять MqlTradeResult &result. 

Как победить, не знаю.

double lastModyPrice,newPrice;     //старая и новая цены
ulong lastOrderTicket,tiketOrder;  // тикет ранее модифицированного ордера и тикет ордера для модификации
bool flagModify;                    //флаг - ордер на модификации 
double polPoint; // значение для сравнения вещественных чисел

polPoint=0.7*_Point;
// ENUM_ORDER_TYPE type - тип ордера (только для печати ошибок)
// bool &flagMody -  ссылка на флаг (провели модификацию, поставили флаг. В OnTradeTransaction  - сняли)
// ulong &lastTicket - ссылка на  тикет ордера, мы его запомнили при прошлой модификации 
// ulong ticket - тикет выбранного для модификации ордера
// double &priceOld - ссылка на значение цены прежней модификации
// double priceNew - новая цена для модификации


orderModify(ORDER_TYPE_BUY_LIMIT,flagModify,lastOrderTicket,tiketOrder,lastModyPrice,newPrice);//пример запроса

//функция модификации
void orderModify(ENUM_ORDER_TYPE type,bool &flagMody,ulong &lastTicket,ulong ticket,double &priceOld,double priceNew)
{
if(MathAbs(priceOld-priceNew)<polPoint) return; // цена модификации равна прежней - выходим
if(!OrderSelect(tiket) || (flagMody && lastTicket==ticket))return; // не пришел ответ из TradeTransaction - выходим
if(OrderGetInteger(ORDER_STATE)==ORDER_STATE_PLACED || OrderGetInteger(ORDER_STATE)==ORDER_STATE_PARTIAL) // попытка модифицироватьто, что можно модифицировать :)
   {
   MqlTradeRequest ModRequest={0};
   MqlTradeResult  ModResult={0};
   ModRequest.action   =TRADE_ACTION_MODIFY; 
   ModRequest.order = tiket;
   ResetLastError();
   ModRequest.price   = NormalizeDouble(priceNew,_Digits);
      {
      if(OrderSendAsync(ModRequest,ModResult))
         {
         priceOld=ModRequest.price;    //запомнили цену
         lastTicket=ticket;              //запомнили тикет
         flagMody=true;                //поставили флаг - ордер на модификации
         return;
         }
      else
         {
         Print("Ошибка модификации ",EnumToString(type),"  ",GetLastError()," реткод ",ModResult.retcode);
         }   
      }   
   }
}


void  OnTradeTransaction(const MqlTradeTransaction &trans,const MqlTradeRequest &request,const MqlTradeResult &result)  
 
{
if(trans.symbol!=_Symbol)return;

if(trans.type==TRADE_TRANSACTION_ORDER_UPDATE)
   {
   if(trans.order==lastOrderTicket)
      {
      if(MathAbs(trans.price-lastModyPrice)<polPoint)flagModify=false;  //если цены равны(ордер модифмцирован) сбросил флаг
      return;     //вместо trans.price ставил result.price - не решило проблему. 
      }           //как отловить, что ордер на модификации/модифицирован - не знаю..
   }
}  


2. В терминале часто зависает запрос - что ордер на модификации или на удалении (второй скрин). Может висет часами. Не удаляется (не изменяется) никак - ни руками на скриптом. и срабатывает только когда дойдет цена. Может кто сталкивался, почему так?

Зависает ордер в терминал

 
Напишите название торгового сервера.
 
fxsaber:
Напишите название торгового сервера.

FXOpen-MT5

 
По второму вопросу техподдержка предполагает - их баг. Работают над устранением.
 
HimOrik:

FXOpen-MT5

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


Возможно, изменят на стандартное для MT5 поведение частичного исполнения. Но там есть два нюанса (один и два). Второй - очень плохой. Сомневаюсь, что разработчики этот баг устранили.

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2020.08.02
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 

fxsaber:
>

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

  Возможно, изменят на стандартное для MT5 поведение частичного исполнения. Но там есть два нюанса (один и два). Второй - очень плохой. Сомневаюсь, что разработчики этот баг устранили.

>

Спасибо! Как всегда, узнал что-то новое.

По второму вопросу ( HimOrik: " 2. В терминале часто зависает запрос") подтвердили, что  "при частичном исполнении с последующей модификацией отложенного ордера происходит зависание". Это только на демо. Устраняют.

По первому вопросу( HimOrik: " 1.Часто пишет ошибку модификации") понял, что сравниваю с несуществующей пока ценой ( fxsaber: "Но там есть два нюанса (один и два).") - следует из нюанса один.

Как еще понять, можно отсылать на модификацию или нет?

По второму нюансу - сравниваем то, что должно быть с тем, что есть. При необходимости доставляем/удаляем.

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2020.08.02
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
HimOrik:

Как еще понять, можно отсылать на модификацию или нет?

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

Надо распечатывать Trade-события и анализировать.