MQL4 - automated forex trading   /  

Форум

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

К списку тем  | 1 2 3 Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

avatar
1739
getch 19.11.2009 16:26 

Код:

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

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

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

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


Бесплатная Groupware для групп разработчиков

Установите систему групповой работы TeamWox и объедините усилия всех разработчиков. Это поможет вашей команде работать быстрее и организованнее. Благодаря TeamWox станет намного проще ставить задачи и контролировать их выполнение.


avatar
268
Swan 19.11.2009 18:31 
getch >>:

Код:

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

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

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


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

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


avatar
1739
getch 19.11.2009 18:34 
Swan >>:

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

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

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


avatar
7055
TheXpert 19.11.2009 18:35 
getch >>:

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

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


avatar
1739
getch 19.11.2009 18:43 
TheXpert >>:

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

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

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

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

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

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


avatar
4604
xrust 19.11.2009 19:19 
последний закрытый ордер - не обязательно последний в списке.... вы повремени закрыти фильтровать не пробовали???

avatar
1739
getch 19.11.2009 19:28 
xrust >>:
последний закрытый ордер - не обязательно последний в списке.... вы повремени закрыти фильтровать не пробовали???

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

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

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


avatar
Модератор
7922
Vinin 19.11.2009 19:47 
getch писал(а) >>

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

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

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

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


avatar
2240
Roger 19.11.2009 19:51 
getch писал(а) >>

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

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

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

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


avatar
1739
getch 20.11.2009 01:18 
Vinin >>:

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

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

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

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


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

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

1. OrderClose

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

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

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

К списку тем   | 1 2 3  

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