Скачать MetaTrader 5

MT4: Нюанс OrderClose - отставание в обновлении таблицы закрытых позиций

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нет времени изучать MQL5? Библиотека исходников для вас!
getch
1754
getch 2009.11.19 15:26 

Код:

if (OrderClose(....))
{
  Sleep(1000);
  OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY);
}

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

Думал побороть проблему такой существуенной паузой, - стало лучше, чем без нее, но все равно проблема проскакивает. Увеличивать паузу не хочется, т.к. тормозится весь советник.

У кого какие мысли по обходу проблемы?

Aleksey Lebedev
6058
Aleksey Lebedev 2009.11.19 17:31  
getch >>:

Код:

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

Думал побороть проблему такой существуенной паузой, - стало лучше, чем без нее, но все равно проблема проскакивает. Увеличивать паузу не хочется, т.к. тормозится весь советник.

У кого какие мысли по обходу проблемы?


есть подозрение, что список ордеров обновляется с приходом тика.

попробуйте вместо Sleep() завершить функцию start() и получать данные о ордерах в ее начале.

getch
1754
getch 2009.11.19 17:34  
Swan >>:

есть подозрение, что список ордеров обновляется с приходом тика.

попробуйте вместо Sleep() завершить функцию start() и получать данные о ордерах в ее начале.

Спасибо за предложение. Дело в том, что для мультивалютного советника это невозможно.

Комбинатор
15931
Комбинатор 2009.11.19 17:35  
getch >>:

Попробовать RefreshRates() -- мало ли.

Попробовать выбирать по тикету. Вряд ли он меняется.

getch
1754
getch 2009.11.19 17:43  
TheXpert >>:

Попробовать RefreshRates() -- мало ли.

Попробовать выбирать по тикету. Вряд ли он меняется.

RefreshRates() не помогает.

По тикету не стал выбирать, т.к. меняется.

Проблема в том, что на некоторых брокерах реализован механизм частичного исполнения (partial fills). По этой причине OrderClose (как и OrderSend по маркету) возвращает FALSE если даже было закрытие (открытие), но не на весь указанный объем. GetLastError() в таких ситуациях возвращают "off quotes", "common error" и т.д.

Получается, что на MQL4 OrderClose завершается с ошибкой, но на самом деле сделка закрывается частично (или полностью - зависит от реализации ECN-бриджа). Поэтому по тикету это определить нельзя. Вот и встал вопрос, как понять НАДЕЖНО (и быстро), что OrderClose сработал хотя бы частично.

Rustamzhan Salidzhanov
7683
Rustamzhan Salidzhanov 2009.11.19 18:19  
последний закрытый ордер - не обязательно последний в списке.... вы повремени закрыти фильтровать не пробовали???
getch
1754
getch 2009.11.19 18:28  
xrust >>:
последний закрытый ордер - не обязательно последний в списке.... вы повремени закрыти фильтровать не пробовали???

На месте разработчиков я бы так не делал. Т.к. всегда проще добавлять в конец, чем в середину.

Это предположение будет верно, если при настройках All History OrdersHistoryTotal() будет расти после вызова OrderClose.

Спасибо, попробую.

Victor Nikolaev
Модератор
14524
Victor Nikolaev 2009.11.19 18:47  
getch писал(а) >>

На месте разработчиков я бы так не делал. Т.к. всегда проще добавлять в конец, чем в середину.

Это предположение будет верно, если при настройках All History OrdersHistoryTotal() будет расти после вызова OrderClose.

Спасибо, попробую.

На самом деле массив ордеров один. Просто используем фильтр, закрытия ордера тикет не меняется. А присваивается он при открытии.

Alexander
2441
Alexander 2009.11.19 18:51  
getch писал(а) >>

RefreshRates() не помогает.

По тикету не стал выбирать, т.к. меняется.

Проблема в том, что на некоторых брокерах реализован механизм частичного исполнения (partial fills). По этой причине OrderClose (как и OrderSend по маркету) возвращает FALSE если даже было закрытие (открытие), но не на весь указанный объем. GetLastError() в таких ситуациях возвращают "off quotes", "common error" и т.д.

Но, ведь как раз в историю попадает старый тикет.

getch
1754
getch 2009.11.20 00:18  
Vinin >>:

На самом деле массив ордеров один. Просто используем фильтр, закрытия ордера тикет не меняется. А присваивается он при открытии.

Вы и Roger ошибаетесь, поскольку могли не видеть реализацию MT4-ECN-бриджей, где есть понятие Partial Fills.

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

Можно убедиться воочию, попробовав один из подобных терминалов.

getch
1754
getch 2009.11.20 01:01  
xrust >>:
последний закрытый ордер - не обязательно последний в списке.... вы повремени закрыти фильтровать не пробовали???

Попробовал, фильтр не дает результатов. Т.к. после OrderClose может дольше секунды обновляться таблица ордеров с количеством записей на одну больше. Более того, наблюдал, следующую ситуацию:

1. OrderClose

2. OrdersHistoryTotal не изменился.

3. OrderClose (другой тикет)

4. OrdersHistoryTotal увеличился на 2.

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий