Diskussion zum Artikel "Orders, Positions und Abschlüsse in MetaTrader 5" - Seite 2

 

Торговыми событиями считаются следующие изменения на счете:

  • Abbuchung und Belastung von Geldern;
  • Berechnung von Provisionen, Swaps und Steuern;
  • Einstellung, Löschung und Änderung von Aufträgen;
  • Ausführung von Geschäften auf der Grundlage von Aufträgen;
  • Eröffnung und Schließung von Positionen;
  • Änderung des Umfangs und der Richtung von Positionen.

Nicht in der Liste enthalten ist ein Handelsereignis wie die "Änderung der StopLoss- und/oder TakeProfit-Levels" einer offenen Position(SL- & TP-Änderung). Oder wird dies als ein Sonderfall der "Ausführung von Geschäften auf der Grundlage von Aufträgen" betrachtet?

 
Yedelkin:

Die Liste enthält kein solches Handelsereignis wie die "Änderung der StopLoss- und/oder TakeProfit-Levels" einer offenen Position(SL- & TP-Änderung). Oder wird dies als Sonderfall des "auftragsbasierten Handels" betrachtet?

"Modifikation von StopLoss und/oder TakeProfit-Levels" bei einer offenen Position(SL & TP Modifikation)" ist näher an "Setzen, Löschen undModifizieren von Orders".
  • Setzen, Löschen und Ändern von Aufträgen;
 
Rosh:
"Modifikation von StopLoss und/oder TakeProfit Levels" bei einer offenen Position(SL & TP Modifikation)" ist näher an der

Ich habe über diese Frage nachgedacht. Aber wenn wir von "Setzen, Löschen und Ändern von Aufträgen" sprechen, meinen wir eigentlich das Setzen, Löschen und Ändern von schwebenden Aufträgen. Die Änderung der SL- und/oder TP-Niveaus einer offenen Position ist etwas anders geartet, da die entsprechenden Anfragen in die Kategorie der "Aufträge zur sofortigen Ausführung" fallen. Oder verstehe ich denBegriff "sofortige Ausführung" falsch?

 
Rosh:

Der Artikel enthält ein Beispiel für das Laden der Handelsgeschichte für einen Tag (ein Code enthält ein Beispiel für das Laden der Geschichte für 3 Tage). Ja, dies ist eine Einschränkung und das Beispiel ist nicht universell. Aber wenn der Leser diese Besonderheit beim Lesen des Artikels versteht, wird er in der Lage sein, selbst zu entscheiden, in welchem Intervall und ab welchem Zeitpunkt er die Handelshistorie in den Cache laden muss.

Der Leser hat die einfachsten Beispiele und Algorithmen erhalten und kann sie nun selbständig in den notwendigen Ereignisverarbeitungsfunktionen anwenden. Er kann selbständig seine eigene Handelshistorie erstellen und deren Initialisierung und Synchronisierung vornehmen usw.

Der Versuch, spezifische Rezepte und Funktionen für die optimale Arbeit mit der Handelshistorie für alle Fälle zu geben, wird mindestens einen weiteren Artikel erfordern. Genauer gesagt, nicht die Beispiele selbst, sondern Ansätze zur Lösung bestimmter Aufgaben. Dieser Artikel sollte dazu dienen, zu verstehen, wie Handelsfunktionen funktionieren und auf welche Nuancen man achten sollte, um nicht die eigene Zeit mit der Recherche zu verschwenden.

Ich bin mir sicher, dass nach der Lektüre des Artikels von nun an alles einfach sein wird.

Rashid, ich will die Nützlichkeit des Artikels nicht schmälern.

Es ist nur so, dass er ohne Beispiele aus dem Leben (die sich auf das Schreiben eines EA anwenden lassen) recht referentiell wirkt.

Ja, er enthält nützliche Informationen, und ein verständiger Mensch wird sie nutzen können. Aber ein unbedarfter Benutzer wird nicht in der Lage sein, eine normale Arbeit mit der Geschichte zu organisieren, nachdem er nur diesen Artikel gelesen hat, d. h. er wird für ihn nutzlos sein.

 

Es gibt einen solchen Teil in dem Artikel:

"Hier ist zum Beispiel ein Skript, das nach der letzten Bestellung des letzten Tages sucht und Informationen dazu anzeigt.

--- Festlegung der Grenzen des erforderlichen Handelsverlaufs
   datetime end=TimeCurrent();                 // aktuelle Serverzeit
   datetime start=end-PeriodSeconds(PERIOD_D1);// den Beginn auf vor 24 Stunden setzen
//--- Abfrage des Handelsverlaufs für den Tag im Programm-Cache
   HistorySelect(start,end);
//--- Ermitteln der Anzahl der Aufträge in der Historie
   int history_orders=HistoryOrdersTotal();
