Discussione sull’articolo "Manuale MQL5: Elaborazione dell'evento TradeTransaction" - pagina 2

 

Ecco le voci di log di una posizione chiusa da un Take Profit attivato. Come si può rilevare questo in OnTradeTransaction( const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)?

Non è impostato né il codice di ritorno di const MqlTradeResult& result (result.retcode) (0 non è un'opzione, TRADE_RETCODE_DONE = 10009) né uno degli id (Deal ticket, Order ticket, Request ID) per trovarli senza passare ogni volta attraverso tutte le transazioni.

Questa è la stampa alla riga #376 che stampa i flag rilevanti(?):

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 questo è ciò che posso leggere nel 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

Il terminale scrive così bene "take profit triggered #2 sell 0.01 EURUSD 1.00319 sl: 1.00816 tp: 1.00171 [#3 buy 0.01 EURUSD at 1.00171]".

Allora perché diavolo non c'è un flag come TRADE_TRANSACTION_TRIGGERED_PT e TRADE_TRANSACTION_TRIGGERED_SL?

E il codice di ritorno della richiesta non è sempre impostato?

 
Parte della confusione è dovuta al fatto che ENUM_ORDER_TYPE 0 = ORDER_TYPE_BUY. Quindi un EA non può distinguere se il valore del campo è impostato con ORDER_TYPE_BUY o se è nullificato e quindi non impostato - fantastico!!!
 

Denis, grazie per l'articolo! L'ho letto con interesse, ma non ho ancora realizzato appieno ciò che ho letto. Ho anche scaricato il tuo Expert Advisor TradeProcessor e l'ho eseguito sul mio terminale, dove attualmente ho una posizione aperta. Ho guardato i tabulati e mi sono subito apparse alcune domande alle quali voglio trovare risposta da solo. Se non sono in grado di farlo, dovrò disturbare voi. ))

Saluti, Vladimir.

 
MrBrooklin posizione aperta. Ho guardato i tabulati e mi sono subito apparse alcune domande alle quali voglio trovare risposta da solo. Se non sono in grado di farlo, dovrò disturbare voi. ))

Saluti, Vladimir.

Grazie per la sua opinione. Non c'è di che, MrBrooklin! ))

 
Denis Kirichenko #:

Grazie per la sua opinione. Non c'è di che, MrBrooklin! ))

Denis, scusa, ma senza il tuo aiuto la mia mente "esplode". Ecco il risultato di uno dei passaggi del tuo EA (tra l'altro, un EA molto bello!!!):

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

Quello che non capisco:

  1. il mio EA ha piazzato un ordine pendente SELL_STOP;
  2. Il tuo EA scrive - trade type DEAL_TYPE_BY (evidenziato in giallo). Per sicurezza, guardo nella Guida di riferimento MQL5. Dice che DEAL_TYPE_BY è:

ENUM_DEAL_TYPE

Identificatore

Descrizione

DEAL_TYPE_BUY

Comprare


Domanda: in che modo quando si modifica un ordine pendente SELL_STOP il tipo di transazione viene determinato in BUY?????))

Saluti, Vladimir.

 

E non c'è alcuna transazione. L'inserimento di un ordine pendente e la sua elaborazione non comportano alcuna transazione. Trade ticket = 0, type = 0, dove 0 equivale a DEAL_TYPE_BUY per l'enumerazione ENUM_DEAL_TYPE. Cioè, nella struttura transMqlTradeTransaction , alcuni campi sono popolati e altri no. I campi non riempiti vengono solitamente annullati.

Maggiori dettagli: nella Documentazione sugli ordini pendenti.

Il campo deal sarà popolato per una transazione di questo tipo:

TRADE_TRANSACTION_DEAL_*

I seguenti campi sono popolati nella struttura MqlTradeTransaction per le transazioni commerciali relative all'elaborazione delle transazioni (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE e TRADE_TRANSACTION_DEAL_DELETE):

  • deal - biglietto della transazione;
  • ordine - ticket dell'ordine in base al quale è stata effettuata la transazione;
  • simbolo - nome dello strumento finanziario oggetto della transazione;
  • type - tipo di transazione commerciale;
  • deal_type - tipo di transazione;
  • prezzo - prezzo al quale è stata effettuata l'operazione;
  • price_sl - prezzo Stop Loss (viene inserito se è specificato nell'ordine in base al quale è stata effettuata l'operazione);
  • price_tp - prezzo di Take Profit (viene inserito, se specificato nell'ordine, sulla base del quale è stata effettuata l'operazione);
  • volume - volume dell'operazione in lotti.
  • position - ticket di una posizione aperta, modificata o chiusa in seguito all'esecuzione di un'operazione.
  • position_by - ticket di una posizione contraria. Viene compilato solo per le operazioni di chiusura di una posizione in contropartita (out by).


Solo 3 tipi di transazioni appartengono ai tipi "deal": TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE, TRADE_TRANSACTION_DEAL_DELETE.

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

E non c'è alcuna transazione. L'inserimento di un ordine pendente non comporta alcuna transazione. Trade ticket = 0, type = 0, dove 0 equivale a DEAL_TYPE_BUY per l'enumerazione ENUM_DEAL_TYPE. Cioè, nella struttura transMqlTradeTransaction , alcuni campi sono popolati e altri no. I campi non riempiti sono solitamente azzerati.

Maggiori dettagli: nella Documentazione sugli ordini pendenti.

Ahhhh, ecco!!! Cavolo, mi ha rotto le scatole! ))

Grazie!!!

Saluti, Vladimir.