Error 150 - prohibited by FIFO rules (очень хочется услышать комментарий от разработчиков)

 

Сегодня столкнулся с очередными граблями в MT4.

ДЦ исполнил ордера на открытие одинаковым временем. См. иллюстрацию:

Причём вверху иллюстрации оба ордера исполнены для GBPUSD.

Как такое может быть я догадываюсь, вопрос в другом.

ДЦ у которого это произошло позволяет закрывать только по FIFO.

Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний?

Я предположил, что у более раннего ордера должен быть меньший Ticket. Подправил торговую библиотеку, но ошибка 150 не исчезла. Попробовал вручную прикрыть часть объёма верхнего на иллюстрации ордера - получил ту же самую ошибку. А запрос на закрытие 0.1 лота, т.е. всего ордера, был исполнен сервером.

Собственно, вопрос №2: почему нельзя было закрыть часть ордера?

 
PapaYozh:

Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний?


Все ещё очень хочется прочитать ответ разработчиков MT хотя бы на этот вопрос.
 
PapaYozh:

Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний?

Спросить у суппорта как они тикеты формируют.

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

Собственно, вопрос №2: почему нельзя было закрыть часть ордера?

Частичное закрытие возможно только если поддерживается ДЦ, тоже в суппорт.
 
TheXpert:

Спросить у суппорта как они тикеты формируют.

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

Частичное закрытие возможно только если поддерживается ДЦ, тоже в суппорт.


1. Там такая ситуация была:

- отправлен запрос на открытие, советник через 3 минуты 16 секунд (я по журналу смотрел) получает ошибку 128.

- т.к. условия на изменение позиции не изменились, советник вновь формирует запрос на окрытие и вновь ожидание и - ошибка 128.

- а потом появляются ордера с одинаковым временем окрытия.

2. Частичное закрытие возможно, не происходило частичное закрытие того ордера, что вверху иллюстрации. Как я понял, это как-то связано с наличием ещё ордера/ордеров с таким же временем открытия как и у прикрываемого.

 

TheXpert:

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


Это не полукостыльно, а я бы сказал правило хорошего тона по отношению к торговому серверу даже после успешно выполненных операций делать паузу

в несколько секунд.

 
sandex:

Это не полукостыльно, а я бы сказал правило хорошего тона по отношению к торговому серверу даже после успешно выполненных операций делать паузу

Что-то вы батенька путаете. Правило хорошего тона -- делать сервер так, чтобы не надо было вставлять после операций паузу.

PapaYozh:


1. Там такая ситуация была:

Я пас.

2. Как я понял, это как-то связано с наличием ещё ордера/ордеров с таким же временем открытия как и у прикрываемого.

Вряд ли, но настаивать не буду.
 
PapaYozh:

Сегодня столкнулся с очередными граблями в MT4.

ДЦ исполнил ордера на открытие одинаковым временем. См. иллюстрацию:

Причём вверху иллюстрации оба ордера исполнены для GBPUSD.

Как такое может быть я догадываюсь, вопрос в другом.

ДЦ у которого это произошло позволяет закрывать только по FIFO.

Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний?

Я предположил, что у более раннего ордера должен быть меньший Ticket. Подправил торговую библиотеку, но ошибка 150 не исчезла. Попробовал вручную прикрыть часть объёма верхнего на иллюстрации ордера - получил ту же самую ошибку. А запрос на закрытие 0.1 лота, т.е. всего ордера, был исполнен сервером.

Собственно, вопрос №2: почему нельзя было закрыть часть ордера?

Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний?

Из нескольких ордеров с одинаковым временем самый раний - ордер с наименьшим тикетом.

Собственно, вопрос №2: почему нельзя было закрыть часть ордера?

По той же причине по которой нельзя было закрыть ордер полностью.

Для того чтобы понять что случилось, нужна дополнительная информация:

1. Известно ли точное время открытия ордеров (с точностью до секунд) #13019610 и #13019611? Это время можно получить через MQL4.

2. Вы пробовали закрывать ордер #13019611? Т.е. ошибка 150 была только для #13019610 ордера или для обоих?

3. Как именно вы закрывали изначально? С помощью MQL4 или вручную?

 
Alexander:

Из нескольких ордеров с одинаковым временем самый раний - ордер с наименьшим тикетом.

Спасибо.


По той же причине по которой нельзя было закрыть ордер полностью.

Для того чтобы понять что случилось, нужна дополнительная информация:

