| / | Форум |
|
PapaYozh
06.09.2011 15:19
Сегодня столкнулся с очередными граблями в MT4. ДЦ исполнил ордера на открытие одинаковым временем. См. иллюстрацию: Причём вверху иллюстрации оба ордера исполнены для GBPUSD. Как такое может быть я догадываюсь, вопрос в другом. ДЦ у которого это произошло позволяет закрывать только по FIFO. Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний? Я предположил, что у более раннего ордера должен быть меньший Ticket. Подправил торговую библиотеку, но ошибка 150 не исчезла. Попробовал вручную прикрыть часть объёма верхнего на иллюстрации ордера - получил ту же самую ошибку. А запрос на закрытие 0.1 лота, т.е. всего ордера, был исполнен сервером. Собственно, вопрос №2: почему нельзя было закрыть часть ордера? |
|
Бесплатная Groupware для групп разработчиков Установите систему групповой работы TeamWox и объедините усилия всех разработчиков. Это поможет вашей команде работать быстрее и организованнее. Благодаря TeamWox станет намного проще ставить задачи и контролировать их выполнение. |
|
PapaYozh
07.09.2011 11:17
PapaYozh: Все ещё очень хочется прочитать ответ разработчиков MT хотя бы на этот вопрос.
Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний? |
|
TheXpert
07.09.2011 11:32
PapaYozh: Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний? Спросить у суппорта как они тикеты формируют. Ну или полукостыльно -- ждать секунду после открытия ордера -- проблема отпадет сама собой. Собственно, вопрос №2: почему нельзя было закрыть часть ордера? |
|
PapaYozh
07.09.2011 11:40
TheXpert:
Спросить у суппорта как они тикеты формируют. Ну или полукостыльно -- ждать секунду после открытия ордера -- проблема отпадет сама собой. Частичное закрытие возможно только если поддерживается ДЦ, тоже в суппорт.
- отправлен запрос на открытие, советник через 3 минуты 16 секунд (я по журналу смотрел) получает ошибку 128. - т.к. условия на изменение позиции не изменились, советник вновь формирует запрос на окрытие и вновь ожидание и - ошибка 128. - а потом появляются ордера с одинаковым временем окрытия. 2. Частичное закрытие возможно, не происходило частичное закрытие того ордера, что вверху иллюстрации. Как я понял, это как-то связано с наличием ещё ордера/ордеров с таким же временем открытия как и у прикрываемого. |
|
sandex
07.09.2011 12:08
TheXpert: Ну или полукостыльно -- ждать секунду после открытия ордера -- проблема отпадет сама собой. Это не полукостыльно, а я бы сказал правило хорошего тона по отношению к торговому серверу даже после успешно выполненных операций делать паузу в несколько секунд. |
|
TheXpert
07.09.2011 12:12
sandex: Это не полукостыльно, а я бы сказал правило хорошего тона по отношению к торговому серверу даже после успешно выполненных операций делать паузу Что-то вы батенька путаете. Правило хорошего тона -- делать сервер так, чтобы не надо было вставлять после операций паузу. PapaYozh:
Я пас. 2. Как я понял, это как-то связано с наличием ещё ордера/ордеров с таким же временем открытия как и у прикрываемого. |
39 |
Alexander
07.09.2011 13:46
PapaYozh: Сегодня столкнулся с очередными граблями в MT4. ДЦ исполнил ордера на открытие одинаковым временем. См. иллюстрацию: Причём вверху иллюстрации оба ордера исполнены для GBPUSD. Как такое может быть я догадываюсь, вопрос в другом. ДЦ у которого это произошло позволяет закрывать только по FIFO. Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний? Я предположил, что у более раннего ордера должен быть меньший Ticket. Подправил торговую библиотеку, но ошибка 150 не исчезла. Попробовал вручную прикрыть часть объёма верхнего на иллюстрации ордера - получил ту же самую ошибку. А запрос на закрытие 0.1 лота, т.е. всего ордера, был исполнен сервером. Собственно, вопрос №2: почему нельзя было закрыть часть ордера? Вопрос №1: как из нескольких ордеров с одинаковым временем открытия идентифицировать самый ранний? Из нескольких ордеров с одинаковым временем самый раний - ордер с наименьшим тикетом. Собственно, вопрос №2: почему нельзя было закрыть часть ордера? По той же причине по которой нельзя было закрыть ордер полностью. 1. Известно ли точное время открытия ордеров (с точностью до секунд) #13019610 и #13019611? Это время можно получить через MQL4. 2. Вы пробовали закрывать ордер #13019611? Т.е. ошибка 150 была только для #13019610 ордера или для обоих? 3. Как именно вы закрывали изначально? С помощью MQL4 или вручную? |
|
PapaYozh
07.09.2011 14:04
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 Это не единственный раз за вчера. До этого была ситуация с открытием 5-ти ордеров с одинаковым временем. Я пробовал их закрывать, закрылся с меньшим номером тикета, после этого я внес исправление в код своей торговой библиотеки. Было: else if ( ClsType==POSCNTRL_CLOSETYPE_FIFO && opOrderOpenTime>OrderOpenTime() )
else if ( ClsType==POSCNTRL_CLOSETYPE_FIFO && ( opOrderOpenTime>OrderOpenTime() || ( opOrderOpenTime==OrderOpenTime() && opTicket1>OrderTicket() ) ) ) |
|
MaxZ
07.09.2011 14:12
PapaYozh: Конечно вряд ли, так как Вы не первый год на рынке, но может дело в минимальном лоте или в шаге?Спасибо. Нельзя было произвести частичное закрытие. Советник пытался закрыть 0.09 лота и получал ошибку 150. Я попытался вручную закрыть 0.09 лота и тоже не происходило закрытие. Затем вручную отправил запрос на закрыти 0.1 лота и он был принят и благополучно исполнен. |
|
PapaYozh
07.09.2011 14:18
MaxZ:
Конечно вряд ли, так как Вы не первый год на рынке, но может дело в минимальном лоте или в шаге?
Да и код ошибки был 150. |
|
PapaYozh
07.09.2011 14:34
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 |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий