FOR Schleife Variante

 

Hallo Zusammen,

ihr kennt doch alle die FOR-Schleife mit deren Blöcken, welche durch ; getrennt sind.

Ich tu mich etwas schwer, was passiert, wenn man die Variablen innerhalb der Klammer verschiebt oder i++/-- verwendet. Also was für Ergebnis man erhält, wenn man z.B.

      for(int i = 0; i <= PositionsTotal(); i++)

      for(int i = 0; i <= PositionsTotal(); i--)


      for(int i = PositionsTotal(); i <= 0; i++)

      for(int i = PositionsTotal(); i <= 0; i--)


Wie muss die FOR SchleifezZeile ausschauen, um die Erste oder die Zweite geöffnete Position eines Symbols zu selektieren?

Bzw. die letzte (siehe Code) oder vorletzte geöffneten Positionen.


void Letzte_Position()
   {
      for(int i = 0; i <= PositionsTotal(); i++)
         {
         string PositionSymbol = PositionGetString(POSITION_SYMBOL);
         long PositionDirection = PositionGetInteger(POSITION_TYPE);

            if (PositionSymbol == _Symbol
            && PositionDirection == POSITION_TYPE_BUY)
               {
               Typ = "buy";
               }
               
            else if (PositionSymbol == _Symbol
            && PositionDirection == POSITION_TYPE_SELL)
               {
               Typ = "sell";
               }
         }
   }
 
snoopy21:

Hallo Zusammen,

ihr kennt doch alle die FOR-Schleife mit deren Blöcken, welche durch ; getrennt sind.

Ich tu mich etwas schwer, was passiert, wenn man die Variablen innerhalb der Klammer verschiebt oder i++/-- verwendet. Also was für Ergebnis man erhält, wenn man z.B.

      for(int i = 0; i <= PositionsTotal(); i++)

      for(int i = 0; i <= PositionsTotal(); i--)


      for(int i = PositionsTotal(); i <= 0; i++)

      for(int i = PositionsTotal(); i <= 0; i--)


Wie muss die FOR SchleifezZeile ausschauen, um die Erste oder die Zweite geöffnete Position eines Symbols zu selektieren?

Bzw. die letzte (siehe Code) oder vorletzte geöffneten Positionen.


Hallo,

um die letzte Position zu selektieren muss die Schleife so aussehen:

