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

 

Вот записи журнала о закрытии позиции по сработавшему тейк-профиту. Как это можно обнаружить в OnTradeTransaction( const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)?

Не установлен ни код возврата const MqlTradeResult& result (result.retcode) (0 - нет опции, TRADE_RETCODE_DONE = 10009), ни один из идентификаторов (Deal ticket, Order ticket, Request ID ), чтобы найти их, не перебирая каждый раз все сделки.

Это Print в строке #376, который выводит соответствующие(?) флаги:

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
...// line 376:
   Print(__LINE__," ",counter," prc:",_ToStr2Dig(trans.price)," tckt: ",trans.position //," pTrigg:",_ToStr2Dig(trans.price_trigger)
            ," Tr.Type: ",EnumToString(trans.type)//, "DL.Type: ",EnumToString(trans.deal_type)
            ," Tr.OrdType: ",EnumToString(trans.order_type)," Tr.OrdFill: ",EnumToString(trans.order_state)
            ," Tr.tckt:",trans.order," ",trans.position," ",trans.position_by
            ," retCode:",result.retcode," ",result.deal," ",result.order," ",result.deal," ",result.request_id         );
...
  }

А это то, что я могу прочитать в журнале:

10:04:40   take profit triggered #2 sell 0.01 EURUSD 1.00319 sl: 1.00816 tp: 1.00171 [#3 buy 0.01 EURUSD at 1.00171]
10:04:40   deal #3 buy 0.01 EURUSD at 1.00171 done (based on order #3)
10:04:40   deal performed [#3 buy 0.01 EURUSD at 1.00171]
10:04:40   order performed buy 0.01 at 1.00171 [#3 buy 0.01 EURUSD at 1.00171]
10:04:40   373  New trade operation dTime1970.01.01 09:03:41
10:04:40   376 0 prc:trans.price=1.00171   tckt: 2 Tr.Type: TRADE_TRANSACTION_DEAL_ADD Tr.OrdType: ORDER_TYPE_BUY Tr.OrdFill: ORDER_STATE_STARTED Tr.tckt:3 2 0 retCode:0 0 0 0 0
10:04:40   489 MqlTradeTransaction: TRADE_TRANSACTION_DEAL_ADD deal #3 DEAL_TYPE_BUY EURUSD 0.01 lot   
10:04:40   376 1 prc:trans.price=1.00171   tckt: 2 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE Tr.OrdType: ORDER_TYPE_BUY Tr.OrdFill: ORDER_STATE_FILLED Tr.tckt:3 2 0 retCode:0 0 0 0 0
10:04:40   383 1 prc:trans.price=1.00171   tckt: 2  res.Ord:0 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE Tr.OrdFill: ORDER_STATE_FILLED Tr.OrdType: ORDER_TYPE_BUY Tr.tckt:3 2 0 Res::0 0 0 0 0
10:04:40   408 PosExists #3 2 mag:0 ORDER_STATE_FILLED ORDER_TYPE_BUY
10:04:40   376 2 prc:trans.price=1.00171   tckt: 2 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD Tr.OrdType: ORDER_TYPE_BUY Tr.OrdFill: ORDER_STATE_FILLED Tr.tckt:3 2 0 retCode:0 0 0 0 0
10:04:40   408 PosExists #3 2 mag:0 ORDER_STATE_FILLED ORDER_TYPE_BUY
2022.09.26 14:08:33.755    disconnected

Терминал так красиво пишет "Take profit triggered #2 sell 0.01 EURUSD 1.00319 sl: 1.00816 tp: 1.00171 [#3 buy 0.01 EURUSD at 1.00171]".

Так почему же, черт возьми, нет флагов типа TRADE_TRANSACTION_TRIGGERED_PT и TRADE_TRANSACTION_TRIGGERED_SL?

И всегда ли код возврата запроса не установлен?

 
Часть путаницы связана с тем, что ENUM_ORDER_TYPE 0 = ORDER_TYPE_BUY. Поэтому советник не может отличить, установлено ли значение поля с ORDER_TYPE_BUY или обнулено, поэтому не установлено - отлично!!!
 

Денис, спасибо за статью! С интересом прочитал, но ещё пока до конца не осознал прочитанное. Так же скачал Ваш советник 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
 
Denis Kirichenko #:

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

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

А-а-а, вот оно что!!! Блин, всю голову сломал! ))

Спасибо!!!

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