Eröffnugnspreise von mehreren offenen Positionen herausbekommen

 

Hallo Leute,

wisst ihr wie man den Eröffnugnspreis der letzten vom EA geöffneten Position selektiert?

Ich filtere wie folgt:

   if (offeneOrder == true){
     for(int i=PositionsTotal()-1;i>=0;i--) // durchläuft alle offenen Positionen zur Selektion
      if(positionInfo.SelectByIndex(i))
         if(positionInfo.Symbol()==symbolInfo.Name() && positionInfo.Magic()==MagicNr) {  
            
            PosPriceOpen = PositionGetDouble (POSITION_PRICE_OPEN);                
         }
   }

In PosPriceOpen wird aber nur der Preis einer offenen Position gespeichert - und zwar der Ersten, die vom EA geöffnet wird. Wenn der EA jetzt weitere 3 Postionen als Beispiel öffnet, ohne die Erste vorher geschlossen zu haben, soll PosPriceOpen nur den Preis der jeweils letzten geöffneten Position speichern.

Wie macht man das?


Danke und Grüße
 

Hier hast Du die Liste (fast) aller Funktionen in der man einfach mit Ctrl-f suchen kann: https://www.mql5.com/de/docs/function_indices

Wenn Du dann zB. PositionGetDouble() anklickst siehst Du alle Funktionen zu diesem 'Thema'.

Übrigens Datum/Zeit ist keine reelle Zahl (double) sondern ganzzahlig (int).

So findest Du was Du brauchst mit ein paar Klicks! :)

Dokumentation zu MQL5: MQL5 Funktionenliste
Dokumentation zu MQL5: MQL5 Funktionenliste
  • www.mql5.com
Fügt Daten aus einem Array vom Typ MqlTick in die Preishistorie eines benutzerdefinierten Symbols hinzu. Das benutzerdefinierte Symbol muss im Fenster MarketWatch (Marktübersicht) ausgewählt werden Liest aus der Datei des Typs CSV die Zeile eines der Formate: "YYYY.MM.DD HH:MI:SS", "YYYY.MM.DD" oder "HH:MI:SS" - und wandelt sie...
 
Carl Schreiber:

Hier hast Du die Liste (fast) aller Funktionen in der man einfach mit Ctrl-f suchen kann: https://www.mql5.com/de/docs/function_indices

Wenn Du dann zB. PositionGetDouble() anklickst siehst Du alle Funktionen zu diesem 'Thema'.

Übrigens Datum/Zeit ist keine reelle Zahl (double) sondern ganzzahlig (int).

So findest Du was Du brauchst mit ein paar Klicks! :)



Hey Carl,

schlägst du vor alle offenen Position auf dem Symbol nach der Zeit zu filtern und dann den mit dem größten POSITION_TIME_MSC zu nehmen?

Ich habe leider keinen Ansatz das umzusetzten, wie geht man dabei vor? Wie sieht der Selektor aus finde kein Beipiel im Forum bzw in der Doku. dazu.



Oder kann es sein dass die PositionGetDouble (POSITION_PRICE_OPEN) nur für den Netting-Mode geeigent ist, nicht aber wenn mehrere Positionen gleichzeitig offen sind?

 
Tobse24:



Hey Carl,

schlägst du vor alle offenen Position auf dem Symbol nach der Zeit zu filtern und dann den mit dem größten POSITION_TIME_MSC zu nehmen?

Ich habe leider keinen Ansatz das umzusetzten, wie geht man dabei vor? Wie sieht der Selektor aus finde kein Beipiel im Forum bzw in der Doku. dazu.



Oder kann es sein dass die PositionGetDouble (POSITION_PRICE_OPEN) nur für den Netting-Mode geeigent ist, nicht aber wenn mehrere Positionen gleichzeitig offen sind?

musst dir nur umbauen auf den Open Price


ulong YoungestLongPositionTicket(const string symbol, const int MagicNumber) //Gewinn der Gesamtposition
  {
   ulong ticket=0;
   datetime time=D'01.01.1970';
//--- in allen offenen Positionen suchen

   int i = PositionsTotal();
   while(i-->0)
     {
      //--- Parameter der Order
      ulong  position_ticket=PositionGetTicket(i);// das Ticket der Position
      PositionSelectByTicket(position_ticket);

      string position_symbol=PositionGetString(POSITION_SYMBOL); // Symbol
      ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber der Position
      double position_lot=PositionGetDouble(POSITION_VOLUME);
      ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      datetime opentime = (datetime)PositionGetInteger(POSITION_TIME);

      //--- wenn die MagicNumber übereinstimmt, sind Stop Loss und Take Profit nicht gesetzt
      if(position_symbol==symbol
         && MagicNumber==magic
         && time < opentime
         && type == POSITION_TYPE_BUY
        )
        {
         time=opentime;
         ticket = position_ticket;
        }
     }
   return(ticket);
  }
 
