Aus meiner Erfahrung kann ich sagen, dass die wirkliche Notwendigkeit, TradeTransaction zu verwenden, bei der Programmierung im asynchronen Modus entsteht. Es ist schade, dass der Artikel nicht ein Wort über diesen Modus sagt.
s.s. Ich dachte auch, "Welche MQL-Rezepte". - wäre ein Markentitel von Anatolys Artikeln. Aber jetzt stellt sich heraus, dass es nicht so ist(
C-4, ich danke Ihnen für Ihre Meinung.
C-4:
Aus meiner Erfahrung kann ich sagen, dass die wirkliche Notwendigkeit, TradeTransaction zu verwenden, bei der Programmierung im asynchronen Modus entsteht. Es ist schade, dass der Artikel kein Wort über diesen Modus verliert...
Es gibt unterschiedliche Bedürfnisse und Anforderungen, die der Grund für die Verwendung des TradeTransaction-Handlers sein können. Dies ist ein interessantes Thema, ich hoffe, dass erfahrene Kollegen sich auch zu diesem Thema äußern werden...
s.s. Ich dachte auch, dass "MQL-Rezepte". - war der Markenname der Artikel von Anatoly. Und jetzt stellt sich heraus, dass es das nicht ist(
Ja, ich gebe zu, dass Anatoly der Erfinder dieser Serie von Artikeln ist. Ich mochte sie, also habe ich mich bescheiden dem Zyklus angeschlossen :-))))
Ich hoffe, Anatoly hat nichts dagegen....
Ich hatte noch keine Zeit, die Frage der teilweisen Auftragsausführung(ORDER_STATE_PARTIAL) in diesem Artikel zu behandeln. Frage an Sie: Wie oft wird der TradeTransaction-Handler aufgerufen?
Ich weiß es nicht. Logischerweise sollte der Handler genauso oft ausgelöst werden wie bei einer vollständigen Ausführung. Denn die Auftragsausführung ist kein diskretes Ereignis, und MT weiß nicht, ob der Auftrag teilweise oder vollständig ausgeführt wird.
s.s. Leider ist die Zustellung von Ereignissen nicht garantiert, und die Ereignisse selbst funktionieren nur in Echtzeit, so dass ihre Anwendung begrenzt ist. Sie sind jedoch äußerst nützlich für Systeme, die auf der Verfolgung von Zuständen basieren, wie z. B. asynchrone Systeme oder Handelskopierer. Dank der Ereignisse ist es möglich, einen Algorithmus ohne Schleifen und zusätzliche Bremsen aufzubauen, die mit dem Warten auf OnTimer-Ereignisse verbunden sind.
...
Ich hoffe, Anatoly hat nichts dagegen...
Nein, natürlich stört es ihn nicht. ) Zumal...
...
s.s. Ich dachte auch, "MQL-Rezepte". - sei ein Markenname für Anatolys Artikel. Jetzt stellt sich heraus, dass es das nicht ist(
...Die Bezeichnung "MQL5 Recipes" wurde von der MQ-Redaktion vorgeschlagen, kann also von jedem verwendet werden. Die Hauptsache ist, dass es mehr und andere Artikel gibt.
Vielen Dank für diesen Artikel. Er ist sehr nützlich.
Hallo,
Meine Situation scheint recht einfach zu sein: Ich platziere eine Pending Order (Sell_Stop) und möchte reagieren können, wenn a) die Pending Order ausgeführt wird und b) die offene Position entweder durch Stop Loss oder Profit Target geschlossen wurde.
Verstehe ich es richtig, dass:
- Wenn die Pending Order ausgeführt wurde, kann ich die magische Zahl nur durch Abfrage aus der Liste der Positionen erhalten, obwohl der Parameter "request" von OnTradeTransaction() das Feld "magic" besitzt, z.B.:
if(!PositionSelectByTicket(trans.position)) {Print(__LINE__," PositionSelectByTicket FAILED ",err());} else { OpnPos[sz].mag = PositionGetInteger(POSITION_MAGIC); }
- die verschiedenen Transaktionstypen, so dass ich nicht wissen kann, ob die Verkaufsposition eröffnet oder geschlossen wurde:
void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { //--- //--- static int counter=0; // Zähler der OnTradeTransaction()-Aufrufe static uint lasttime=0; // Zeitpunkt des letzten Aufrufs von OnTradeTransaction() //--- uint time=GetTickCount(); //--- wenn die letzte Transaktion vor mehr als 1 Sekunde durchgeführt wurde, if(time-lasttime>1000) { counter=0; // dann handelt es sich um einen neuen Handelsvorgang, und der Zähler kann zurückgesetzt werden if(IS_DEBUG_MODE) Print(__LINE__," "," New trade operation dTime",time-lasttime); } Print(__LINE__," ",counter," ",DoubleToString((double(lasttime=time)/1000.0,2) ," Tr.Type: ",EnumToString(trans.type)," DL.Type: ",EnumToString(trans.deal_type) ," RQ.Type: ",EnumToString(request.type)," RQ.Fill: ",EnumToString(request.type_filling) );
Dieser Print erzeugt im Falle der Eröffnung einer Position um 01:00:40 und der Schließung dieser Position um 10:04:40:
01:00:40 322 0 81952.76 Tr.Type: TRADE_TRANSACTION_DEAL_ADD DL.Type: DEAL_TYPE_SELL RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position 10:04:40 322 0 81970.73 Tr.Type: TRADE_TRANSACTION_DEAL_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // close sell position 01:00:40 322 0 81955.30 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position 10:04:40 322 0 81980.91 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // close sell position 01:00:40 322 0 81965.14 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position 10:04:40 322 0 81982.69 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY DL.Type: ORDER_FILLING_FOK // close sell position 01:00:59 322 0 81968.50 Tr.Type: TRADE_TRANSACTION_REQUEST DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_SELL RQ.Fill: ORDER_FILLING_FOK // open sell position
Die Aufrufe sehen ziemlich gleich aus - wie kommt das? Um 1:00 wurde ein Verkauf eröffnet - warum gibt es 12 ..TYPE_BUY und nur 2 TYPE_SELL??
Warum und was bedeutet request.type = ORDER_TYPE_BUY, wenn ein Verkaufsstopp ausgelöst und zu einem Verkauf (Position) wird? Woher kommt der _BUY?

- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel MQL5-Kochbuch: Verarbeitung des TradeTransaction-Ereignisses :
Dieser Artikel beschäftigt sich mit den Möglichkeiten der MQL5-Sprache aus Sicht des ereignisgesteuerten Programmierens. Der größte Vorteil dieses Ansatzes besteht darin, dass das Programm Informationen über die schrittweise Umsetzung von Handelsoperationen empfangen kann. Der Artikel enthält ferner Beispiele zum Empfangen und Verarbeiten von Informationen über Handelsoperationen mithilfe des TradeTransaction-Ereignisbehandlers. Meiner Meinung nach eignet sich solch ein Ansatz vorzüglich dafür, Deals von einem Terminal in Richtung eines anderen zu kopieren.
Bevor wir dies tun, müssen wir zuerst ein Template des EAs anlegen, das den TradeTransaction-Ereignisbehandler enthält. Ich habe meine Version dieses Templates auf den Namen TradeProcessor.mq5 getauft. Ich habe außerdem ein Feature hinzugefügt, das es ermöglicht, Informationen über die Werte des Strukturfelds im Log anzuzeigen. Diese Werte sind die Parameter des Ereignisbehandlers. Eine Analyse dieser Aufzeichnungen wird zweifellos eine Menge Zeit in Anspruch nehmen. Am Ende werden wir allerdings in Form des gesamten, umfassenden Bildes eines Ereignisses belohnt werden.
Wir müssen den EA im Debugmodus auf irgendeinen der MetaTrader-5-Terminalcharts anwenden und starten.
Dann öffnen wir manuell eine Position und sehen uns den Code an. Der erste Aufruf des Behandlers sieht wie folgt aus (Abb. 1).
Abb. 1 Das Typenfeld ist identisch mit TRADE_TRANSACTION_REQUEST
Autor: Dennis Kirichenko