OnTradeTransaction-Verarbeitung - Seite 9

 
JRandomTrader:

Der Algorithmus des Roboters benötigt eine imaginäre Position: Wenn er sie geöffnet hat, sollte er sie schließen.

Ich sollte hinzufügen, dass die Aufgabe im ersten Beitrag noch einfacher war - wir mussten den Betrieb eines Gitters von Limit-Orders implementieren, bei dem jeder Knoten des Gitters seinen SL/TP schließt.

Zum Beispiel funktioniert nur ein solcher unidirektionaler EA in einem Konto und kein anderer. Aber auch hier handelt es sich um imaginäre Positionen.


Und dabei geht es nicht nur um das Netting. Bei einer Hecke kann es genauso sein. Es gibt mehrere Expert Advisors im Hedging, und jemand hat mehrere Positionen eingenommen und sie durch CloseBy geschlossen. Wenn Expert Advisors durch imaginäre Positionen implementiert werden, dann wird ein solcher Zusammenbruch die Logik nicht unterbrechen.


Im Allgemeinen kann dies durch eine virtuelle Handelsumgebung gelöst werden. Das Problem kann leicht gelöst werden. So betreiben die algorithmischen Büros ihre TS-Portfolios an den Börsen.

 
Alexey Viktorov:

Um die Dinge zu vereinfachen, ja. Einverstanden.

Zu diesem Zeitpunkt hat der "Transportmanager" das Problem und sein Vorgehen noch nicht vollständig geklärt.

Was meinen Sie mit Stopp-Befehlen? Für die gesamte Position oder nur für den Teil, mit dem sich dieser EA befasst?

Natürlich sind die Stop-Orders für einen Teil einer Position, mit der unser EA arbeitet, schwebende Sell/Buy-Stops und Sell/Buy-Limits.

Bisher habe ich festgestellt, dass es besser wäre, zu OnTrade zu wechseln, da es bei OnTradeTransactions eine Vielzahl von Fallstricken gibt.

 
Илья Ребенок:

Natürlich sind Stop-Orders schwebende Verkaufs-/Kaufstopps und Verkaufs-/Kauflimas für einen Teil einer Position, die von einem bestimmten EA abgewickelt wird.

Bisher habe ich verstanden, dass es besser ist, sich für OnTrade zu entscheiden, da es bei OnTradeTransactions eine Vielzahl von Fallstricken gibt.

Achten Sie nur darauf, dass sie zusammenarbeiten. Ich weiß nicht mehr, welches das erste und welches das zweite ist. Aber OnTradeTransactions hat zumindest einige Informationen ohne zusätzlichen Code, während OnTrade alles mit Gewalt bekommen muss. Zunächst einmal müssen wir feststellen, welches Ereignis die Funktion ausgelöst hat...

 

Ich habe einen Transaktions-Catcher geschrieben - es kann nützlich sein, um festzustellen, was und woher (obwohl es eine einfache Verarbeitung je nach Transaktionstyp gibt) - es gibt keinen Verweis auf die Order- und Transaktionshistorie (z.B. um die Expert Advisor ID zu drucken)

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE trans_type=trans.type;
   if(trans_type==TRADE_TRANSACTION_ORDER_ADD || trans_type==TRADE_TRANSACTION_ORDER_UPDATE || trans_type==TRADE_TRANSACTION_ORDER_DELETE ||
      trans_type==TRADE_TRANSACTION_HISTORY_ADD || trans_type==TRADE_TRANSACTION_HISTORY_UPDATE || trans_type==TRADE_TRANSACTION_HISTORY_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","order_type",EnumToString(trans.order_type));
      PrintFormat("%-15s: %s","orders_state",EnumToString(trans.order_state));
      PrintFormat("%-15s: %s","time_type",EnumToString(trans.time_type));
      if(trans.time_type==ORDER_TIME_SPECIFIED || trans.time_type==ORDER_TIME_SPECIFIED_DAY)
        {
         PrintFormat("%-15s: %s","time_expiration",TimeToString(trans.time_expiration,TIME_DATE|TIME_SECONDS));
        }
      else
        {
         PrintFormat("%-15s: %s","time_expiration","---");
        }
      PrintFormat("%-15s: %.8f","price",trans.price);
      if(trans.order_type==ORDER_TYPE_BUY_STOP_LIMIT || trans.order_type==ORDER_TYPE_SELL_STOP_LIMIT)
        {
         PrintFormat("%-15s: %.2f","price_trigger",trans.price_trigger);
        }
      else
        {
         PrintFormat("%-15s: %s","price_trigger","---");
        }
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      if(trans_type!=TRADE_TRANSACTION_ORDER_ADD && (trans.order_type==ORDER_TYPE_BUY || trans.order_type==ORDER_TYPE_SELL))
        {
         PrintFormat("%-15s: %d","position",trans.position);
        }
      else
        {
         PrintFormat("%-15s: %s","position","---");
        }
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_DEAL_ADD || trans_type==TRADE_TRANSACTION_DEAL_UPDATE || trans_type==TRADE_TRANSACTION_DEAL_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","deal",trans.deal);
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_POSITION)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
     }
   else if(trans_type==TRADE_TRANSACTION_REQUEST)
     {
      Print("---");
      Print(EnumToString(trans_type));
     }
  }
 
Илья Ребенок:

fxsaber danke für das Beispiel!

Nur ist es nicht wirklich ein Beispiel, sondern eine vollständige Lösung für das ursprüngliche Problem.

 
Илья Ребенок:

Natürlich sind Stop-Orders schwebende Verkaufs-/Kaufstopps und Verkaufs-/Kauflimas für einen Teil einer Position, die von einem bestimmten EA abgewickelt wird.

Bisher habe ich verstanden, dass es besser ist, sich für OnTrade zu entscheiden, da es bei OnTradeTransactions eine Vielzahl von Fallstricken gibt.

Machen Sie weiter so :)

Ein kleiner Hinweis MqlTradeTransaction &trans - NUR die Felder sind relevant

TRADE_TRANSACTION_DEAL_* FELDER

Für Handelstransaktionen im Zusammenhang mit der Geschäftsabwicklung (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE und TRADE_TRANSACTION_DEAL_DELETE) werden die folgenden Felder in der Struktur MqlTradeTransaction gefüllt

  • Deal - Ticket tauschen;
  • Auftrag - das Auftragsticket, auf dessen Grundlage der Handel ausgeführt wurde;
  • Symbol - Bezeichnung eines Finanzinstruments im Handel;
  • Typ - Art des Handelsgeschäfts;
  • deal_type - Art des Geschäfts;
  • Preis - Preis, zu dem das Geschäft abgeschlossen wurde;
  • price_sl - Kurs-Stop-Loss (der zu erfüllen ist, wenn er in der Order angegeben ist, auf deren Grundlage das Geschäft ausgeführt wird);
  • price_tp - Preis der Gewinnmitnahme (gefüllt, wenn in der Order angegeben, auf deren Grundlage das Geschäft ausgeführt wird);
  • Volumen - Volumen eines Geschäfts in Losen.
  • Position - Ticket einer Position, die infolge der Ausführung eines Geschäfts eröffnet, geändert oder geschlossen wurde.
  • position_by - Ticket der gegenüberliegenden Position. Wird nur bei Transaktionen zur Schließung einer Position durch die Gegenposition (out by) ausgefüllt.

Und schauen Sie sich MqlTradeResult &result an.

Aber jetzt haben Sie 1000 Zeilen Code!

 
prostotrader:

Machen Sie weiter so :)

Ein kleiner Hinweis MqlTradeTransaction &trans - NUR die Felder sind relevant

TRADE_TRANSACTION_DEAL_*.

Für Handelstransaktionen im Zusammenhang mit der Geschäftsabwicklung (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE und TRADE_TRANSACTION_DEAL_DELETE) werden die folgenden Felder in der Struktur MqlTradeTransaction gefüllt

  • Deal - Ticket tauschen;
  • Auftrag - das Auftragsticket, auf dessen Grundlage der Handel ausgeführt wurde;
  • Symbol - Bezeichnung eines Finanzinstruments im Handel;
  • Typ - Art des Handelsgeschäfts;
  • deal_type - Art des Geschäfts;
  • Preis - Preis, zu dem das Geschäft abgeschlossen wurde;
  • price_sl - Kurs-Stop-Loss (der zu erfüllen ist, wenn er in der Order angegeben ist, auf deren Grundlage das Geschäft ausgeführt wird);
  • price_tp - Preis der Gewinnmitnahme (gefüllt, wenn in der Order angegeben, auf deren Grundlage das Geschäft ausgeführt wird);
  • Volumen - Volumen eines Geschäfts in Losen.
  • Position - Ticket einer Position, die infolge der Ausführung eines Geschäfts eröffnet, geändert oder geschlossen wurde.
  • position_by - Ticket der gegenüberliegenden Position. Wird nur bei Transaktionen zur Schließung einer Position durch die Gegenposition (out by) ausgefüllt.

Und schauen Sie sich MqlTradeResult &result an.

Aber jetzt haben Sie 1000 Zeilen Code!

Ich verstehe natürlich, dass Sie vor Egoismus platzen. Erfahrung, alles...

Aber ich bin nicht wegen ein bisschen Sarkasmus hierher gekommen, sondern weil ich Hilfe brauche. Wenn Sie etwas weiter oben nachsehen, werden Sie sehen, dass ich zugestimmt habe, dass ich einen Fehler beim Parsen von Feldern gemacht habe, die bei deal_add nicht ausgefüllt sind.

Ich wäre Ihnen für weitere konstruktive Hilfe dankbar, ich kann mich selbst "anscheißen") Ich nehme konstruktive Kritik an.

Über"And look at MqlTradeResult &result".

Laut Hilfe wird das Handelsgeschäftsergebnis nur mitTRADE_TRANSACTION_REQUEST gefüllt und muss nur mit dieser Art von Transaktionen analysiert werden.

 

Sie haben eine seltsame Wahrnehmung.

Ich würde nicht im Traum daran denken, "auf irgendjemanden zu scheißen", das ist wahrscheinlich Ihre Lebensauffassung, und Sie benutzen sie wahrscheinlich selbst oft.

Wahrscheinlich benutzen Sie es selbst oft.

Es liegt nicht an mir, sondern an fxsaber(a), denn in fast jedem Thema pusht er seine

Aber er selbst handelt nicht auf dem realen Markt, und schon gar nicht auf den FORTS!

Es gibt einfache und komplexe Lösungen für dasselbe Problem.

Ihrer Frage nach zu urteilen, sind Sie ein Anfänger.

Aber wie heißt es so schön: "Wir suchen nicht nach einfachen Wegen"!

Die Funktion OnTradeTransaction wurde speziell zur Vereinfachung folgender Aufgaben entwickelt

"Leben für Programmierer in der Roboterentwicklung, aber die alten Hasen wollen es nicht benutzen,

weil sie an OnTrade gewöhnt sind und einen Haufen Code schreiben müssen, damit es funktioniert.

Ich habe Ihnen bereits gesagt, dass der Auftrag der Kopf ist, nicht das Geschäft!

Was werden Sie tun, wenn das Volumen des ursprünglichen Auftrags nicht 1, sondern 2, 10 beträgt?

Wenn Sie einen schwebenden Auftrag erteilen, können Sie ihn nicht "streng" kontrollieren, geschweige denn die Abschlüsse steuern!

Sie können es nicht "streng" kontrollieren, erst recht nicht, wenn Sie irgendwelche Geschäfte machen! Bei schwebenden Aufträgen gibt es eine Menge Fallstricke.

Aber Sie haben sich für den einfachen Weg entschieden und eine zweifelhafte Lösung von der Stange gekauft, anstatt zu versuchen

Aber Sie haben sich für den einfachen Weg entschieden, anstatt zu versuchen, es selbst herauszufinden (mit Hinweisen).

Viel Glück, ich bin nicht mehr dabei.

 
prostotrader:

Sie haben eine seltsame Wahrnehmung.

Ich würde nicht im Traum daran denken, "auf irgendjemanden zu scheißen", das ist wahrscheinlich Ihre Lebensauffassung, und Sie benutzen sie wahrscheinlich selbst oft.

Wahrscheinlich benutzen Sie es selbst oft.

Es liegt nicht an mir, sondern an fxsaber(a), denn in fast jedem Thema pusht er seine

Aber er selbst handelt nicht auf dem realen Markt, und schon gar nicht auf den FORTS!

Es gibt einfache und komplexe Lösungen für dasselbe Problem.

Ihrer Frage nach zu urteilen, sind Sie ein Anfänger.

Aber wie heißt es so schön: "Wir suchen nicht nach einfachen Wegen"!

Die Funktion OnTradeTransaction wurde speziell entwickelt, um die

"Leben" für Programmierer in der Roboterentwicklung, aber es sind die alten Hasen, die es nicht benutzen wollen,

weil sie an OnTrade gewöhnt sind und einen Haufen Code schreiben müssen, damit es funktioniert.

Ich habe Ihnen bereits gesagt, dass der Auftrag der Kopf ist, nicht das Geschäft!

Was werden Sie tun, wenn das Volumen des ursprünglichen Auftrags nicht 1, sondern 2 oder 10 beträgt?

Wenn Sie einen schwebenden Auftrag erteilen, können Sie ihn nicht "streng" kontrollieren, geschweige denn die Abschlüsse steuern!

Sie können es nicht "streng" kontrollieren, erst recht nicht, wenn Sie irgendwelche Geschäfte machen! Bei schwebenden Aufträgen gibt es eine Menge Fallstricke.

Aber Sie haben den einfachen Weg gewählt, indem Sie eine zweifelhafte Lösung von der Stange gekauft haben, anstatt zu versuchen

Aber Sie haben den einfachen Weg gewählt, anstatt zu versuchen, es selbst herauszufinden (mit Hinweisen).

Viel Glück, ich bin nicht mehr dabei.

Beginnen wir mit der Tatsache, dass ich keine fertigen Lösungen verwende. Ich weiß nicht, was Sie sich für mich ausgedacht haben, aber ich habe keine der Lösungen in diesem Thread verwendet (obwohl ich einige nützliche Erkenntnisse gewonnen habe) und ich experimentiere immer noch und finde Dinge heraus. Generell ist mir bei Ihren Beiträgen aufgefallen, dass Sie andere gerne in Frage stellen. Nichts für ungut.

Was das Auftragsvolumen betrifft, so spielt es keine Rolle, wie hoch es ist. Es ist ein Geschäft, das es mir erlaubt zu beurteilen, welches Volumen wirklich ausgeführt wird. Ich denke, dass es einfacher ist, als die teilweise Auftragsausführung nach der entsprechenden Auftragsart zu erfassen. In einem der Themen wurde außerdem darauf hingewiesen, dass nur ein Geschäft die Sicherheit bietet, dass die Position ausgeführt wurde.

 
Илья Ребенок:

Zunächst einmal verwende ich keine vorgefertigten Lösungen. Ich weiß nicht, was Sie für mich erraten haben, aber ich habe keine der Lösungen in diesem Thread verwendet (obwohl ich einige nützliche Erkenntnisse gewonnen habe) und ich experimentiere immer noch und finde es heraus. Generell habe ich an Ihren Beiträgen gemerkt, dass Sie andere gerne in Frage stellen. Nichts für ungut.

Was das Auftragsvolumen angeht, so spielt es keine Rolle, wie hoch es ist. Es ist ein Geschäft, das mir erlaubt zu beurteilen, welches Volumen wirklich ausgeführt wird. Ich denke, das ist einfacher, als die Ausführung von Teilaufträgen durch den entsprechenden Typ zu erfassen. In einem der Themen wurde darauf hingewiesen, dass nur ein Geschäft uns die Sicherheit gibt, dass die Position ausgeführt wurde.

Haben Sie vergessen, wie man liest?

"Viel Glück, ich bin nicht mehr beteiligt."