//--- das Ticket der Bestellung aus der Historie holen, die den letzten Index in der Liste hat
   ulong order_ticket=HistoryOrderGetTicket(history_orders-1);
   if(order_ticket>0) // Historischen Auftrag in den Cache holen, mit ihm arbeiten
     {
      //--- Auftragsstatus
      ENUM_ORDER_STATE state=(ENUM_ORDER_STATE)HistoryOrderGetInteger(order_ticket,ORDER_STATE);
      long order_magic      =HistoryOrderGetInteger(order_ticket,ORDER_MAGIC);
      long pos_ID           =HistoryOrderGetInteger(order_ticket,ORDER_POSITION_ID);
      PrintFormat("Auftrag #%d: ORDER_MAGIC=#%d, ORDER_STATE=%d, ORDER_POSITION_ID=%d",
                  order_ticket,order_magic,EnumToString(state),pos_ID);

     }
   else              // erfolgloser Versuch, einen Auftrag zu erhalten

     {
      PrintFormat("Total %d orders in history, failed to select an order"+
                  "mit Index %d. Fehler %d",history_orders,history_orders-1,GetLastError());
     }

In der Skriptbeschreibung steht, dass nach der letzten Bestellung gesucht wird, aber im Code selbst ist davon die Rede, dass das Ticket mit dem letzten Index in der Liste der historischen Bestellungen gesucht wird:

//--- Holen Sie sich das Ticket der Bestellung aus der Historie, die den letzten Index  hat  в списке
   ulong order_ticket=HistoryOrderGetTicket(history_orders-1);
Das heißt, es wird angedeutet, dass sich das Ticket mit dem höchsten Index auf die letzte Bestellung bezieht. Aber ich habe nirgendwo in den Materialien gefunden, dass der letzte Auftrag immer garantiert den höchsten Index in der Liste der historischen Aufträge hat... Wenn, sagen wir, nur ein Auftrag in der Liste ist, gibt es keine Frage. Aber wenn die Liste mehr Aufträge enthält - können wir uns dann immer auf die vorgeschlagene Methode zur Ermittlung des letzten Auftrags verlassen? Mit anderen Worten, ist garantiert, dass der letzte historische Auftrag immer den höchsten Index in der Liste der historischen Aufträge hat?
 

Guten Tag!

1) Ich habe mir die Positionseigenschaften angesehen:

POSITION_PROFIT

Was ist das, woran wird es gemessen?

Beispiel:

double profit =PositionGetDouble(POSITION_PROFIT);

Ergebnis:

EURUSD Position #101470723: POSITION_MAGIC=0, open pos price=1.30825, close pos price=1.30835, type=POSITION_TYPE_BUY, profit=-2061584302, comment=.

profit=-2061584302 wie ist das zu verstehen?

2) Kann jemand genau, aber einfach erklären, wie dieser Eintrag zu lesen ist

ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);

Vielleicht hat die cis-Funktion PositionGetInteger(POSITION_TYPE) den Wert einer Eigenschaft namens POSITION_TYPE für eine vorausgewählte Position angefordert, aber dieser Wert wird als Aufzählungsnummer zurückgegeben, und um ihn in einer verdaulichen Form darzustellen, holen wir uns diesen verdaulichen Wert bereits aus der cis-Aufzählung ENUM_POSITION_TYPE in die Typvariable, deren Typ gleichzeitig als ENUM_POSITION_TYPE deklariert wird?

Verstehe ich in diesem Fall richtig, dass es möglich ist, selbst eine bestimmte Klasse zu schreiben, die im Sinne einer Funktion wird, etwa

Initialisierung textPosition = diese bestimmte Klasse; // in deren Konstruktor in den Positionspuffer einlesen und alle Parameter merken

und dann verwenden:

tekPriceOpening=tekPosition.PriceOpening;

tekDirectionPosition=tekPosition.DirectionPosition;

tekDirectionPosition=tekPosition.DirectionPosition; tekDirectionPosition=tekPosition.DirectionPosition;

tekProfitPosition=tekPosition.ProfitPosition;

Ich danke Ihnen!

 
bivmail:

2) Kann jemand genau erklären, aber nur erklären, wie dieser Eintrag zu lesen ist

ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);

Die Funktion PositionGetInteger("property identifier") gibt einen Wert vom Typ long zurück. Wenn der "Eigenschaftsbezeichner" von einem anderen Typ als long ist (z.B. der Bezeichner POSITION_TYPE ist vom Typ ENUM_POSITION_TYPE), ist es wünschenswert, den von der Funktion PositionGetInteger() zurückgegebenen Wert in einen Wert des gewünschten Typs zu wandeln (d.h. in einen Wert vom Typ ENUM_POSITION_TYPE).

In Ihrem Beispiel wird die Variable vom Typ ENUM_POSITION_TYPE deklariert, der der Wert vom Typ ENUM_POSITION_TYPE zugewiesen wird, der als Ergebnis der expliziten Umwandlung des Wertes vom Typ long in den Wert vom Typ ENUM_POSITION_TYPE erhalten wird.

Die Regeln für das Casting von Werten numerischer Typen sind in MQL5 Reference Guide / Language Basics / Data Types / Type Casting / Casting numerischer Typen beschrieben.

Документация по MQL5: Торговые функции / PositionGetInteger
Документация по MQL5: Торговые функции / PositionGetInteger
  • www.mql5.com
Торговые функции / PositionGetInteger - Документация по MQL5
 

Zitat aus dem Artikel: "Wenn die Verbindung zum Handelsserver unterbrochen wird, versucht das Terminal in regelmäßigen Abständen , die Verbindung wiederherzustellen".

Wie oft wird versucht, die Verbindung wiederherzustellen?

 
Alle 5 Sekunden.
 

Verstanden, danke.