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

 
Во время экспериментов с OrderClose обнаружил недокументированный, вроде, нигде нюанс.
 

Мне кажется, Вы некорректно используете функцию определения ошибок, т.е. сама ошибка может быть откуда угодно, а не от закрытия ордера.

PS В другом названном Вами источнике ордера закрываются частично правильно, т.е. старый тикет идет в историю и никаких проблем с его определением.

 

Вот вырезка из FXOpen:

2009.11.20 09:34:05 test USDJPY,H4: (USDJPY) = OrderClose(915353, 3.3, 88.965, 3) - 0, Lots = 3.3
У меня только нет описателя ошибок.

 
Roger >>:
У меня только нет описателя ошибок.

ErrorDescription находится в stdlib.mqh.

 

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

видимо вам важнее исследовать этот феномен, а не решать собственные задачи..

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

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

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

таким ковровым бомбометание получаем гарантиованное 100 % удаление ордеров и проверять ничего не нужно..

 
keekkenen >>:

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

видимо вам важнее исследовать этот феномен, а не решать собственные задачи..

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

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

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

таким ковровым бомбометание получаем гарантиованное 100 % удаление ордеров и проверять ничего не нужно..

Проблема в том, что нельзя однозначно определить, закрыли вы позицию или нет.

Пример:

1. У вас позиция по USDJPY на 5 лотов.

2. Делаете OrderClose на 2 лота

3. OrderClose возвращает ошибку. Более того, в открытых и закрытых позициях суммарная позиция по USDJPY осталась такой же, как до вызова OrderClose. При этом еще не было никаких других торговых операций, таких, как срабатывание отложек и уровней SL, TP.

4. На основании пункта 3 вы делаете вывод, что OrderClose (в пункте 2) не закрыл 2 лота. И делаете повторный OrderClose.

5. Открытая позиция по USDJPY становится 1 лот (2 + 2).

Дело в том, что некоторые брокеры на MT4 работают в асинхронном режиме принятия торговых приказов. Это обозначает, что вам не надо дожидаться ответа от торгового сервера на свой приказ. Также работает и MT5. Но в MT4 (в отличие от MT5) отсутствует обработчик событий (Events). Поэтому в асинхронных MT4 нельзя однозначно определить результат торговых приказов.

Асинхронность полезна, когда нужно сделать сразу несколько торговых приказов, не дожидаясь ответа по предыдущим. Особенно это бывает актуально у мультивалютных стратегий.

Эмуляция асинхронности на стандартных MT4 достигается работой на одном счете через несколько терминалов.

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

 
про частичное закрытие позиций ничего не могу сказать, т.к. на мт4 позиция закрывается полностью, я доверяю торговым функциям и отслеживаю их результат, так что повторно (на текущем тике) смотреть селект ордеров не возникает необходимости.. как раз мне нужно знать ответ иначе зачем делать запрос ?! ответ важен, т.к. он определяет текущую ситуацию и обработку ответа в зависимости от его результата.. про асинхронность ничего не знаю и сказать не могу, т.к. не сталкивался с тем чтобы мт4 мог посылать еще запрос на торговую операцию не дождавшись ответа от сервера, т.к. поток занят и он один..
 

Так который из предложенных вариантов лучше?

Столкнулся с подобной проблемой, после закрытия ордера ордерселект не находит в истории(по тикету) закрытый ордер на следующем тике

 

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

Косвенный контроль "успешного" закрытия ордера - изменение баланса счета. Можно сравнить разницу баланса перед закрытием и после закрытия ордера - она должна изменится на сумму профита ордера + свопы + комисси ордера.

 
ForexTools:

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

Косвенный контроль "успешного" закрытия ордера - изменение баланса счета. Можно сравнить разницу баланса перед закрытием и после закрытия ордера - она должна изменится на сумму профита ордера + свопы + комисси ордера.

муторно слишком, особенно увеличение баланса счета. если ордер закрыт ордерклосе дает тру, на следующем тике(не всегда) в истории ордерселект не находит ордер(по тикету), сделал просто спать пока ордер не выберется в истории и дальше возврат на старт. только вот не ясно как обновляются данные в истории, с приходом тика или не зависимо от тиков, стоит ли внутри цикла делать обновление данных
Причина обращения: