Hilfe bei der Verwaltung und Verarbeitung von Positionsinformationen

 

Liebe Community,

ich arbeite gerade an einem Projekt und bin bereits ziemlich weit gekommen. Momentan versuche ich zu verstehen, wie bestimmte Funktionalitäten umgesetzt werden können.

Ein aktuelles Ziel von mir ist es, alle offenen Positionen zu erfassen und darauf basierend kleine Berechnungen durchzuführen. Anschließend möchte ich mir diese Ergebnisse als Hinweise ausgeben lassen.

Konkret möchte ich bei jedem Durchlauf meines Codes sämtliche Positionsdaten speichern, um beim nächsten Durchlauf feststellen zu können, welche Veränderungen an den Positionen stattgefunden haben.

Leider gestaltet sich dies schwieriger als gedacht und ich komme nicht weiter. Kann mir jemand von euch dabei behilflich sein? Über Hinweise oder Ratschläge würde ich mich sehr freuen.

Anbei findet ihr meinen aktuellen Code:

//+------------------------------------------------------------------+
//|                                             Positionsmonitor.mq5 |
//+------------------------------------------------------------------+
#property strict                                               // Aktiviert die strengere Syntaxprüfung für den Code

//+------------------------------------------------------------------+
//| Struktur zur Speicherung des Zustands einer Position             |
//+------------------------------------------------------------------+
struct PositionState
{
   string symbol;                                              // Symbolname
   double stopLoss;                                            // Stop-Loss-Wert
   double takeProfit;                                          // Take-Profit-Wert
   double profit;                                              // Aktueller Gewinn/Verlust
   long   type;                                                // Positionstyp: 0 für BUY, 1 für SELL
   bool   profitOverThreshold;                                 // Flag, ob der Gewinn den Schwellenwert überschreitet
};

//+------------------------------------------------------------------+
//| Initialisierung und Eingabeparameter                             |
//+------------------------------------------------------------------+
   PositionState previousState;                                // Speichert den vorherigen Zustand einer Position   
         int     timerEventID = 0;                             // ID für das Timer-Ereignis
   input int     timerIntervalInSeconds = 1;                   // Aktualisierungsintervall für das Timer-Ereignis in Sekunden
   input double  profitThresholdInEUR = 0.1;                   // Schwellenwert für den Gewinn in Euro, erstmalige Überschreitung


//+------------------------------------------------------------------+
//| Expert initialisierungs Funktion                                  |
//+------------------------------------------------------------------+
int OnInit()
{
    timerEventID = EventSetTimer(timerIntervalInSeconds);      // Starten des Timer-Events für das Lesen der Positionen
    previousState.symbol = "";                                 // Initialisierung des vorherigen Zustands mit ungültigen Werten
    previousState.profitOverThreshold = false;                 // Initial ist der Gewinn unter dem Schwellenwert
    return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| Timer-Event für lesen, berechnen, vergleichen und ausgeben der Positionen |
//+------------------------------------------------------------------+
void OnTimer()
{
    PositionState previousStates[];                               // Erstellen eines Arrays für den vorherigen Zustand jeder Position
    ArrayResize(previousStates, PositionsTotal());                // Festlegen der Größe des Arrays auf die Anzahl der offenen Positionen

    for(int i = 0; i < PositionsTotal(); i++)                      // Durchlaufen aller offenen Positionen
    {
      //+------------------------------------------------------------------+
      //|   Lesen der aktuellen Positionsinformation                       |
      //+------------------------------------------------------------------+
      ulong  ticket        = PositionGetTicket(i);                             // Positions Ticket 
      string symbol        = PositionGetString(POSITION_SYMBOL);               // Positions Symbols
      double stopLoss      = PositionGetDouble(POSITION_SL);                   // Positions Stop Loss 
             stopLoss      = NormalizeDouble(stopLoss, 2);                     // Formatire Stop-Loss auf zwei Nachkommastellen
      string slCurrency    = SymbolInfoString(symbol, SYMBOL_CURRENCY_MARGIN); // Positions Währungseinheiten des Symbols für Stop-Loss
      double takeProfit    = PositionGetDouble(POSITION_TP);                   // Positions Take Profit
             takeProfit    = NormalizeDouble(takeProfit, 2);                   // Formatire Take-Profit auf zwei Nachkommastellen                          
      string tpCurrency    = SymbolInfoString(symbol, SYMBOL_CURRENCY_MARGIN); // Positions Währungseinheiten des Symbols für Take-Profit
      double profit        = PositionGetDouble(POSITION_PROFIT);               // Positions Gewin 
             profit        = NormalizeDouble(profit, 2);                       // Formatire Gewinn auf zwei Nachkommastellen
      long   type          = PositionGetInteger(POSITION_TYPE);                // Positions Type (0 für BUY => Fallend, 1 für SELL => Steigend)
      double price         = SymbolInfoDouble(symbol, SYMBOL_BID);             // Positions Preises
      double volumeInMoney = PositionGetDouble(POSITION_VOLUME) * price;       // Umrechnen des Volumens in Geld
             volumeInMoney = NormalizeDouble(volumeInMoney, 2);                // Formatiren Geld auf zwei Nachkommastellen
      string tradeType;
             if(type == 0)      tradeType = "BUY  (Kursabfall )";
             else if(type == 1) tradeType = "SELL (Kursanstieg)";
             else               tradeType = "UNKNOWN";

      //+------------------------------------------------------------------+
      //|   Vergleichen & Berechnen der aktuellen Positionsinformation     |
      //+------------------------------------------------------------------+

string Hinweis = ""; 
      
      double alterGewinn = previousStates[i].profit; // Speichern des vorherigen Gewinns
      double neuerGewinn = profit; // Aktuellen Gewinn speichern

      if (neuerGewinn != alterGewinn) {
          Hinweis = "Gewinn hat sich geändert. Alter Gewinn = " + DoubleToString(alterGewinn, 2) + " EURO, Neuer Gewinn = " + DoubleToString(neuerGewinn, 2) + " EURO";
      }
      

      //+------------------------------------------------------------------+
      //|   Ausgeben der aktuellen Positionsinformation                    |
      //+------------------------------------------------------------------+

        // Standardausgabe der Positionsinformation in der Konsole
        Print(   "Symbol: ",      symbol,
               "  Ticket: ",      ticket, 
               ", Typ: ",         tradeType, 
               ", Stop-Loss: ",   StringFormat("%.2f", stopLoss),    " ", slCurrency,
               ", Take-Profit: ", StringFormat("%.2f", takeProfit),  " ", tpCurrency,
               ", Gewinn: ",      StringFormat("%.2f", profit),      " ", SymbolInfoString(symbol, SYMBOL_CURRENCY_PROFIT), 
               ", Hinweis: ", Hinweis);
   }
}

//+------------------------------------------------------------------+
//| Expert Deinitialisierungs Funktion                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    if(timerEventID != 0)                                      // Timer-Event beim Beenden des Experten stoppen
    { EventKillTimer(); }                                      // Alle Timer-Events beenden
}

Gruß Mücke

 

Verwende den Debugger um herauszufinden. was Dein EA mit welchen Daten wann tut, um so das Verhalten zu finden, das nicht sein soll.

Hier eine Reihe links dazu:

    https://www.metatrader5.com/de/metaeditor/help/development/debug
    Zur Fehlerbehebung von MQL5-Programmen (Debugging) : https://www.mql5.com/de/articles/654
    Einführung in MQL5: Schreiben eines einfachen Expert Advisor und benutzerdefinierten Indikators, Siehe Ende: Starten und Debuggen     https://www.mql5.com/de/articles/35
    Die Fehlerverarbeitung und Protokollierung in MQL5:     https://www.mql5.com/de/articles/2041
    https://www.mql5.com/de/articles/272
    Fehler finden und Protokollierung     https://www.mql5.com/de/articles/150

Code-Debugging - Programme entwickeln - MetaEditor Hilfe
  • www.metatrader5.com
MetaEditor hat einen eingebauten Debugger, mit dem Sie die Programmausführung Schritt für Schritt (durch einzelne Funktionen) ü...
Grund der Beschwerde: