Discusión sobre el artículo "Recetas MQL5 - procesamiento del evento TradeTransaction" - página 2

 

Aquí están las entradas de registro de una posición cerrada por un Take Profit disparado. ¿Cómo se puede detectar esto en OnTradeTransaction( const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)?

No se establece el código de retorno de const MqlTradeResult& result (result.retcode) (0 no es una opción, TRADE_RETCODE_DONE = 10009) ni uno de los ids (Deal ticket, Order ticket, Request ID ) para encontrarlos sin hacer un bucle cada vez a través de todos los deal.

Esta es la impresión en la línea #376 que imprime las banderas 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         );
...
  }

Y esto es lo que puedo leer en el diario:

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

El terminal escribe tan bonito "take profit triggered #2 sell 0.01 EURUSD 1.00319 sl: 1.00816 tp: 1.00171 [#3 buy 0.01 EURUSD at 1.00171]"

Entonces, ¿por qué diablos no hay una bandera como TRADE_TRANSACTION_TRIGGERED_PT y TRADE_TRANSACTION_TRIGGERED_SL?

¿Y es que el código de retorno de la solicitud siempre no se establece?

 
Parte de la confusión se debe al hecho de que ENUM_ORDER_TYPE 0 = ORDER_TYPE_BUY. Así que un EA no puede distinguir si el valor del campo se establece con ORDER_TYPE_BUY o anulado por lo tanto no se establece - ¡¡¡genial!!!
 

Denis, ¡gracias por el artículo! Lo he leído con interés, pero todavía no me he dado cuenta del todo de lo que he leído. También he descargado su Asesor Experto TradeProcessor y lo corrió en mi terminal, donde actualmente tengo una posición abierta. Miré las impresiones e inmediatamente aparecieron algunas preguntas, a las que quiero encontrar respuesta por mi cuenta. Bueno, si no puedo hacerlo, tendré que molestarte. ))

Saludos, Vladimir.

 
MrBrooklin posición abierta. Miré las impresiones e inmediatamente aparecieron algunas preguntas, a las que quiero encontrar respuesta por mi cuenta. Bueno, si no puedo hacerlo, tendré que molestarte. ))

Saludos, Vladimir.

Gracias por su opinión. De nada, Sr. Brooklin. ))

 
Denis Kirichenko #:

Gracias por su opinión. ¡De nada, MrBrooklin! ))

Denis, lo siento, pero sin tu ayuda mi mente "explota". Aquí tienes el resultado de una de las pasadas de tu EA (por cierto, ¡¡¡un EA muy chulo!!!):

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

Lo que no entiendo:

  1. mi EA puso una orden pendiente SELL_STOP;
  2. Tu EA escribe - tipo de operación DEAL_TYPE_BY (resaltado en amarillo). Por si acaso, miro en la Guía de Referencia MQL5. Dice que DEAL_TYPE_BY es:

ENUM_DEAL_TYPE

Identificador

Descripción

DEAL_TYPE_BUY

Compra


Pregunta - cómo al modificar una orden pendiente SELL_STOP el tipo de transacción se determina a BUY?????))

Saludos, Vladimir.

 

Y no hay ninguna transacción. La colocación de una orden pendiente y su procesamiento no implican ninguna transacción. Transacción = 0, tipo = 0, donde 0 equivale a DEAL_TYPE_BUY para la enumeración ENUM_DEAL_TYPE. Es decir, en la estructura transMqlTradeTransaction , algunos campos están rellenados y otros no. Los campos no rellenados se suelen anular.

Más detalles: en la Documentación sobre órdenes pendientes.

El campo deal se rellenará para una transacción de este tipo:

TRADE_TRANSACTION_DEAL_*

Los siguientes campos se rellenarán en la estructura MqlTradeTransaction para las transacciones comerciales relacionadas con el procesamiento de transacciones (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE y TRADE_TRANSACTION_DEAL_DELETE):

  • deal - ticket de la operación;
  • orden - ticket de la orden, en base a la cual se ha realizado la operación;
  • símbolo - nombre del instrumento financiero en la operación;
  • type - tipo de operación;
  • deal_type - tipo de operación;
  • price - precio al que se ha realizado la operación;
  • price_sl - Precio Stop Loss (se rellena si está especificado en la orden en base a la cual se realizó la operación);
  • price_tp - precio Take Profit (se rellena, si está especificado en la orden, en base al cual se realizó la operación);
  • volume - volumen de la transacción en lotes.
  • position - ticket de la posición abierta, modificada o cerrada como resultado de la ejecución de la operación.
  • position_by - ticket de una posición contraria. Se rellena sólo para las operaciones de cierre de una posición por contrapartida (out by).


Sólo 3 tipos de transacciones pertenecen a los tipos "deal": TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE, TRADE_TRANSACTION_DEAL_DELETE.

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

Y no hay ninguna transacción. La colocación de una orden pendiente no implica ninguna transacción. Transacción = 0, tipo = 0, donde 0 equivale a DEAL_TYPE_BUY para la enumeración ENUM_DEAL_TYPE . Es decir, en la estructura transMqlTradeTransaction , algunos campos están rellenados y otros no. Los campos no rellenados se suelen poner a cero.

Más detalles: en la Documentación sobre órdenes pendientes.

¡¡¡Ahhhh, ya está!!! Tío, ¡me ha roto la cabeza! ))

¡¡¡Gracias!!!

Saludos, Vladimir.