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
PositionsTotal()-
2
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
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); } } } } } }
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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.