Обсуждение статьи "Рецепты MQL5 - обработка события TradeTransaction"

 

Опубликована статья Рецепты MQL5 - обработка события TradeTransaction:

В своей статье я хотел бы познакомить читателя с одним из способов контролировать торговые события средствами MQL5. Сразу хочу сказать, что данной теме были посвящены статьи, например «Обработка торговых событий в эксперте при помощи функции OnTrade()». Но в отличие от упомянутого материала я буду использовать другой обработчик – OnTradeTransaction().

Хотелось бы отметить вот какой момент. В текущей версии языка MQL5 формально есть 14 обработчиков событий клиентского терминала. Причём, у программиста есть возможность создавать свои пользовательские события посредством EventChartCustom() и обрабатывать их с помощью OnChartEvent(). Но нигде в Документации нет упоминания такого термина, как «Событийно-ориентированное программирование» (СОП). Ведь именно с учётом принципов СОП создаётся любая программа в MQL5. Возьмите хотя бы любой шаблон будущего советника, когда на шаге «Обработчики событий для советника» пользователю предлагается сделать свой выбор.

Очевидно, что в MQL5 так или иначе используется механизм событийно-ориентированного программирования. В языке могут присутствовать блоки программы, состоящие из двух частей: выборки события и обработки события. Причём, если речь идёт о событиях клиентского терминала, то программисту доступна только вторая часть - обработчик события. Правда, для некоторых событий есть исключения. К ним относятся таймер и пользовательское событие. Контроль данных событий полностью отдан в руки программиста.

Рис.6. Первый шаблон связок транзакционных типов

Рис.6. Первый шаблон связок транзакционных типов

Автор: Dennis Kirichenko

 

По своему опыту могу сказать что реальная необходимость использовать TradeTransaction возникает при программировании в асинхронном режиме. Жаль что в статье не сказано об этом режиме ни слова.

з.ы. А еще думал "Что рецепты MQL" - фирменное название статей Анатолия. А теперь получается что это не так( 

 

С-4, спасибо за мнение.

C-4:

По своему опыту могу сказать что реальная необходимость использовать TradeTransaction возникает при программировании в асинхронном режиме. Жаль что в статье не сказано об этом режиме ни слова...

Есть разные необходимости и потребности, которые могут быть причиной использования обработчика TradeTransaction. Это тема интересная, надеюсь, что опытные коллеги тоже выскажутся по этому вопросу...

з.ы. А еще думал "Что рецепты MQL" - фирменное название статей Анатолия. А теперь получается что это не так(

Да, признаюсь, что Анатолий  является изобретателем этого цикла статей. Мне он понравился, и я скромно приобщился к циклу :-))

Надеюсь, что Анатолий не против...

 
В статье ещё не успел осветить вопрос частичного выполнения ордера (ORDER_STATE_PARTIAL). Вопрос на засыпку, сколько раз произойдёт вызов обработчика TradeTransaction?
 
denkir:
В статье ещё не успел осветить вопрос частичного выполнения ордера (ORDER_STATE_PARTIAL). Вопрос на засыпку, сколько раз произойдёт вызов обработчика TradeTransaction?

Х.з. По логике обработчик должен сработать столько же раз как и при полном исполнении. Потому что исполнение ордера не дискретное событие, и МТ в процессе исполнения ордера не знает будет он исполнен частично или полностью.

з.ы. К сожалению доставка событий не гарантирована, а сами события работают только в режиме реального времени, что делает их применение ограниченным. Но они крайне полезны для систем основанных на отслеживании состояний, например асинхронных систем или копировщиков торговли. Благодаря событиям можно построить алгоритм без зацикливаний и дополнительных тормозов связанных с ожиданиями события OnTimer.

 
denkir:

...

Надеюсь, что Анатолий не против...

Нет конечно, не против. ) Тем более, что...

C-4:

...

з.ы. А еще думал "Что рецепты MQL" - фирменное название статей Анатолия. А теперь получается что это не так( 

 ...ярлык "Рецепты MQL5" был предложен редакцией MQ, поэтому его может использовать кто-угодно. Главное, чтобы статей в принципе было больше и разных.

 
В справочном руководстве четко говорится, что последовательность НЕ гарантировата!  Если смотреть на исторических данных, то и там последовательность совсем другая. 
 

Денис, спасибо за статью! С интересом прочитал, но ещё пока до конца не осознал прочитанное. Так же скачал Ваш советник TradeProcessor и запустил на своем терминале, где у меня сейчас имеется открытая позиция. Посмотрел распечатки и сразу же появились вопросы, на которые хочу самостоятельно найти ответы. Ну, уж если не сдюжу, то тогда, не обессудьте - придётся Вас побеспокоить. ))

