- Главное событие экспертов: OnTick
- Основные принципы и понятия: ордер, сделка, позиция
- Типы торговых операций
- Типы ордеров
- Режимы исполнения ордеров по цене и объемам
- Сроки действия отложенных ордеров
- Расчет залога для будущего ордера: OrderCalcMargin
- Оценка прибыли торговой операции: OrderCalcProfit
- Структура торгового запроса MqlTradeRequest
- Структура проверки запроса MqlTradeCheckResult
- Проверка корректности запроса: OrderCheck
- Результат отправки запроса: структура MqlTradeResult
- Отправка торгового запроса: OrderSend и OrderSendAsync
- Совершение покупки или продажи
- Модификация уровней Stop Loss и/или Take Profit позиции
- Трейлинг стоп
- Полное и частичное закрытие позиции
- Полное и частичное закрытие встречных позиций (хедж)
- Установка отложенного ордера
- Модификация отложенного ордера
- Удаление отложенного ордера
- Получение списка действующих ордеров
- Свойства ордеров (действующих и в истории)
- Функции для чтения свойств действующих ордеров
- Отбор ордеров по свойствам
- Получение списка позиций
- Свойства позиций
- Функции для чтения свойств позиций
- Свойства сделок
- Выборка ордеров и сделок из истории
- Функции для чтения свойств ордеров из истории
- Функции для чтения свойств сделок из истории
- Типы торговых транзакций
- Событие OnTradeTransaction
- Синхронные и асинхронные запросы
- Событие OnTrade
- Контроль за изменениями торгового окружения
- Особенности создания мультисимвольных экспертов
- Ограничения и преимущества экспертов
- Создание заготовки эксперта в Мастере MQL
Типы торговых транзакций
MQL-программы могут не только выполнять торговые операции, но и реагировать на торговые события. Важно отметить, что подобные события возникают не только в результате действия программ, но и по другим причинам, например, при ручном управлении пользователем или выполнении автоматических действий на сервере (срабатывание отложенного ордера, Stop Loss, Take Profit, Stop Out, перенос позиции через "ночь", начисление или списание средств со счета и многое другое).
Вне зависимости от инициатора действий, на счете выполняются торговые транзакции — неделимые шаги, включающие:
- обработку торгового запроса;
- изменение списка действующих ордеров (включая добавление нового ордера, исполнение и удаление сработавшего ордера);
- изменение истории ордеров;
- изменение истории сделок;
- изменение позиций.
В зависимости от сути операции, некоторые шаги могут быть опциональными. Например, модификация защитных уровней у позиции пропустит три средних пункта. А при отсылке приказа о покупке по рынку пройдет полный цикл: запрос обрабатывается, для счета создается соответствующий ордер, происходит исполнение ордера, его удаление из списка активных, добавление в историю ордеров, далее добавляется соответствующая сделка в историю и создается новая позиция. Все эти действия являются торговыми транзакциями.
Для получений уведомлений о таких событиях в эксперте или индикаторе следует описать специальную функцию-обработчик OnTradeTransaction — мы рассмотрим её подробно в следующем разделе. Дело в том, что один из её параметров — первый и самый важный — имеет тип предопределенной структуры MqlTradeTransaction. Поэтому давайте сначала поговорим о транзакциях как таковых.
struct MqlTradeTransaction
|
В следующей таблице описаны все поля структуры.
Поле |
Описание |
---|---|
deal |
Тикет сделки |
order |
Тикет ордера |
symbol |
Имя торгового инструмента, по которому совершена транзакция |
type |
Тип торговой транзакции ENUM_TRADE_TRANSACTION_TYPE (см. ниже) |
order_type |
Тип ордера ENUM_ORDER_TYPE |
order_state |
Состояние ордера ENUM_ORDER_STATE |
deal_type |
Тип сделки ENUM_DEAL_TYPE |
time_type |
Тип ордера по истечению ENUM_ORDER_TYPE_TIME |
time_expiration |
Срок истечения отложенного ордера |
price |
Цена ордера, сделки или позиции, в зависимости от транзакции |
price_trigger |
Стоп-цена (цена срабатывания) стоп-лимитного ордера |
price_sl |
Цена Stop Loss, может относиться к ордеру, сделке или позиции, в зависимости от транзакции |
price_tp |
Цена Take Profit, может относиться к ордеру, сделке или позиции, в зависимости от транзакции |
volume |
Объем в лотах, может указывать на текущий объем ордера, сделки или позиции, в зависимости от транзакции |
position |
Тикет позиции, на которую повлияла транзакция |
position_by |
Тикет встречной позиции |
Некоторые поля имеют смысл только в определенных случаях. В частности, поле time_expiration заполняется для ордеров, у которых в time_type указан один из типов истечения ORDER_TIME_SPECIFIED и ORDER_TIME_SPECIFIED_DAY. Поле price_trigger зарезервировано только для стоп-лимитных ордеров (ORDER_TYPE_BUY_STOP_LIMIT и ORDER_TYPE_SELL_STOP_LIMIT).
Также очевидно, что модификации позиции оперируют тикетом позиции (поле position), но не используют тикеты ордеров или сделок. Кроме того, поле position_by предназначено исключительно для закрытия позиции встречной — открытой по тому же инструменту, но в противоположном направлении.
Определяющей характеристикой для анализа транзакции является ее тип (поле type). В MQL5 API для его описания введено специальное перечисление ENUM_TRADE_TRANSACTION_TYPE, в котором собраны все возможные типы транзакций.
Идентификатор |
Описание |
---|---|
TRADE_TRANSACTION_ORDER_ADD |
Добавление нового ордера |
TRADE_TRANSACTION_ORDER_UPDATE |
Изменение действующего ордера |
TRADE_TRANSACTION_ORDER_DELETE |
Удаление действующего ордера |
TRADE_TRANSACTION_DEAL_ADD |
Добавление сделки в историю |
TRADE_TRANSACTION_DEAL_UPDATE |
Изменение сделки в истории |
TRADE_TRANSACTION_DEAL_DELETE |
Удаление сделки из истории |
TRADE_TRANSACTION_HISTORY_ADD |
Добавление ордера в историю в результате исполнения или отмены |
TRADE_TRANSACTION_HISTORY_UPDATE |
Изменение ордера в истории |
TRADE_TRANSACTION_HISTORY_DELETE |
Удаление ордера из истории |
TRADE_TRANSACTION_POSITION |
Изменение позиции |
TRADE_TRANSACTION_REQUEST |
Уведомление о том, что торговый запрос обработан сервером, и результат его обработки получен |
Сделаем некоторые пояснения.
В транзакции типа TRADE_TRANSACTION_ORDER_UPDATE к изменениям ордера относятся не только явные изменения со стороны клиентского терминала или торгового сервера, но также и изменение его состояния (например, переход из состояния ORDER_STATE_STARTED в ORDER_STATE_PLACED или из ORDER_STATE_PLACED в ORDER_STATE_PARTIAL и т.д.).
При транзакции TRADE_TRANSACTION_ORDER_DELETE ордер может быть удален в результате соответствующего явного запроса или исполнения (заливки) на сервере. В обоих случаях он будет перенесен в историю, и должна также случиться транзакция TRADE_TRANSACTION_HISTORY_ADD.
Транзакция TRADE_TRANSACTION_DEAL_ADD осуществляется не только в результате исполнения ордера, но и проведения операций с балансом счета.
Некоторые транзакции, такие как TRADE_TRANSACTION_DEAL_UPDATE, TRADE_TRANSACTION_DEAL_DELETE, TRADE_TRANSACTION_HISTORY_DELETE довольно редки, так как описывают ситуации, когда сделка или ордер в истории меняется или удаляется на сервере "задним числом". Это, как правило, является следствием синхронизации с внешней торговой системой (биржей).
Важно отметить, что добавление или ликвидация позиции не влечет за собой появление транзакции TRADE_TRANSACTION_POSITION. Данный тип транзакции сообщает о том, что позиция была изменена на стороне торгового сервера, программно или пользователем вручную. В частности, у позиции может быть изменен объем (частичное встречное закрытие, переворот), цена открытия, а также уровни Stop Loss и Take Profit. Некоторые действия, например, доливки, не вызывают это событие.
Все торговые приказы, отдаваемые MQL-программами, находят отражение в транзакциях TRADE_TRANSACTION_REQUEST, что позволяет отложенным способом анализировать их выполнение. Это особенно важно при использовании функции OrderSendAsync, которая сразу возвращает управление в вызывающий код, из-за чего результат не известен. Вместе с тем транзакции точно также генерируются и при использовании "синхронной" OrderSend.
Кроме того, с помощью транзакций TRADE_TRANSACTION_REQUEST можно анализировать и торговые действия пользователя из интерфейса терминала.