Hey liebe Community,
mal wieder bin ich mit meinen bescheidenen Programmierkenntnissen an meine Grenzen gestoßen.
Ich möchte
einen Partiellen TP für all meine offenen Trades definieren.
Das Problem: Alle Positionen haben verschiedene Positionsgrößen und der partielle TP soll nur ein einziges Mal pro Position ausgelöst werden.
Ich habe den Ansatz, dass ich in einem bool Array an der Position der Ticketnummer speichere, ob der TP schon ausgeführt wurde.
Gibt es da vielleicht eine schönere Lösung?
Zum Beispiel zu erfragen welche Positionsgröße eine Position initial hatte
und den TP nur auszuführen, wenn sie noch die gleiche Größe hat.
Wie immer vielen Dank im Voraus für Eure Hilfe.
In den positionsdaten gibts die Originale ordergrösse, die kannst auslesen über positioninfodouble
@Carl
Es ist ein Hedging-Konto.
@amando
Das ist gut zu wissen. Ich kannte bisher nur PositionGetDouble und kann PositionInfoDouble in MQL5 gar nicht finden.
Muss ich dazu eine Bilbiothek mit #include einbeziehen?
Ein anderer Ansatz war in den Positionskommentar einen Wert zu hinterlegen, ob die Position schon teilweise geschlossen wurde.
Wie ich das umsetze/umsetzen kann weiß ich aber leider auch nicht.
Danke Euch schonmal für die Antworten
@Carl
Es ist ein Hedging-Konto.
@amando
Das ist gut zu wissen. Ich kannte bisher nur PositionGetDouble und kann PositionInfoDouble in MQL5 gar nicht finden.
Muss ich dazu eine Bilbiothek mit #include einbeziehen?
Ein anderer Ansatz war in den Positionskommentar einen Wert zu hinterlegen, ob die Position schon teilweise geschlossen wurde.
Wie ich das umsetze/umsetzen kann weiß ich aber leider auch nicht.
Danke Euch schonmal für die Antworten
Meinte auch getdouble 😂😂😂 aber gerade geschaut, da stehts nicht drin
Steht in der ordergetdouble
die ordernummer ist im normalfall die gleiche wie die position beim hedging konto
@Carl
Es ist ein Hedging-Konto.
@amando
Das ist gut zu wissen. Ich kannte bisher nur PositionGetDouble und kann PositionInfoDouble in MQL5 gar nicht finden.
Muss ich dazu eine Bilbiothek mit #include einbeziehen?
Ein anderer Ansatz war in den Positionskommentar einen Wert zu hinterlegen, ob die Position schon teilweise geschlossen wurde.
Wie ich das umsetze/umsetzen kann weiß ich aber leider auch nicht.
Danke Euch schonmal für die Antworten
- Hier gibt es eine Liste aller Funktionen: https://www.mql5.com/de/docs/function_indices - man kann dort leicht mit Schlagworten suchen!
- Du könntest einen mehrdim. long Array nehmen long A[][][], mit Ticketnummer in der 1. Dimension, (long)(lot*100.0) in der 2. Dimension und (partiell*100.0) als 3. Dimension.
So ein Arrasy kannst Du mit 'Boardmitteln' sortieren: ArraySort() und Suchen: ArrayBsearch().
Dann und wann muss man halt die geschlossenen Positionen aus dem Array löschen und dann wieder sortieren!

- www.mql5.com
Hier mal der link zur order info
https://www.mql5.com/de/docs/constants/tradingconstants/orderproperties#enum_order_property_double
Achsoo :-)
Hmm dann muss ich nur mit dem Positionsticket das Volumen der Order auslesen können, obwohl sie schon ausgeführt wurde.
Dann ist mein Problem im Prinzip gelöst.
Weiß jemand, ob das funktioniert?
Achsoo :-)
Hmm dann muss ich nur mit dem Positionsticket das Volumen der Order auslesen können, obwohl sie schon ausgeführt wurde.
Dann ist
mein Problem im Prinzip gelöst.
Weiß jemand, ob das funktioniert?
Eine order läuft solange bis sie geschlossen wird, sprich die letzte position der order geschlossen wird
Das ist eine wichtige Info. Vielen Dank!
Leider macht die Funktion noch genau nichts, obwohl sie bei jedem Tick aufgerufen wird.
Habe ich einen groben
Fehler gemacht?
#include <Trade/Trade.mqh> void TakeProfitFunction(bool UseTP1,int TPDivisor1,int ATRHandle1, double TPATRMultiplier1) { if(UseTP1==true&&PositionsTotal()>0) { CTrade TPTrade; ulong tick; double ATRArray1[]; CopyBuffer(ATRHandle1,0,0,2,ATRArray1); ArraySetAsSeries(ATRArray1,true); for (int i=0; i<PositionsTotal();i++) { tick=PositionGetTicket(i); PositionSelectByTicket(tick); OrderSelect(tick); if(OrderGetDouble(ORDER_VOLUME_INITIAL)==PositionGetDouble(POSITION_VOLUME) && PositionGetInteger(POSITION_TYPE)==0 && PositionGetDouble(POSITION_PRICE_OPEN)+ATRArray1[1]*TPATRMultiplier1<=SymbolInfoDouble(_Symbol,SYMBOL_BID) ) { double Vol=PositionGetDouble(POSITION_VOLUME); TPTrade.PositionClosePartial(tick,NormalizeDouble(Vol/TPDivisor1,2),-1); } if(OrderGetDouble(ORDER_VOLUME_INITIAL)==PositionGetDouble(POSITION_VOLUME) && PositionGetInteger(POSITION_TYPE)==1 && PositionGetDouble(POSITION_PRICE_OPEN)-(ATRArray1[1]*TPATRMultiplier1)>=SymbolInfoDouble(_Symbol,SYMBOL_ASK) ) { double Vol=PositionGetDouble(POSITION_VOLUME); TPTrade.PositionClosePartial(tick,NormalizeDouble(Vol/TPDivisor1,2),-1); } } } }
Ist es wohl okay, wenn ich den Code nochmal im englischsprachigen Forum poste und frage, ob jemand einen Fehler findet?

- 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.
Hey liebe Community,
mal wieder bin ich mit meinen bescheidenen Programmierkenntnissen an meine Grenzen gestoßen.
Ich möchte einen Partiellen TP für all meine offenen Trades definieren.
Das Problem: Alle Positionen haben verschiedene Positionsgrößen und der partielle TP soll nur ein einziges Mal pro Position ausgelöst werden.
Ich habe den Ansatz, dass ich in einem bool Array an der Position der Ticketnummer speichere, ob der TP schon ausgeführt wurde.
Gibt es da vielleicht eine schönere Lösung?
Zum Beispiel zu erfragen welche Positionsgröße eine Position initial hatte und den TP nur auszuführen, wenn sie noch die gleiche Größe hat.
Wie immer vielen Dank im Voraus für Eure Hilfe.