1. Известно ли точное время открытия ордеров (с точностью до секунд) #13019610 и #13019611? Это время можно получить через MQL4.

2. Вы пробовали закрывать ордер #13019611? Т.е. ошибка 150 была только для #13019610 ордера или для обоих?

3. Как именно вы закрывали изначально? С помощью MQL4 или вручную?

Нельзя было произвести частичное закрытие. Советник пытался закрыть 0.09 лота и получал ошибку 150. Я попытался вручную закрыть 0.09 лота и тоже не происходило закрытие. Затем вручную отправил запрос на закрыти 0.1 лота и он был принят и благополучно исполнен.

Вот строчки из журнала:

14:49:17 '222950': close order #13019610 sell 0.09 GBPUSD at 1.61505 sl: 0.00000 tp: 1.60060 at price 0.00000
14:49:18 '222950': order #13019610 buy 0.09 GBPUSD closing at 0.00000 failed [Prohibited by FIFO rule]
14:49:19 '222950': modify order #13024119 sell 0.01 EURUSD at 1.41724 sl: 0.00000 tp: 1.41440 -> sl: 0.00000 tp: 1.40919
14:49:20 '222950': request was accepted by server
14:49:20 '222950': request in process
14:49:20 '222950': order #13024119 sell 0.01 EURUSD at 1.41724 was modified -> sl: 0.00000 tp: 1.40919
14:49:54 '222950': close order #13019610 sell 0.09 GBPUSD at 1.61505 sl: 0.00000 tp: 1.60060 at price 0.00000
14:49:54 '222950': order #13019610 buy 0.09 GBPUSD closing at 0.00000 failed [Prohibited by FIFO rule]
14:50:03 '222950': close order #13019610 sell 0.10 GBPUSD at 1.61505 sl: 0.00000 tp: 1.60060 at price 0.00000
14:50:03 '222950': request was accepted by server
14:50:04 '222950': request in process
14:50:04 '222950': order #13019610 sell 0.10 GBPUSD at 1.61505 sl: 0.00000 tp: 1.60060 closed at price 1.61039

Это не единственный раз за вчера. До этого была ситуация с открытием 5-ти ордеров с одинаковым временем. Я пробовал их закрывать, закрылся с меньшим номером тикета, после этого я внес исправление в код своей торговой библиотеки.

Было:

else if ( ClsType==POSCNTRL_CLOSETYPE_FIFO && opOrderOpenTime>OrderOpenTime() )


стало:

else if ( ClsType==POSCNTRL_CLOSETYPE_FIFO && ( opOrderOpenTime>OrderOpenTime() || ( opOrderOpenTime==OrderOpenTime() && opTicket1>OrderTicket() ) ) )
 
PapaYozh:

Спасибо.

Нельзя было произвести частичное закрытие. Советник пытался закрыть 0.09 лота и получал ошибку 150. Я попытался вручную закрыть 0.09 лота и тоже не происходило закрытие. Затем вручную отправил запрос на закрыти 0.1 лота и он был принят и благополучно исполнен.

Конечно вряд ли, так как Вы не первый год на рынке, но может дело в минимальном лоте или в шаге?
 
MaxZ:
Конечно вряд ли, так как Вы не первый год на рынке, но может дело в минимальном лоте или в шаге?


Поверьте, с минлотом и шагом всё в порядке.

Да и код ошибки был 150.

 
Alexander:

1. Известно ли точное время открытия ордеров (с точностью до секунд) #13019610 и #13019611? Это время можно получить через MQL4.


Вот скрипт:

int start()
{
if ( OrderSelect( 13019610, SELECT_BY_TICKET, MODE_HISTORY ) )
   Print("#",OrderTicket()," OrderOpenTime=", TimeToStr( OrderOpenTime(), TIME_DATE|TIME_MINUTES|TIME_SECONDS));
if ( OrderSelect( 13019611, SELECT_BY_TICKET, MODE_HISTORY ) )
   Print("#",OrderTicket()," OrderOpenTime=", TimeToStr( OrderOpenTime(), TIME_DATE|TIME_MINUTES|TIME_SECONDS));
return(0);
}

Вот результат:

14:31:00 TEST GBPUSD,M1: loaded successfully
14:31:00 TEST GBPUSD,M1: #13019610 OrderOpenTime=2011.09.06 05:28:58
14:31:00 TEST GBPUSD,M1: #13019611 OrderOpenTime=2011.09.06 05:28:58
14:31:00 TEST GBPUSD,M1: uninit reason 0
14:31:00 TEST GBPUSD,M1: removed