Типы торговых транзакций

MQL-программы могут не только выполнять торговые операции, но и реагировать на торговые события. Важно отметить, что подобные события возникают не только в результате действия программ, но и по другим причинам, например, при ручном управлении пользователем или выполнении автоматических действий на сервере (срабатывание отложенного ордера, Stop Loss, Take Profit, Stop Out, перенос позиции через "ночь", начисление или списание средств со счета и многое другое).

Вне зависимости от инициатора действий, на счете выполняются торговые транзакции — неделимые шаги, включающие:

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

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

Для получений уведомлений о таких событиях в эксперте или индикаторе следует описать специальную функцию-обработчик OnTradeTransaction — мы рассмотрим её подробно в следующем разделе. Дело в том, что один из её параметров — первый и самый важный — имеет тип предопределенной структуры MqlTradeTransaction. Поэтому давайте сначала поговорим о транзакциях как таковых.

struct MqlTradeTransaction

   ulong                         deal;             // Тикет сделки 
   ulong                         order;            // Тикет ордера 
   string                        symbol;           // Имя торгового инструмента 
   ENUM_TRADE_TRANSACTION_TYPE   type;             // Тип торговой транзакции 
   ENUM_ORDER_TYPE               order_type;       // Тип ордера 
   ENUM_ORDER_STATE              order_state;      // Состояние ордера 
   ENUM_DEAL_TYPE                deal_type;        // Тип сделки 
   ENUM_ORDER_TYPE_TIME          time_type;        // Тип ордера по времени действия 
   datetime                      time_expiration;  // Срок истечения ордера 
   double                        price;            // Цена 
   double                        price_trigger;    // Цена срабатывания стоп-лимитного ордера 
   double                        price_sl;         // Уровень Stop Loss 
   double                        price_tp;         // Уровень Take Profit 
   double                        volume;           // Объем в лотах 
   ulong                         position;         // Тикет позиции 
   ulong                         position_by;      // Тикет встречной позиции 
};

В следующей таблице описаны все поля структуры.

Поле

Описание

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 можно анализировать и торговые действия пользователя из интерфейса терминала.