MetaTrader5
Trailing Stop für MetaTrader 5: So implementierst du es richtig
Dieser Codeblock funktioniert sowohl mit einem Stop Loss als auch ohne. Hier sind die Voraussetzungen, die du beachten solltest: Du musst "Trade.mqh" einfügen, um Zugang zur CTrade-Klasse zu erhalten, die es dir ermöglicht, mit Positionen und Aufträgen zu arbeiten. #include <Trade\Trade.mqh> // <<------------------------------------------ Füge "Trade.mqh" ein, um auf die CTrade-Klasse zuzugreifen Du solltest einen Eingabeparameter festlegen, um den Abstand für den Trailing Stop nach deinen Wünschen anzupassen. Dies ist nicht zwingend erforderlich, aber praktisch. input double Trailing_Step = 3.0; Du musst eine Instanz der CTrade-Klasse definieren. Der Name kann beliebig sein, aber es ist sinnvoll, ihn nach dem OnInit-Ereignishandler zu benennen. Dann musst du eine if-Anweisung erstellen, um zu überprüfen, ob momentan Positionen laufen. Diese Anweisung ruft die Check_TrailingStop();-Funktion für jeden Tick auf. Das ist wichtig, da der EA den Trailing Stop präzise und flüssig verfolgen sollte. Achte darauf, diese Anweisung an den obersten Punkt des OnTick-Ereignishandlers zu setzen, damit sie richtig funktioniert. //+------------------------------------------------------------------+ //| Expert-Initialisierungsfunktion | //+------------------------------------------------------------------+ int OnInit() { //--- Timer erstellen EventSetTimer(60); //--- return (INIT_SUCCEEDED); } CTrade trade; // <<------------------------------------------ Deklariere die "CTrade"-Klasse. Du kannst "trade" durch jeden gewünschten Namen ersetzen void OnTick() { if(PositionsTotal() > 0) { // ruft die Trailing-Stop-Funktion für jeden Tick auf, wenn Positionen aktiv sind. Check_TrailingStop(); } } Du musst eine benutzerdefinierte Funktion namens Check_TrailingStop(); (in diesem Fall) deklarieren, um den Rest zu erledigen. Du kannst jeden gewünschten Namen verwenden. Die benutzerdefinierte Funktion durchläuft alle offenen Positionen und verfolgt sie entsprechend dem gewünschten Abstand. void Check_TrailingStop() { int totalPositions = PositionsTotal(); for(int count = 0; count < totalPositions; count++) { ulong TicketNo = PositionGetTicket(count); // Holt die Ticketnummer der Position anhand des Index. if(PositionSelectByTicket(TicketNo)) { // Wählt eine Position mit der Ticketnummer aus (wir haben die Ticketnummer bereits gewählt) if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { // Überprüft den Positionstyp. double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); // <<------------------- Holt den aktuellen Stop Loss der Position double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(bidPrice - (Trailing_Step * Point), _Digits); if(stopLoss < openPrice) { // Kein Stop Loss ist aktiv. if(bidPrice > openPrice && trailingLevel > openPrice) { // Wird nur einmal pro Position ausgeführt. Setzt den ersten SL. trade.PositionModify(ticket, trailingLevel, takeProfit); // Modifiziert den Trailing Stop mit "CTrade.trade" } } if(bidPrice > openPrice && trailingLevel > stopLoss) { // Überprüft, ob der Trailing-Level über dem vorherigen Level liegt. trade.PositionModify(ticket, trailingLevel, takeProfit); // Modifiziert den Trailing Stop mit "CTrade.trade" } } if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); double askPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(askPrice + (Trailing_Step * Point), _Digits); if(stopLoss < openPrice) { // Kein Stop Loss ist aktiv. if(askPrice < openPrice && trailingLevel < openPrice) { // Wird nur einmal pro Position ausgeführt. Setzt den ersten SL. trade.PositionModify(ticket, trailingLevel, takeProfit); // Modifiziert den Trailing Stop mit "CTrade.trade" } } if(askPrice < openPrice && trailingLevel < stopLoss) { // Überprüft, ob der Trailing-Level über dem vorherigen Level liegt. trade.PositionModify(ticket, trailingLevel, takeProfit); // Modifiziert den Trailing Stop mit "CTrade.trade" } } } } }
2024.04.05