Partieller Take Profit

Einloggen oder registrieren, um einen Kommentar zu schreiben
Ingo Christ
187
Ingo Christ  

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.

Carl Schreiber
Moderator
8416
Carl Schreiber  
Was für ein Konto Netting oder Hedging?
amando
1889
amando  
Ingo Christ:

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

Ingo Christ
187
Ingo Christ  

@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

amando
1889
amando  
Ingo Christ:

@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 Schreiber
Moderator
8416
Carl Schreiber  
Ingo Christ:

@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

  1. Hier gibt es eine Liste aller Funktionen: https://www.mql5.com/de/docs/function_indices - man kann dort leicht mit Schlagworten suchen!
  2. 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!
So kannst Du die double Werte in einem long Array unterbringen. In MQL5 gäbe es sonst nur einen Array einer Struktur, wo int (Ticket) und Lost, Anteil (double) gemischt werden könnten, aber da gäbe es kein Sort und Bsearch!
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...
amando
1889
amando  
Ingo Christ
187
Ingo Christ  

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?

amando
1889
amando  
Ingo Christ:

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

Ingo Christ
187
Ingo Christ  

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);      
        }
   
      }
 }

}
Ingo Christ
187
Ingo Christ  

Ist es wohl okay, wenn ich den Code nochmal im englischsprachigen Forum poste und frage, ob jemand einen Fehler findet?

12
Einloggen oder registrieren, um einen Kommentar zu schreiben