- OnStart
- OnInit
- OnDeinit
- OnTick
- OnCalculate
- OnTimer
- OnTrade
- OnTradeTransaction
- OnBookEvent
- OnChartEvent
- OnTester
- OnTesterInit
- OnTesterDeinit
- OnTesterPass
OnTradeTransaction
Вызывается в экспертах при наступлении события TradeTransaction. Функция предназначена для обработки результатов выполнения торгового запроса.
void OnTradeTransaction()
|
Параметры
trans
[in] Переменная типа MqlTradeTransaction с описанием транзакции, проведенной на торговом счете.
request
[in] Переменная типа MqlTradeRequest с описанием торгового запроса, породившего транзакцию. Содержит значения только для транзакции типа TRADE_TRANSACTION_REQUEST.
result
[in] Переменная типа MqlTradeResult с результатом выполнения торгового запроса, породившего транзакцию. Содержит значения только для транзакции типа TRADE_TRANSACTION_REQUEST.
Возвращаемое значение
Нет возвращаемого значения
Примечание
OnTradeTransaction() вызывается для обработки события TradeTransaction, которое торговый сервер посылает терминалу в следующих случаях:
- отправка торгового запроса из MQL5-программы при помощи функций OrderSend()/OrderSendAsync() и его последующее исполнение;
- отправка торгового запроса вручную через графический интефейс и его последующее исполнение;
- срабатывания отложенных ордеров и стоп-ордеров на сервере;
- выполнения операций на стороне торгового сервера.
Информация о типе транзакции содержится в поле type переменной trans. Типы торговых транзакций описываются в перечислении 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_REQUEST для получения дополнительной информации необходимо анализировать второй и третий параметры функции OnTradeTransaction() – request и result.
Отправка торгового запроса на покупку приводит к цепи торговых транзакций, которые совершаются на торговом счете: 1) запрос принимается на обработку, 2) далее для счета создается соответствующий ордер на покупку, 3) затем происходит исполнение ордера, 4) удаление исполненного ордера из списка действующих, 5) добавление в историю ордеров, 6) далее добавляется соответствующая сделка в историю и 7) создается новая позиция. Все эти действия являются торговыми транзакциями. Приход каждой такой транзакции в терминал является событием TradeTransaction. При этом очередность поступления этих транзакций в терминал не гарантирована, поэтому нельзя свой торговый алгоритм строить на ожидании поступления одних торговых транзакций после прихода других.
Во время обработки торговых транзакций экспертом при помощи обработчика OnTradeTransaction(), терминал продолжает обрабатывать вновь поступающие торговые транзакции. Таким образом, состояние торгового счета может измениться уже в процессе работы OnTradeTransaction(). Например, пока MQL5-программа обрабатывает событие добавления нового ордера, он может быть исполнен, удален из списка открытых и перемещен в историю. В дальнейшем программа будет уведомлена о всех этих событиях.
Длина очереди транзакций составляет 1024 элемента. Если OnTradeTransaction() будет обрабатывать очередную транзакцию слишком долго, старые транзакции в очереди могут быть вытеснены более новыми.
Обработчик OnTrade() вызывается после соответствующих вызовов OnTradeTransaction(). В общем случае нет точного соотношения по количеству вызовов OnTrade() и OnTradeTransaction(). Один вызов OnTrade() соответствует одному или нескольким вызовам OnTradeTransaction.
Каждое событие Trade может быть результатом одного или нескольких торговых запросов. Торговые запросы отправляются на сервер с помощью OrderSend() или OrderSendAsync(). Каждый запрос может порождать несколько торговых событий. Нельзя полагаться на правило "Один запрос - Одно событие Trade", так как обработка запросов может происходить в несколько этапов и каждая операция может изменять состояние ордеров, позиций и торговой истории.
Пример эксперта c обработчиком OnTradeTransaction()
//+------------------------------------------------------------------+
|
Смотри также
OrderSend, OrderSendAsync, OnTradeTransaction, Структура торгового запроса, Структура торговой транзакции, Типы торговых транзакций, Типы торговых операций, События клиентского терминала