Попытка удалить отложенный ордер в момент исполнения - локирование позиции

 

Повторно столкнулся с подобной ситуацией. Совеник послал сигнал на удаление отложенного ордера, в момент исполнения данного ордера.

Данный ордер был локорован.

Прилагается ответ брокера

1) Reason for lock:

You tried to delete an order while it was in a process of opening. 
2016.01.21 15:31:12.976    185.34.68.252    '2096680808': delete order #42155742, buy stop 0.01 EURAUD at 1.57565
2016.01.21 15:31:13.142        '2096680808': open order #42155742 modified by API

In the same time your order was executed on LP side, that is why it caused an order lock. 

 

1.В том виде в каком у меня написана функция удаления , проблеме осталась не решена, прошу совета: 

int total = OrdersTotal();
   for(int j = total-1; j >=0; j--)
   {
      if(! OrderSelect(j,SELECT_BY_POS,MODE_TRADES)) continue;
      
      if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol() )
      {
         if(OrderType()==OP_SELLSTOP ||  OrderType()==OP_BUYSTOP )
         {
             Sleep(EXC_TIME_DELAY);//встроенная задержка в милисекундах
             RefreshRates();////возможно, заствляет термиал обновить инфу для последущего запроса?
             if(OrderType()==OP_SELLSTOP ||  OrderType()==OP_BUYSTOP )//Дополнительная проверка непосредственно перед приказом удалить
             {
                bool ans = OrderDelete(OrderTicket(),clrNONE);
                if(ans == true)
                {
                  Print(OrderComment()+" .Order with ticket: ",OrderTicket(),", was deleted.");
                   
                }
                else
                {
                  Print(OrderComment()+" .Failed to delete order with ticket: ",OrderTicket(),"!");
                }
             }   

         }

      }

 2. Существует ли функция разлокирования, локированых позиции?

 
Sergey Genikhov:

Повторно столкнулся с подобной ситуацией. Совеник послал сигнал на удаление отложенного ордера, в момент исполнения данного ордера.

Данный ордер был локорован.

Прилагается ответ брокера

1) Reason for lock:

You tried to delete an order while it was in a process of opening. 
2016.01.21 15:31:12.976    185.34.68.252    '2096680808': delete order #42155742, buy stop 0.01 EURAUD at 1.57565
2016.01.21 15:31:13.142        '2096680808': open order #42155742 modified by API

In the same time your order was executed on LP side, that is why it caused an order lock. 

 

1.В том виде в каком у меня написана функция удаления , проблеме осталась не решена, прошу совета: 

 2. Существует ли функция разлокирования, локированых позиции?

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

139

ERR_ORDER_LOCKED

Ордер заблокирован и уже обрабатывается

 

то анализируем ее примерно так.

if(ans=true)
  {
   все отлично ордер удален
  }
else
  {
   int err=GetLastError();
   if(err==139)
     {
      тут пишем дальнейшие действия с этим ордером
     }
  }
 
Спасибо, Sergey Gritsay .
Вся идея бота, выставлять ордера очень близко : 20 поинтов (5 знаков) от пика, чтобы не пропустить начало движения, поэтому надо делать это, как можно быстрее. Поэтому , не хочу переходить на рыночные ордера.
Ситуация возникает в основном, но ни не только, при расширение спреда на больших движениях. 
В сове присутстует фильтр удалять при больших спредах. То есть существуют ситуации , когда ставится ордер, и затем расширяется спред и идет приказ эго удалить. Я полагаю , при больших движениях, это могут быть несколько сотых миллисекунд. 

Если нет како го то програмного способа это изменит, я лучше фильтр по спреду уберу. Просто этот фильтр очень частая фишка во многих роботах, я думаю, я не первый кто с этой проблеммой столкнулся.

 

А , что можно сделать с локированным ордером? Можно его модифицировать, разблокировать? 

 
Sergey Genikhov:
Спасибо, Sergey Gritsay .
Вся идея бота, выставлять ордера очень близко : 20 поинтов (5 знаков) от пика, чтобы не пропустить начало движения, поэтому надо делать это, как можно быстрее. Поэтому , не хочу переходить на рыночные ордера.
Ситуация возникает в основном, но ни не только, при расширение спреда на больших движениях. 
В сове присутстует фильтр удалять при больших спредах. То есть существуют ситуации , когда ставится ордер, и затем расширяется спред и идет приказ эго удалить. Я полагаю , при больших движениях, это могут быть несколько сотых миллисекунд. 

Если нет како го то програмного способа это изменит, я лучше фильтр по спреду уберу. Просто этот фильтр очень частая фишка во многих роботах, я думаю, я не первый кто с этой проблеммой столкнулся.

 

А , что можно сделать с локированным ордером? Можно его модифицировать, разблокировать? 

Попробуй его закрыть. Если есть возможность звонить по скайпу, то позвони обсудим и попробуем решить. контакт скайпа у меня в профайле
 
Sergey Genikhov:
Спасибо, Sergey Gritsay .
Вся идея бота, выставлять ордера очень близко : 20 поинтов (5 знаков) от пика, чтобы не пропустить начало движения, поэтому надо делать это, как можно быстрее. Поэтому , не хочу переходить на рыночные ордера.
Ситуация возникает в основном, но ни не только, при расширение спреда на больших движениях. 
В сове присутстует фильтр удалять при больших спредах. То есть существуют ситуации , когда ставится ордер, и затем расширяется спред и идет приказ эго удалить. Я полагаю , при больших движениях, это могут быть несколько сотых миллисекунд. 

Если нет како го то програмного способа это изменит, я лучше фильтр по спреду уберу. Просто этот фильтр очень частая фишка во многих роботах, я думаю, я не первый кто с этой проблеммой столкнулся.

 

А , что можно сделать с локированным ордером? Можно его модифицировать, разблокировать? 

Ничего не сделаешь, существует очередь исполнения в которой все ордера поставленные до того как будут первыми. Соответственно при расширении спреда твой ордер активировался и стал заблокированным, но его свойства ещё не изменились, а в этот момент советник видит расширение спреда и посылает команду на удаление, но уже поздно...
 
Всем спасибо, подумал и сделал так:
1. Ордера из-за спреда не удалять, но новые не выставлять.
2. Делать проверку на ошибку 139, в слючае локирования останавливать советник, чтоб больших бед не было. В логе 1 раз писать :"Есть локированный ордер и номер".

Надо еще брокера спросить, какая у них политика по этому поводу. 
В прошлый раз, они мне на -200 поинтов закрыли, хотя на тот момент -500 было, СЛ где то на -300 стоял, а сов пытался этот ордер еще в плюсе закрыть. Но они его закрыли только после того, как я им мейл написал, странно что они сами за этим не следят.
Причина обращения: