OrderPool durchscrollen - Größten Gewinnpositionen schließen

sunshineh
1356
sunshineh  

Hallo,

welche Möglichkeit gibt es, um bei mehreren offenen Positionen, nur die x Positionen mit dem größten Gewinn zu schließen?

So wie ich es sehe, muss ich den Orderpool 2x durchlaufen und beim ersten Durchlauf ein Array erstellen indem die Ordernummern nach Gewinn geordnet sind.

Carl Schreiber
Moderator
11460
Carl Schreiber  
Du kannst auch einen Durchlauf machen und jeweils den größten und zweitgrößten Gewinn sichern inkl. deren Ticketnummer und dann die beiden löschen.
Michael Martens
226
Michael Martens  
sunshineh:

Hallo,

welche Möglichkeit gibt es, um bei mehreren offenen Positionen, nur die x Positionen mit dem größten Gewinn zu schließen?

So wie ich es sehe, muss ich den Orderpool 2x durchlaufen und beim ersten Durchlauf ein Array erstellen indem die Ordernummern nach Gewinn geordnet sind.

Ein Durchlauf reicht. Einfach ein mehrdimensionales Array (1. Dimension: Order Profit, 2. Dimension: Orderticket) erstellen, welches Du nach der 1. Dimension sortierst. Dann hast Du Deine Trades und ihre Ticketnummer.
amando
3388
amando  
Michael Martens:
Ein Durchlauf reicht. Einfach ein mehrdimensionales Array (1. Dimension: Order Profit, 2. Dimension: Orderticket) erstellen, welches Du nach der 1. Dimension sortierst. Dann hast Du Deine zwei Trades und ihre Ticketnummer.

das geht auch in einem durchlauf, ganz ohne Array, du musst ja nur schauen, ob die Position einen größeren gewinn hat als die andere, wenn ja, verwirf die vorherige und nimm die aktuelle. 

am Ende der schleife hast du die mit dem größten Gewinn

Michael Martens
226
Michael Martens  
amando:

das geht auch in einem durchlauf, ganz ohne Array, du musst ja nur schauen, ob die Position einen größeren gewinn hat als die andere, wenn ja, verwirf die vorherige und nimm die aktuelle. 

am Ende der schleife hast du die mit dem größten Gewinn

Er möchte aber die x größten haben (und nicht nur eine!). Da ist in meinen Augen ein zweidimensionales Array die einfachste Variante.
amando
3388
amando  
Michael Martens:
Er möchte aber die x größten haben (und nicht nur eine!). Da ist in meinen Augen ein zweidimensionales Array die einfachste Variante.

ja eh, aber deswegen muss ich nicht ein array bemühen, wenn ich das auch aus einer schleife abfragen kann

ich lass alle Positionen durchlaufen und wenn der gewinn der einen höher ist als der der anderen, dann nehme ich die neue position

einfach eine if abfrage in die schleife und fertig

Michael Martens
226
Michael Martens  
amando:

ja eh, aber deswegen muss ich nicht ein array bemühen, wenn ich das auch aus einer schleife abfragen kann

ich lass alle Positionen durchlaufen und wenn der gewinn der einen höher ist als der der anderen, dann nehme ich die neue position

einfach eine if abfrage in die schleife und fertig

Und wie soll er dann bspw. bei 100 Positionen die 10 höchsten finden (und schließen) nach Deiner Methode? Kannst ja mal den Quelltext dazu posten.
Carl Schreiber
Moderator
11460
Carl Schreiber  
10 aus 100 war nicht die Frage (da und bei einer variablen Anzahl wäre ein Array schon richtig), sondern nur 2 aus x
Michael Martens
226
Michael Martens  
Carl Schreiber:
10 aus 100 war nicht die Frage (da und bei einer variablen Anzahl wäre ein Array schon richtig), sondern nur 2 aus x
Nein, er will (mittlerweile) x aus mehreren (siehe Eingangspost). Und das will amando mit der if Abfrage lösen. Das mag ja sein, dass das geht - ich könnte das nicht. Lerne aber gerne dazu und bin deswegen auf amado's Quelltext gespannt.
amando
3388
amando  
Michael Martens:
Nein, er will (mittlerweile) x aus mehreren (siehe Eingangspost). Und das will amando mit der if Abfrage lösen. Das mag ja sein, dass das geht - ich könnte das nicht. Lerne aber gerne dazu und bin deswegen auf amado's Quelltext gespannt.

Schönheitspreis gewinnt es keinen, das lasst einfach so oft durchlaufen, bis du die Anzahl der Tickets die du schliessen willst. Die Anzahl der Tickets musst du ja vorher definieren

ungerüstet und nicht kompiliert

ulong HighestProfit(const string symbol, const int MagicNumber) //Gewinn der Gesamtposition
  {

   double profit = DBL_MIN;
   ulong   Ticket = 0;
//--- 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
      ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      datetime opentime = (datetime)PositionGetInteger(POSITION_TIME);
      double PositionProfit = PositionGetDouble(POSITION_PROFIT);
      //--- wenn die MagicNumber übereinstimmt, sind Stop Loss und Take Profit nicht gesetzt
      if(position_symbol==symbol
         && MagicNumber==magic
         && PositionProfit > Profit
        )
        {
         Ticket=position_ticket;
        }
     }
   return(Ticket);
  }
Michael Martens
226
Michael Martens  

Das ist natürlich eine Alternative. Aber es ist - wie Du schon selber geschrieben hast - dann eben mehr als ein Durchlauf. Du musst quasi für jede zu schließende Position immer alle offenen Trades durchlaufen (und Dir dabei merken, wie viele Du schon geschlossen hast).

Da finde ich ein Array doch eleganter ;).