Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Мне кажется, Вы некорректно используете функцию определения ошибок, т.е. сама ошибка может быть откуда угодно, а не от закрытия ордера.
PS В другом названном Вами источнике ордера закрываются частично правильно, т.е. старый тикет идет в историю и никаких проблем с его определением.
Вот вырезка из FXOpen:
2009.11.20 09:34:05 test USDJPY,H4: (USDJPY) = OrderClose(915353, 3.3, 88.965, 3) - 0, Lots = 3.3
У меня только нет описателя ошибок.
У меня только нет описателя ошибок.
ErrorDescription находится в stdlib.mqh.
честно говоря я так и не понял задачи и проблемы, которая у вас возникает..
видимо вам важнее исследовать этот феномен, а не решать собственные задачи..
я удаляю так, по набору условий формирую массив с данными ордеров (тип,тикет,лот) - получается независимый от журнала набор данных об ордерах..
затем в цикле по созданному массиву произвожу удаление с контролем ошибок и циклом повторных удалений по каждому ордеру,
также фиксирую что ордер был удален... технически, это не гарантирует удаления всех отобранных ордеров за один заход, даже если предусмотрено несколько попыток удаления на каждый ордер.. поэтому,по факту, если остается хотя бы один ордер, то функция вызывается сама себя рекурсивно..
таким ковровым бомбометание получаем гарантиованное 100 % удаление ордеров и проверять ничего не нужно..
честно говоря я так и не понял задачи и проблемы, которая у вас возникает..
видимо вам важнее исследовать этот феномен, а не решать собственные задачи..
я удаляю так, по набору условий формирую массив с данными ордеров (тип,тикет,лот) - получается независимый от журнала набор данных об ордерах..
затем в цикле по созданному массиву произвожу удаление с контролем ошибок и циклом повторных удалений по каждому ордеру,
также фиксирую что ордер был удален... технически, это не гарантирует удаления всех отобранных ордеров за один заход, даже если предусмотрено несколько попыток удаления на каждый ордер.. поэтому,по факту, если остается хотя бы один ордер, то функция вызывается сама себя рекурсивно..
таким ковровым бомбометание получаем гарантиованное 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, видимо, останется нерешенной.
Так который из предложенных вариантов лучше?
Столкнулся с подобной проблемой, после закрытия ордера ордерселект не находит в истории(по тикету) закрытый ордер на следующем тике
для поиска ордера можно (на время отладки например) каждому открываемому ордеру давать свой магик из GetTickCount() - чтобы гарантированно уникальные магики были. Перед закрытием ордера получаем его магик и сразу после закрытия ордера можно будет поискать ордер с этим магиком и в закрытых ордерах и в открытых. если найдется - может станет ясно как оно закрывается...
Косвенный контроль "успешного" закрытия ордера - изменение баланса счета. Можно сравнить разницу баланса перед закрытием и после закрытия ордера - она должна изменится на сумму профита ордера + свопы + комисси ордера.
для поиска ордера можно (на время отладки например) каждому открываемому ордеру давать свой магик из GetTickCount() - чтобы гарантированно уникальные магики были. Перед закрытием ордера получаем его магик и сразу после закрытия ордера можно будет поискать ордер с этим магиком и в закрытых ордерах и в открытых. если найдется - может станет ясно как оно закрывается...
Косвенный контроль "успешного" закрытия ордера - изменение баланса счета. Можно сравнить разницу баланса перед закрытием и после закрытия ордера - она должна изменится на сумму профита ордера + свопы + комисси ордера.