С уважением, Владимир. 

 
MrBrooklin #:

Денис, спасибо за статью! С интересом прочитал, но ещё пока до конца не осознал прочитанное. Так же скачал Ваш советник TradeProcessor и запустил на своем терминале, где у меня сейчас имеется открытая позиция. Посмотрел распечатки и сразу же появились вопросы, на которые хочу самостоятельно найти ответы. Ну, уж если не сдюжу, то тогда, не обессудьте - придётся Вас побеспокоить. ))

С уважением, Владимир. 

Спасибо за мнение. You are welcome, MrBrooklin! ))

 
Denis Kirichenko #:

Спасибо за мнение. You are welcome, MrBrooklin! ))

Денис, извините, но без Вашей помощи моё сознание "взрывается". Вот результат одного из проходов Вашего советника (кстати, очень классный советник!!!):

2023.10.27 17:11:02.514 TradeProcessor (EURUSDrfd,D1)   Проход : #100
2023.10.27 17:11:02.514 TradeProcessor (EURUSDrfd,D1)   Поступил запрос: изменить параметры отложенного ордера
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   ---===Транзакция===---
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тикет сделки: 0
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип сделки: DEAL_TYPE_BUY
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тикет ордера: 1030195768
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Состояние ордера: ORDER_STATE_PLACED
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип ордера: ORDER_TYPE_SELL_STOP
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Цена: 1.05853
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Уровень Stop Loss: 1.(скрыл значения стоп-лосса)
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Уровень Take Profit: 1.05803
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Цена срабатывания стоп-лимитного ордера: 0.00000
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Торговый инструмент: EURUSDrfd
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Срок истечения отложенного ордера: 2023.10.27 00:00
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип ордера по времени действия: ORDER_TIME_DAY
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_UPDATE
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тикет позиции: 0
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Объём в лотах: 0.04
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Проход : #101

В чём моё непонимание:

  1. мой советник выставил отложенный ордер SELL_STOP;
  2. Ваш советник пишет - тип сделки DEAL_TYPE_BY (выделил жёлтым цветом). На всякий случай смотрю в Справочник MQL5. Там написано, что  DEAL_TYPE_BY это: 

ENUM_DEAL_TYPE

Идентификатор

Описание

DEAL_TYPE_BUY

Покупка


Вопрос - как при модификации отложенного ордера SELL_STOP тип сделки определяется на ПОКУПКУ??? ))

С уважением, Владимир.

 

А сделки никакой нет. Выставление отложенного ордера и его обработка не влечёт за собой никакой сделки. Тикет сделки = 0, тип = 0, где 0 - это для перечисления  ENUM_DEAL_TYPE эквивалентно  DEAL_TYPE_BUY. Т.е. в структуре MqlTradeTransaction trans некоторые поля заполняются, а некоторые нет. Незаполненные поля обычно обнулены.

Подробнее: в Документации про отложенные ордера.

Поле deal будет заполнено для транзакции такого типа:

TRADE_TRANSACTION_DEAL_*

Для торговых транзакций, касающихся обработки сделок (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE и TRADE_TRANSACTION_DEAL_DELETE), в структуре MqlTradeTransaction заполняются следующие поля:

  • deal - тикет сделки;
  • order - тикет ордера, на основе которого совершена сделка;
  • symbol - имя финансового инструмента в сделке;
  • type - тип торговой транзакции;
  • deal_type - тип сделки;
  • price - цена, по которой совершена сделка;
  • price_sl - цена Stop Loss (заполняется, если указана в ордере, на основе которого совершена сделка);
  • price_tp - цена Take Profit (заполняется, если указана в ордере, на основе которого совершена сделка);
  • volume - объем сделки в лотах.
  • position - тикет позиции, открытой, измененной или закрытой в результате исполнения сделки.
  • position_by - тикет встречной позиции. Заполняется только для сделок на закрытие позиции встречной (out by).


К "сделочным" типам транзакций относятся всего 3 типа:  TRADE_TRANSACTION_DEAL_ADD,  TRADE_TRANSACTION_DEAL_UPDATE,  TRADE_TRANSACTION_DEAL_DELETE.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
  • www.mql5.com
Структура торговой транзакции - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: