Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний?
Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний?
Спросить у суппорта как они тикеты формируют.
Ну или полукостыльно -- ждать секунду после открытия ордера -- проблема отпадет сама собой.
Собственно, вопрос №2: почему нельзя было закрыть часть ордера?
Спросить у суппорта как они тикеты формируют.
Ну или полукостыльно -- ждать секунду после открытия ордера -- проблема отпадет сама собой.
Частичное закрытие возможно только если поддерживается ДЦ, тоже в суппорт.
1. Там такая ситуация была:
- отправлен запрос на открытие, советник через 3 минуты 16 секунд (я по журналу смотрел) получает ошибку 128.
- т.к. условия на изменение позиции не изменились, советник вновь формирует запрос на окрытие и вновь ожидание и - ошибка 128.
- а потом появляются ордера с одинаковым временем окрытия.
2. Частичное закрытие возможно, не происходило частичное закрытие того ордера, что вверху иллюстрации. Как я понял, это как-то связано с наличием ещё ордера/ордеров с таким же временем открытия как и у прикрываемого.
TheXpert:
Ну или полукостыльно -- ждать секунду после открытия ордера -- проблема отпадет сама собой.
Это не полукостыльно, а я бы сказал правило хорошего тона по отношению к торговому серверу даже после успешно выполненных операций делать паузу
в несколько секунд.
Это не полукостыльно, а я бы сказал правило хорошего тона по отношению к торговому серверу даже после успешно выполненных операций делать паузу
Что-то вы батенька путаете. Правило хорошего тона -- делать сервер так, чтобы не надо было вставлять после операций паузу.
1. Там такая ситуация была:
Я пас.
2. Как я понял, это как-то связано с наличием ещё ордера/ордеров с таким же временем открытия как и у прикрываемого.
Сегодня столкнулся с очередными граблями в MT4.
ДЦ исполнил ордера на открытие одинаковым временем. См. иллюстрацию:
Причём вверху иллюстрации оба ордера исполнены для GBPUSD.
Как такое может быть я догадываюсь, вопрос в другом.
ДЦ у которого это произошло позволяет закрывать только по FIFO.
Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний?
Я предположил, что у более раннего ордера должен быть меньший Ticket. Подправил торговую библиотеку, но ошибка 150 не исчезла. Попробовал вручную прикрыть часть объёма верхнего на иллюстрации ордера - получил ту же самую ошибку. А запрос на закрытие 0.1 лота, т.е. всего ордера, был исполнен сервером.
Собственно, вопрос №2: почему нельзя было закрыть часть ордера?
Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний?
Из нескольких ордеров с одинаковым временем самый раний - ордер с наименьшим тикетом.
Собственно, вопрос №2: почему нельзя было закрыть часть ордера?
По той же причине по которой нельзя было закрыть ордер полностью.
Для того чтобы понять что случилось, нужна дополнительная информация:
1. Известно ли точное время открытия ордеров (с точностью до секунд) #13019610 и #13019611? Это время можно получить через MQL4.
2. Вы пробовали закрывать ордер #13019611? Т.е. ошибка 150 была только для #13019610 ордера или для обоих?
3. Как именно вы закрывали изначально? С помощью MQL4 или вручную?
Из нескольких ордеров с одинаковым временем самый раний - ордер с наименьшим тикетом.
Спасибо.
По той же причине по которой нельзя было закрыть ордер полностью.
Для того чтобы понять что случилось, нужна дополнительная информация:
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() ) ) )
Спасибо.
Нельзя было произвести частичное закрытие. Советник пытался закрыть 0.09 лота и получал ошибку 150. Я попытался вручную закрыть 0.09 лота и тоже не происходило закрытие. Затем вручную отправил запрос на закрыти 0.1 лота и он был принят и благополучно исполнен.
Конечно вряд ли, так как Вы не первый год на рынке, но может дело в минимальном лоте или в шаге?
Поверьте, с минлотом и шагом всё в порядке.
Да и код ошибки был 150.
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

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Сегодня столкнулся с очередными граблями в MT4.
ДЦ исполнил ордера на открытие одинаковым временем. См. иллюстрацию:
Причём вверху иллюстрации оба ордера исполнены для GBPUSD.
Как такое может быть я догадываюсь, вопрос в другом.
ДЦ у которого это произошло позволяет закрывать только по FIFO.
Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний?
Я предположил, что у более раннего ордера должен быть меньший Ticket. Подправил торговую библиотеку, но ошибка 150 не исчезла. Попробовал вручную прикрыть часть объёма верхнего на иллюстрации ордера - получил ту же самую ошибку. А запрос на закрытие 0.1 лота, т.е. всего ордера, был исполнен сервером.
Собственно, вопрос №2: почему нельзя было закрыть часть ордера?