void Letzte_Position()
   {
     string Typ; 
for(int i=PositionsTotal()-1; i>=0; i--) {  
         {
         string PositionSymbol = PositionGetString(POSITION_SYMBOL);
         long PositionDirection = PositionGetInteger(POSITION_TYPE);

            if (PositionSymbol == _Symbol
            && PositionDirection == POSITION_TYPE_BUY)
               {
               Typ = "buy";
               }
               
            else if (PositionSymbol == _Symbol
            && PositionDirection == POSITION_TYPE_SELL)
               {
               Typ = "sell";
               }
         }
   }

Selektiert aber offene Positionen.

Bei geschlossenen Positionen arbeitet man mit HistorySelect() 

Gruß Igor

 
ok. Und wenn ich die Vorletzte Position selektieren möchte müsste ich  
PositionsTotal()-
2 

schreiben?

 
snoopy21 #:
ok. Und wenn ich die Vorletzte Position selektieren möchte müsste ich  

schreiben?

Nein. Dann werden alle ab der vorletzte Position selektiert. 

Nicht nur ein Order. Die Schleife läuft bis keine Position mehr gibt.

Um gezielt nur vorletzte Position zu selektieren, benötigt man komplexen Code.

Das bedeutet, dass der vorletzte Order sollte irgendwelche Markierung haben, wie Kommentar u.s.w

 
snoopy21 #:
ok. Und wenn ich die Vorletzte Position selektieren möchte müsste ich  

schreiben?

Übrigens. Ihr Kode wird nicht funktionieren, weil da noch Ticket fällt.

 
Du kannst die orderinfos auch in einen Array schreiben und Danneberg den Array direkt die Order ansprechen, da kannst alles reinpacken was dich interessiert, ticketid, Direktion,..,
 

Ich habe den Code etwas umgestrickt. Also Ziel ist es, wenn eine Position hinzukommt, dass alle vorherigen Positionen ein SL = Öffnungspreises erhalten und mit nahezu 0 EUR schließen könnten. Ab der 2. eröffneten Position soll die Regel angewandt werden (cnt_BuyPos + cntSellPos >= 0)

Array klingt auch nicht schlecht. Habe dies mit Positionen noch nie programmiert |-o

void CheckBreakEvenStop(double Ask)
   {
      for(int i = 0; i <  PositionsTotal(); i++)
      {
      string PositionSymbol = PositionGetString(POSITION_SYMBOL);
      
      if (PositionSymbol == _Symbol
      && cnt_BuyPos + cnt_SellPos >= 2)
         {
         ulong PTicket = PositionGetTicket(i);
         long PositionDirection = PositionGetInteger(POSITION_TYPE);
         double PositionPrice = PositionGetDouble(POSITION_PRICE_OPEN);
         
         for(int i = 0; i <  PositionsTotal()-1; i++)
         if(PositionDirection == POSITION_TYPE_BUY)
            {
            double SL = PositionPrice  + 10*_Point;
            trade.PositionModify(PTicket, SL, 0);       //0 ist TP
            }
         else if(PositionDirection == POSITION_TYPE_SELL)
            {
            double TP = PositionPrice  - 10*_Point;
            trade.PositionModify(PTicket, SL, 0);       //0 ist TP
            }
         }
      }
   }
 

Habe probiert mit Array zu arbeiten.

Im Tester wird ein Ticket ausgeblendet, weil da ab Ticket 2 anfängt. )

void OnTick() {

   Letzte_Position();
//---
   int    digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); // number of decimal places
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);             // current sell price
   double price=bid;                                            // unnormalized open price
   price=NormalizeDouble(price,digits);                         // normalizing open price

   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);             // current buy price
   double price2=ask;                                            // unnormalized open price
   price2=NormalizeDouble(price2,digits);                         // normalizing open price

   if(PositionsTotal() < 4) {
      trade.Buy(0.10,_Symbol,price2,NULL,NULL,NULL);
      trade.Sell(0.10,_Symbol,price,NULL,NULL,NULL);
   }


}
//+------------------------------------------------------------------+
void Letzte_Position() {

   string Typ;
   for(int i=PositionsTotal()-1; i>=0; i--) {

         string PositionSymbol = PositionGetString(POSITION_SYMBOL);
         long PositionDirection = PositionGetInteger(POSITION_TYPE);

         ulong ticket=PositionGetTicket(i);
         ulong listofticket[] = {ticket};
         double totl=0.00;

         if(ticket>0) {

            if (PositionSymbol == _Symbol && PositionDirection == POSITION_TYPE_BUY) {

               for(int i = 0; i<=ArraySize(listofticket)-1; i++) {

                  if (ticket== listofticket[i]) {

                     double profit=PositionGetDouble(POSITION_PROFIT);
                     totl+=profit;
                     // printf(profit);

                     Typ = "sell";
                     ticket++;
                     Print("TicktID: "+(string)ticket+" Order: "+Typ+" Profit: "+(string)totl);

                  }
               }
            } else if (PositionSymbol == _Symbol && PositionDirection == POSITION_TYPE_SELL) {
               for(int i = 0; i<=ArraySize(listofticket)-1; i++) {

                  if (ticket== listofticket[i]) {

                     double profit=PositionGetDouble(POSITION_PROFIT);
                     totl+=profit;
                     // printf(profit);

                     Typ = "buy";
                     ticket++;
                     Print("TicktID: "+(string)ticket+" Order: "+Typ+" Profit: "+(string)totl);

                  }
               }
            }
         }
      }
}