Tobse24:



Hey Carl,

schlägst du vor alle offenen Position auf dem Symbol nach der Zeit zu filtern und dann den mit dem größten POSITION_TIME_MSC zu nehmen?

Ich habe leider keinen Ansatz das umzusetzten, wie geht man dabei vor? Wie sieht der Selektor aus finde kein Beipiel im Forum bzw in der Doku. dazu.

Oder kann es sein dass die PositionGetDouble (POSITION_PRICE_OPEN) nur für den Netting-Mode geeigent ist, nicht aber wenn mehrere Positionen gleichzeitig offen sind?

Die Liste der Positionen nach int o = PositionsTotal() ist nicht sicher(!) nach Datum/Zeit geordnet! Daher muss durch alle durchgegangen werden zB. mit:

int o = PositionsTotal();
datetime eT = D'3000.12.31 23:59:59' // Max date - msec ist nicht notwendig, meine ich.
ulong oldestTicket;
while(o-->0){
        ulong t = PositionGetTicket(o) // oder string s=PositionGetSymbol(o) wenn Du als nächstes das Symbol für einen Vergleich brauchst (beide wählen die Position!)
        if ( (datetime)PositionGetInteger(POSITION_TIME) < eT) {
                eT = (datetime)PositionGetInteger(POSITION_TIME);
                oldestTicket = (ulong)PositionGetInteger(POSITION_TICKET);
        }
}
if ( PositionSelectByTicket(oldestTicket) ) { .... }

Jetzt kannst Du mit der ersten Position machen, was Du vorhast.

Gewöhn Dir an bei Positionen/Pending-Orders von oben runterzuzählen. Machst Du das anders herum und schließt oder löscht Positionen/Order n, rutscht Position/Order n+1 auf n, Du erhöhst dann Deinen Zähler, so dass Du jetzt n+2 siehst, n+1 ist Dir so entgangen (zumindest war es früher so!).

Auf Netting-Konten kann es nur eine Position je Symbol geben, aber mehrere mit verschiedenen Symbolen.

 

Danke Ihr Beiden, ihr seid echt die Besten!!!


Teste ich so aus, sobald ich dazu komme.

 

Also, hat geklappt konnte es nach euren Vorlagen umsetzen, nochmal vielen Dank.


Ich habe das ganze für einen Trailing-Stop benötigt, der sich immer nach der Jüngsten Pposition richten soll und der sich abhängig vom Profit in PIPs justiert.


Hierzu eine kurze Frage: ich rechne den aktuell so aus, da mitPOSITION_PROFIT nuzr den Eurogewinn ausweist:

GuV_PIP = (PosPriceOpen - bid) * _Point * 1000000;

Der verstärkungsfaktor ist aber von Symbol zu Symbol verschieden, daher wäre es besser wenn er das direkt vom System zieht, gibts da eine Möglichkeit?

 
Tobse24:

Also, hat geklappt konnte es nach euren Vorlagen umsetzen, nochmal vielen Dank.


Ich habe das ganze für einen Trailing-Stop benötigt, der sich immer nach der Jüngsten Pposition richten soll und der sich abhängig vom Profit in PIPs justiert.


Hierzu eine kurze Frage: ich rechne den aktuell so aus, da mitPOSITION_PROFIT nuzr den Eurogewinn ausweist:


Der verstärkungsfaktor ist aber von Symbol zu Symbol verschieden, daher wäre es besser wenn er das direkt vom System zieht, gibts da eine Möglichkeit?

MathPow(10,_Digits)

 
Tobse24:

Also, hat geklappt konnte es nach euren Vorlagen umsetzen, nochmal vielen Dank.


Ich habe das ganze für einen Trailing-Stop benötigt, der sich immer nach der Jüngsten Pposition richten soll und der sich abhängig vom Profit in PIPs justiert.


Hierzu eine kurze Frage: ich rechne den aktuell so aus, da mitPOSITION_PROFIT nuzr den Eurogewinn ausweist:


Der verstärkungsfaktor ist aber von Symbol zu Symbol verschieden, daher wäre es besser wenn er das direkt vom System zieht, gibts da eine Möglichkeit?

Wenn Du den Gewinn in Punkten verwenden willst und nicht in Geldwerten, müsste es eigentlich so aussehen:

GuV_Pnt = ( posdir==buy ? (bid-PosPriceOpen) : (PosPriceOpen-ask) ) / _Point;

(Pip wird häufig verwendet, aber nur Point ist relevant, es wird vom Broker definiert).

Grund der Beschwerde: