Diskussion zum Artikel "MQL5-Kochbuch: Verarbeitung des TradeTransaction-Ereignisses" - Seite 2

 

Hier sind die Log-Einträge einer Position, die durch einen ausgelösten Take Profit geschlossen wurde. Wie kann dies in OnTradeTransaction( const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) erkannt werden?

Weder der Rückgabewert von const MqlTradeResult& result (result.retcode) ist gesetzt (0 ist keine Option, TRADE_RETCODE_DONE = 10009) noch eine der IDs (Deal Ticket, Order Ticket, Request ID ), um sie zu finden, ohne jedes Mal eine Schleife durch alle Deals zu machen.

Dies ist der Druck in Zeile #376, der die relevanten(?) Flags ausgibt:

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.Typ: ",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         );
...
  }

Und das ist, was ich im Journal lesen kann:

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

Das Terminal schreibt so schön "take profit triggered #2 sell 0.01 EURUSD 1.00319 sl: 1.00816 tp: 1.00171 [#3 buy 0.01 EURUSD at 1.00171]"

Warum zum Teufel gibt es dann kein Flag wie TRADE_TRANSACTION_TRIGGERED_PT und TRADE_TRANSACTION_TRIGGERED_SL?

Und ist der Returncode der Anfrage immer nicht gesetzt?

 
Ein Teil der Verwirrung ist auf die Tatsache zurückzuführen, dass ENUM_ORDER_TYPE 0 = ORDER_TYPE_BUY ist. Ein EA kann also nicht unterscheiden, ob der Wert des Feldes mit ORDER_TYPE_BUY gesetzt ist oder nichtig, also nicht gesetzt ist - toll!!!
 

Denis, ich danke Ihnen für den Artikel! Ich habe ihn mit Interesse gelesen, aber ich habe noch nicht ganz realisiert, was ich gelesen habe. Ich habe auch Ihren TradeProcessor Expert Advisor heruntergeladen und ihn auf meinem Terminal laufen lassen, wo ich derzeit eine offene Position habe. Ich habe mir die Ausdrucke angesehen und sofort sind einige Fragen aufgetaucht, auf die ich selbst Antworten finden möchte. Wenn ich das nicht schaffe, muss ich Sie bemühen. ))

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin offene Position habe. Ich habe mir die Ausdrucke angesehen und sofort sind einige Fragen aufgetaucht, auf die ich selbst Antworten finden möchte. Wenn ich das nicht schaffe, muss ich Sie bemühen. ))

Mit freundlichen Grüßen, Vladimir.

Ich danke Ihnen für Ihre Meinung. Gern geschehen, MrBrooklin! ))

 
Denis Kirichenko #:

Ich danke Ihnen für Ihre Meinung. Gern geschehen, MrBrooklin! ))

Denis, sorry, aber ohne Ihre Hilfe "explodiert" mein Verstand. Hier ist das Ergebnis eines der Durchläufe deines EA (übrigens ein sehr cooler EA!!!):

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

Was ich nicht verstehe:

  1. Mein EA hat eine Pending Order SELL_STOP gesetzt;
  2. Ihr EA schreibt - Handelstyp DEAL_TYPE_BY (gelb hervorgehoben). Vorsichtshalber schaue ich im MQL5 Reference Guide nach. Es sagt, dass DEAL_TYPE_BY ist:

ENUM_DEAL_TYPE

Bezeichner

Beschreibung

DEAL_TYPE_BUY

Kaufen


Frage - wie wird beim Ändern einer schwebenden Order SELL_STOP die Transaktionsart auf BUY????? festgelegt? ))

Mit freundlichen Grüßen, Vladimir.

 

Und es findet keine Transaktion statt. Die Erteilung eines schwebenden Auftrags und seine Bearbeitung sind nicht mit einer Transaktion verbunden. Handelsticket = 0, Typ = 0, wobei 0 für die Aufzählung ENUM_DEAL_TYPE dem DEAL_TYPE_BUY entspricht. Das heißt, dass in der TransstrukturMqlTradeTransaction einige Felder ausgefüllt sind und andere nicht. Die nicht ausgefüllten Felder werden in der Regel nulled.

Weitere Einzelheiten: in der Dokumentation über schwebende Aufträge.

Das Feld "Deal" wird für eine Transaktion dieses Typs ausgefüllt:

TRADE_TRANSACTION_DEAL_*

Die folgenden Felder werden in der Struktur MqlTradeTransaction für Handelstransaktionen im Zusammenhang mit der Transaktionsverarbeitung (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE und TRADE_TRANSACTION_DEAL_DELETE) ausgefüllt:

  • deal - das Ticket des Geschäfts;
  • Order - Ticket der Order, auf deren Grundlage das Geschäft getätigt wurde;
  • symbol - Name des Finanzinstruments, das Gegenstand des Geschäfts ist;
  • type - Art des Handelsgeschäfts;
  • deal_type - Art des Geschäfts;
  • price - Preis, zu dem das Geschäft getätigt wurde;
  • price_sl - Stop-Loss-Kurs (er wird eingetragen, wenn er in der Order, auf deren Grundlage das Geschäft zustande gekommen ist, angegeben ist);
  • price_tp - Take-Profit-Kurs (er wird eingetragen, wenn er in der Order angegeben ist, auf deren Grundlage das Geschäft zustande gekommen ist);
  • volume - Volumen des Geschäfts in Lots.
  • position - ein Ticket für eine Position, die infolge einer Geschäftsausführung eröffnet, geändert oder geschlossen wurde.
  • position_by - ein Ticket für eine Gegenposition. Er wird nur bei Geschäften zur Schließung einer Position durch Gegenposition (out by) ausgefüllt.


Nur 3 Arten von Transaktionen gehören zu den "Deal"-Typen: TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE, TRADE_TRANSACTION_DEAL_DELETE.

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

Und es findet keine Transaktion statt. Die Erteilung eines schwebenden Auftrags hat keine Transaktion zur Folge. Handelsticket = 0, Typ = 0, wobei 0 für die Aufzählung ENUM_DEAL_TYPE gleich bedeutend mit DEAL_TYPE_BUY ist. Das heißt, dass in der TransstrukturMqlTradeTransaction einige Felder ausgefüllt sind und andere nicht. Die nicht ausgefüllten Felder werden in der Regel auf Null gesetzt.

Weitere Einzelheiten: in der Dokumentation über schwebende Aufträge.

Ahhhh, das ist es!!! Mann, das hat mir den Kopf zerbrochen! ))

Vielen Dank!!!

Mit freundlichen Grüßen, Vladimir.