ERR_ORDER_LOCKED 139 - что за чудовище такое??

 

Всем привет!


Вот-с, получил от своего брокера страшное письмо что из-за этой ошибки, инициированной (якобы) моим экспертом, могут страдать другие трейдеры, что исправлять её последствия им приходится меняя вручную соответствующий приказ, что мой эксперт в случае возникновения этой ошибки должен немедленно прекратить работу, и что если нет то они будут вынуждены запретить автоматическую торговлю с моего счёта. Короче, страх и ужас.


За сим был бы очень благодарен за ответы разработчиков и/или тех кто сталкивался с этим зверем на пару вопросиков:

а) кто, когда, из-за чего, и с какой целью блокирует приказ? Сервер? Клиент (я пользую 255-й билд)? Может ли эта ошибка возникать для уже открытых приказов или только при модификации отложенных?

б) как с этим бороться изнутри эксперта? Брокер говорит что мой эксперт не сможет даже удалить такой приказ чтобы ввести новый аналогичный, и что единственны способ - отсоединить эксперта и закончить торговлю вручную (что было бы крайне неприятно).


Интересно что такая ошибка ни разу не возникала на демо-счёте за примерно месяц тестирования, только на реале, поэтому протестировать ЕА адекватно не получилось.


Заранее спасибо за помощь!

 

условие на проверку ошибки - и можно снова пытаться...

https://www.mql5.com/ru/forum/55851

 
rdim писал(а) >>

... (я пользую 255-й билд)? ...

Ух-ты! А я по старинке еще 225-м пользуюсь!

 
api, cпасибо за замученную очепятку, я конечно имел в виду 225 :) Плохо быть программером :)


2 DDFedor

Содержательный ответ, спасибо. Видимо квинт-эссенция ответа относительно моего
вопроса есмь следующая строка с комментом:

if(error==139)// ERR_ORDER_LOCKED 139 Ордер заблокирован и
//уже обрабатывается, поэтому проверяем исполнение после небольшой паузы
{

Увы, похоже пауза должна быть слишком большая, ибо я получаю данную ошибку
постоянно с промежутком в 5 мин:

11:39:53 'ххх': modification of pending order #148233 sell stop 1.00 CADJPY at 83.785 sl: 0.000
tp: 83.698 -> price: 83.785 sl: 84.056 tp: 83.698 failed [Order is locked]
11:44:53 'ххх': modification of pending order #148233 sell stop 1.00 CADJPY at 83.794 sl: 0.000
tp: 83.707 -> price: 83.794 sl: 84.055 tp: 83.707 failed [Order is locked]
11:49:59 'ххх': modification of pending order #148233 sell stop 1.00 CADJPY at 83.807 sl: 0.000
tp: 83.720 -> price: 83.807 sl: 84.054 tp: 83.720 failed [Order is locked]

Так что похоже этот приказ собирался обрабатываться до конца света, поэтому брокер и
вынужден его руками менять. А то у него там серена 400 ваттная орёт :) как он говорит.
Но главные наши вопросы остаются - кто виноват и что делать? Как избежать пожизненного
блокирования и что делать ежели оно случилось.
 
rdim >>:
Но главные наши вопросы остаются - кто виноват и что делать? Как избежать пожизненного
блокирования и что делать ежели оно случилось.

ордера в цикле модифицируются?

возможно тогда поможет

bool Rez=OrderModify(...

и далее в зависимости от возвращенного Rezультата:)


перед торговыми функциями таки желательно проверить IsTradeContextBusy() или IsTradeAllowed().

 
rdim писал(а) >>
api, cпасибо за замученную очепятку, я конечно имел в виду 225 :) Плохо быть программером :)

ERR_ORDER_LOCKED 139 Ордер заблокирован и уже обрабатывается. Необходимо прекратить все попытки торговых операций и изменить логику программы.

Это из справки.

Я так понимаю, что то, что Вы делаете делать нельзя и Вам советуют перестать это делать. Это Вам советует разработчик и это же Вам советует Ваш брокер.

Сам я с такой ошибкой не встречался и потому предложить решение я не могу.

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

P.S. Не заметил при анализе вашего наверняка неполного лога, что тикет ордера один и тот же. Правда это не отменяет все вышесказанное.

Еще хотелось бы увидеть исходники Вашего советника. Если жалко - то хотя бы в личку. Если ОЧЕНЬ жалко, то хотя бы места работы с ордерами.

 
rdim писал(а) >>

Сколько советников на счете? Параллельно руками что-нибудь делали?

 
Едва примопинаю, что-то было подобное. Советник начал подифицировать ордер и я тут же полез руками закрывать его, была ошибка 139. Модификация выполнилась и можно было закрыть.
 
Integer >>:
Едва примопинаю, что-то было подобное. Советник начал подифицировать ордер и я тут же полез руками закрывать его, была ошибка 139. Модификация выполнилась и можно было закрыть.

А кроме как получив эту ошибку, понять, что ни руками, ни чем другим трогать не надо, можно?

У меня тоже не встречалась 139 (пока), но если вдруг, то понять как решать/избежать хотелось бы.

 
Svinozavr писал(а) >>

А кроме как получив эту ошибку, понять, что ни руками, ни чем другим трогать не надо, можно?

У меня тоже не встречалась 139 (пока), но если вдруг, то понять как решать/избежать хотелось бы.

Затрудняюсь здесь. Ордер в обработке, а торговый поток не занят. Если один советник работает только со своими ордерами, то не может быть такой ошибки, функции типа OrderSend(), OrderModify() ждут завершения обработки ордера.

Надо будет поэкспериментировать в понедельник, попытаться получить 139.

 

Может быть от того, что для советников свой торговый поток, а для ручных действий, тогда получается сообщение о блокировке ордера. Если так, то заранее никак не узнать.