Startseite Systemhandel Beitrag

Trailing Stop für MetaTrader 5: So implementierst du es richtig

Anhang
49021.zip (1.31 KB, Herunterladen 0 mal)

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" } } } } }










    Verwandte Beiträge

    Kommentar (0)