Ursprünglichen SL nach Änderung herausfinden

 

Hallo, ich habe einen TrailingStop und würde gerne, wenn der Preis den Abstand zwischen dem SL der Positionsöffnung und dem Öffnungspreis im Positiven ist, einen Teil der Position schließen.

Zum Beispiel:

ich kaufe Paar XY bei 1000, der SL ist bei 500

Wenn der Preis jetzt bei 1500 ist, möchte ich einen Teil der Position schließen. Der Sl ist jetzt bei beispielsweise 1300, ich kann also nicht sagen

if(MathAbs(posOpen-posSL) >= MathAbs(Ask-posOpen))...

gibt es eine Möglichkeit so etwas zu berechnen?

PS: Der SL bei Positionsöffnung ist dynamisch, also nicht im fixen Abstand

 
UnknownInnocent:

Hallo, ich habe einen TrailingStop und würde gerne, wenn der Preis den Abstand zwischen dem SL der Positionsöffnung und dem Öffnungspreis im Positiven ist, einen Teil der Position schließen.

Zum Beispiel:

ich kaufe Paar XY bei 1000, der SL ist bei 500

Wenn der Preis jetzt bei 1500 ist, möchte ich einen Teil der Position schließen. Der Sl ist jetzt bei beispielsweise 1300, ich kann also nicht sagen

gibt es eine Möglichkeit so etwas zu berechnen?

PS: Der SL bei Positionsöffnung ist dynamisch, also nicht im fixen Abstand

Ich habe das jetzt so probiert, dass ich beim Positionsöffnen den abstand im Kommentar speichere:

sell(abstand,inpStarsTPmult,("evening star|"+(string)abstand));
_trade.Sell(chek_volume_lot,NULL,_symbol.Ask(),_symbol.Ask()+abstand,_symbol.Ask()-(abstand * profitmultiplikator),comment);

Und in meiner TrailingStop Methode greife ich dann daruaf zu:

void checkPositions(double ask, double bid) {
   if(PositionsTotal() < 1) return;
   
   double tslPoints = 300;
   
   for(int i = 0; i < PositionsTotal(); i++) {
      string symbol = PositionGetSymbol(i); //Symbol der Position i
      if(_Symbol == symbol) {
         ulong  posTicket     =  PositionGetInteger(POSITION_TICKET);    // Positionsticket
         int    posDirection  =  (int)PositionGetInteger(POSITION_TYPE); // Positionsrichtung
         double posSize       =  PositionGetDouble(POSITION_VOLUME);     // Positionsgröße            
         double posOpen       =  PositionGetDouble(POSITION_PRICE_OPEN); // Öffnungspreis der Position
         double posSL         =  PositionGetDouble(POSITION_SL);         // SL der Position
         double posVolume     =  PositionGetDouble(POSITION_VOLUME);     // Volumen der Position
         string comment       =  PositionGetString(POSITION_COMMENT);    // Comment der Position
         
//------- Short Position         
         if(posDirection == POSITION_TYPE_SELL) {
            double abstand = (double)getTeilVonComment(comment,1);
            //--
            if(posSL > posOpen &&
               bid <= (posOpen - (abstand*0.66)))
                  _trade.PositionModify(posTicket,posOpen,0);
            
            if(bid <= (posOpen - abstand) &&
               MathAbs(posSL-(posOpen-abstand)) <= tslPoints*_Point)
                  _trade.PositionClosePartial(posTicket,NormalizeDouble((posVolume * 0.5),_Digits),-1);
            
            if(MathAbs(posSL-bid) > tslPoints*_Point &&                       // Wenn der Abstand zwischen SL und Bid größer ist als die
               posSL <= posOpen)                                              // vorgegebenen TSL-Punkte und der SL bereits auf den Einsteig gesetzt wurde,
                  _trade.PositionModify(posTicket,(bid+tslPoints*_Point),0);  // ziehe den SL im Abstand von TSL-Punkten nach
            
         }
      }      
   }
}
string getTeilVonComment(string comment, int pos) { // commen: Sting der in Teilstrings unterteilt wird, pos: Position: 0 = Signal, 1 = Abstand
   
   string sep = "|";
   ushort u_sep;
   string result[];
//--- Code des Trennzeichens erhalten
   u_sep = StringGetCharacter(sep,0);
//--- den String in Teilstrings unterteilen
   int k = StringSplit(comment,u_sep,result);
//--- richtiges Ergebnis zurückgeben
   switch(pos) {
      case 0:
         return(result[0]);
         break;
      case 1:
         return(result[1]);
         break;
      default:
         return("-1");
         break;
   }

}

Jetzt habe ich aber das Problem, dass nicht immer, aber manchmal ein leerer String an die getTeilVonComment-methode übergeben wird und somit ein OnTick-Critical-Error entsteht, ich weiß aber beim besten Willen nicht wieso das passiert....

 

Lies mal diesen Artikel: https://www.mql5.com/de/articles/1111 (MQL5-Kochbuch: Verarbeitung des TradeTransaction-Ereignisses)

Alles ist aus der Deal-History ablesbar.  Studiere mal auf Deinem Konto wie aus dem Auftrag/Order, eine offene Position und eine geschlossene wird und wie sich das in den Deals spiegelt.

Siehe dazu die relevanten Funktionen hier auf der linke Seite: https://www.mql5.com/de/docs/trading/historydealstotal

MQL5-Kochbuch: Verarbeitung des TradeTransaction-Ereignisses
MQL5-Kochbuch: Verarbeitung des TradeTransaction-Ereignisses
  • www.mql5.com
In diesem Artikel würde ich sehr gerne eine der beiden Möglichkeiten ansprechen, Handelsereignisse mittels der Instrumente und Tools von MQL5 zu kontrollieren. Es sei vorsorglich erwähnt, dass bereits einige wenige Artikel zu diesem Thema existieren. „Handelsereignisse im Expert-Advisor mit Hilfe der OnTrade()-Funktion bearbeiten“ ist einer von...