Энрико, возможно ли проверить, был ли ордер (или позиция) частично закрыт.
В MT4 у меня есть новый тикет в случае частичного закрытия. Фактически, это не новый вход, а предыдущий. Поэтому мне нужно разделить такие ордера. Те, которые указывают на истинный вход в рынок, и те, которые появляются после частичного закрытия (не новый вход). Возможно ли это с помощью ваших классов?
Энрико, возможно ли проверить, был ли ордер (или позиция) частично закрыт.
В MT4 у меня есть новый тикет в случае частичного закрытия. Фактически, это не новый вход, а предыдущий. Поэтому мне нужно разделить такие ордера. Те, которые указывают на истинный вход в рынок, и те, которые появляются после частичного закрытия (не новый вход). Возможно ли это с помощью ваших классов?
Или это будет один объект COrder до полного закрытия ордера? То есть после частичного закрытия новый объект COrder не появляется?
Если да, то как мне получить общую прибыль по ордеру?
Также, как мне получить тикет начального ордера или тип начального ордера?
Предположим, у меня есть ордер sell 5.00 #1 по цене 1.09246. Следующее частичное закрытие buy 2.00 #2 по 1.08896. И окончательное закрытие оставшейся покупки 3.00 #3 по 1.09161 (из-за трейлинг-стопа на самом деле).
Это мой код:
COrders *orders=order_manager.OrdersHistory(); for(int i=order_manager.OrdersHistoryTotal()-1;i>=0;i--) { COrder *order=orders.At(i); if(!CheckPointer(order)) continue; order.OnTick(); if(!order.IsClosed()) continue; if(order.OrderType()!=0 && order.OrderType()!=1) continue;
Для упрощения назовем все эти 3 ордера позицией.
Метод IsClosed() возвращает true, когда позиция закрывается (по последнему ордеру #3). Но как мне получить тип позиции, тикет первого ордера, цену открытия позиции. Начальный объем позиции, похоже, можно вычислить с помощью метода InitVolume(). А как насчет остального?
Предположим, у меня есть ордер sell 5.00 #1 по цене 1.09246. Следующее частичное закрытие buy 2.00 #2 по 1.08896. И окончательное закрытие оставшейся покупки 3.00 #3 по 1.09161 (из-за трейлинг-стопа на самом деле).
Это мой код:
Для упрощения назовем все эти 3 ордера позицией.
Метод IsClosed() возвращает true, когда позиция закрывается (по последнему ордеру #3). Но как мне получить тип позиции, тикет первого ордера, цену открытия позиции. Начальный объем позиции, похоже, можно вычислить с помощью метода InitVolume(). А как насчет остального?
Не совсем понимаю, что вы пытаетесь сделать, но для получения нереализованной прибыли/убытка в MQL5 на экземпляре COrder можно получить оставшийся объем, затем умножить его на разницу между текущей рыночной ценой (bid или ask) и ценой входа в COrder, а затем умножить на значение тика. Более сложная часть - когда точка символа не равна размеру тика (вам нужно будет разделить разницу на размер тика). Раньше так было с золотом, но теперь, насколько я знаю, нет. Просто лучше найти брокера, который предлагает большую ликвидность. Один и тот же экземпляр COrder используется до конца. В MQL4 достаточно выбрать тикет ордера и вызвать функцию OrderProfit().
When one sends a trade request, there are only two outcomes: processed or not processed. If the trade was not processed, it means that there was no deal, as the trade server was not able to process it for some reason (usually due to errors). Now, if the trade is processed, in MQL5, the client and the server have a deal. In this case, the order can be fully executed or partially executed.
Это не совсем точно, у вас также может быть таймаут. Это означает, что вы не знаете, был ли ордер обработан или нет. Конечно, в конечном итоге ордер либо обрабатывается, либо нет, но важно знать и обрабатывать тайм-аут на реальном счете.
В MetaTrader 4 такой возможности нет, так как ордер исполняется только полностью или нет (fill или kill).
...
В MQL4 расчет объема прост. Каждый раз, когда советник отправляет торговую заявку, в нее включается и объем заявки, и она либо отклоняется, либо принимается.
Но это не точно. В MT4 также могут быть частично исполненные ордера. Конечно, на Форексе, который в основном торгуется на МТ4, это должно быть редкостью, но технически это может произойти.
В целом, я не вижу смысла в классах, которые вы привели в этой статье, так как вам все равно нужны специфические MT4/MT5 в основном коде, и директивы компилятора. (Возможно, это рассматривается в последующих статьях, я их еще не читал).
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Кроссплатформенный торговый советник: Ордера:
MetaTrader 4 и MetaTrader 5 используют различные правила обработки торговых запросов. В этой статье обсуждается возможность использования объекта класса, который представляет сделки для обработки сервером, чтобы в дальнейшем советник мог работать с ними независимо от версии торговой платформы и используемого режима.
Нижеследующие скриншоты показывают, как работает советник в платформе. Обратите внимание, что поскольку советник вызывает функцию ExpertRemove, он автоматически удаляется из графика по окончании выполнения кода (только однократное выполнение обработчика OnTick).
Автор: Enrico Lambino