Discussão do artigo "Guia Prático do MQL5: Processamento do Evento TradeTransaction" - página 2

 

Aqui estão as entradas de registro de uma posição fechada por um Take Profit acionado. Como isso pode ser detectado em OnTradeTransaction( const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)?

Nem o código de retorno do const MqlTradeResult& result (result.retcode) é definido (0 não é uma opção, TRADE_RETCODE_DONE = 10009) nem um dos IDs (ticket da transação, ticket do pedido, ID da solicitação) para encontrá-los sem fazer um looping a cada vez em todas as transações.

Este é o Print na linha #376 que imprime os sinalizadores relevantes(?):

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         );
...
  }

E isso é o que posso ler no diário:

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

O terminal escreve lindamente "take profit triggered #2 sell 0.01 EURUSD 1.00319 sl: 1.00816 tp: 1.00171 [#3 buy 0.01 EURUSD at 1.00171]"

Então, por que diabos não há um sinalizador como TRADE_TRANSACTION_TRIGGERED_PT e TRADE_TRANSACTION_TRIGGERED_SL?

E o código de retorno da solicitação não é sempre definido?

 
Parte da confusão se deve ao fato de que ENUM_ORDER_TYPE 0 = ORDER_TYPE_BUY. Portanto, um EA não consegue distinguir se o valor do campo está definido com ORDER_TYPE_BUY ou se está anulado e, portanto, não está definido - ótimo!!!
 

Denis, obrigado pelo artigo! Eu o li com interesse, mas ainda não me dei conta do que li. Também baixei seu Expert Advisor TradeProcessor e o executei em meu terminal, onde atualmente tenho uma posição aberta. Dei uma olhada nas impressões e imediatamente surgiram algumas perguntas, para as quais quero encontrar respostas por conta própria. Bem, se eu não conseguir fazer isso, terei que incomodá-lo. ))

Saudações, Vladimir.

 
MrBrooklin posição aberta. Dei uma olhada nas impressões e imediatamente surgiram algumas perguntas, para as quais quero encontrar respostas por conta própria. Bem, se eu não conseguir fazer isso, terei que incomodá-lo. ))

Saudações, Vladimir.

Obrigado por sua opinião. De nada, Sr. Brooklin! ))

 
Denis Kirichenko #:

Obrigado por sua opinião. De nada, Sr. Brooklin! ))

Denis, desculpe, mas sem sua ajuda minha mente "explode". Aqui está o resultado de uma das passagens de seu EA (a propósito, um EA muito legal!!!):

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

O que não estou entendendo:

  1. Meu EA colocou uma ordem pendente SELL_STOP;
  2. Seu EA escreve - tipo de negociação DEAL_TYPE_BY (destacado em amarelo). Por via das dúvidas, dei uma olhada no Guia de Referência MQL5. Ele diz que DEAL_TYPE_BY é:

ENUM_DEAL_TYPE

Identificador

Descrição

DEAL_TYPE_BUY

Comprar


Pergunta - como, ao modificar uma ordem pendente SELL_STOP, o tipo de transação é determinado como BUY?????))

Atenciosamente, Vladimir.

 

E não há nenhuma transação. A colocação de uma ordem pendente e seu processamento não implicam em nenhuma transação. Tíquete de negociação = 0, tipo = 0, em que 0 é equivalente a DEAL_TYPE_BUY para a enumeração ENUM_DEAL_TYPE. Ou seja, na estrutura transMqlTradeTransaction , alguns campos são preenchidos e outros não. Os campos não preenchidos geralmente são anulados.

Mais detalhes: na Documentação sobre ordens pendentes.

O campo deal será preenchido para uma transação desse tipo:

TRADE_TRANSACTION_DEAL_*

Os campos a seguir são preenchidos na estrutura MqlTradeTransaction para transações comerciais relacionadas ao processamento de transações (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE e TRADE_TRANSACTION_DEAL_DELETE):

  • deal - o tíquete da negociação;
  • ordem - tíquete da ordem, com base na qual a transação foi feita;
  • símbolo - nome do instrumento financeiro na transação;
  • type - tipo de transação comercial;
  • deal_type - tipo da transação;
  • price - preço pelo qual a transação foi feita;
  • price_sl - preço de Stop Loss (é preenchido se for especificado na ordem com base na qual a transação foi feita);
  • price_tp - preço Take Profit (é preenchido, se estiver especificado na ordem, com base no qual a transação foi feita);
  • volume - volume da transação em lotes.
  • position - ticket de uma posição aberta, alterada ou fechada como resultado da execução de uma transação.
  • position_by - ticket de uma posição contrária. É preenchido somente para negociações de fechamento de uma posição contrária (out by).


Apenas 3 tipos de transações pertencem aos tipos de "transação": TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE, TRADE_TRANSACTION_DEAL_DELETE.

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

E não há nenhuma transação. A colocação de uma ordem pendente não implica em nenhuma transação. Tíquete de negociação = 0, tipo = 0, em que 0 é equivalente a DEAL_TYPE_BUY para a enumeração ENUM_DEAL_TYPE. Ou seja, na estrutura transMqlTradeTransaction , alguns campos são preenchidos e outros não. Os campos não preenchidos geralmente são zerados.

Mais detalhes: na Documentação sobre ordens pendentes.

Ahhhh, é isso!!! Cara, isso quebrou minha cabeça! ))

Obrigado!!!

Abraços, Vladimir.