TrailingStop mit Steps

 
ich habe unten stehenden Code als TrailingStop aus einem Youtube-Video nachgebaut.
wie bekomme ich es hin das ich diesen z.b. nur 2x ausführen lassen kann? also gewisse
input int TslTriggerSteps = 2;
hinzufügen kann, das er nach den eingegebenen 2 mal das nachziehen  stoppt?
habe schon alles mögliche versucht, bekomme es aber nicht hin.

#include <Trade/Trade.mqh>

input int TslPoints = 4000;
input int TslTriggerPoints = 4000;

CTrade trade;

void OnTick(){

   for(int i = PositionsTotal()-1; i >=0; i--){
      ulong posTicket = PositionGetTicket(i);
      
      if (PositionSelectByTicket(posTicket) && PositionGetString(POSITION_SYMBOL) == _Symbol){
       ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
       double posOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
       double posTp = PositionGetDouble(POSITION_TP);
       double posSl = PositionGetDouble(POSITION_SL);
       
         double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
         double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
         
       if(posType == POSITION_TYPE_BUY){
         if(bid >= posOpenPrice + TslTriggerPoints * _Point){
            double sl = bid - TslPoints * _Point;
            sl = NormalizeDouble(sl,_Digits);
           
            
            if(sl > posSl){
               if (trade.PositionModify(posTicket,sl,posTp)){
                  Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl...");     
               }
            }
        }
       }else if(posType == POSITION_TYPE_SELL){
         if(ask <= posOpenPrice - TslTriggerPoints * _Point){
            double sl = ask + TslPoints * _Point;
            sl = NormalizeDouble(sl,_Digits);
            
            if(sl < posSl || posSl == 0){
               if (trade.PositionModify(posTicket,sl,posTp)){
                  Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl...");     
              }
            }
          }
        }
      }
   }
}
Bin für jede Hilfe Dankbar.
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Ordereigenschaften
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Ordereigenschaften
  • www.mql5.com
Ordereigenschaften - Handelskonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 

Du brauchst globale veränderbare Variablen für Kauf und Verkauf, die bei einer neuen Position auf = gestellt wird und dann beim Trailing um 1 erhöht und dann gegen den Maximalwert getestet wird.

Ungetestet(!):

input int TslTriggerSteps = 2;
int _TslTriggerStepsBUY;                   // globale veränderbare Variable
...

OnTick() {
   ...
   if (_TslTriggerSteps < TslTriggerSteps) {
    if(posType == POSITION_TYPE_BUY){
       if(bid >= posOpenPrice + TslTriggerPoints * _Point){
          _TslTriggerStepsBUY++;
          ...
   }  }  }
   ...
   if (open new buy position) {
      ...
      _TslTriggerStepsBUY = 0                  // rücksetzen auf 0
  }
}
 

Carl Schreiber #:
++

Besten Dank für deine Antwort. ich habe Dein " if (_TslTriggerSteps < TslTriggerSteps) {" zu " if (_TslTriggerStepsBUY < TslTriggerSteps) {" umgeschrieben weil es das sonst nicht gefunden hätte .

so wie ich den Code jetzt habe (und auch wenn ich das rücksetzen auf 0 rauslassen würde) setzt er mir einmalig den SL auf einstiegspreis und das war es dann mit den Schritten des nachziehens (2x, 3x oder 5x beispielsweise Ignoriert er dabei total)

Was mach ich falsch?

#include <Trade/Trade.mqh>

input int TslPoints = 4000;
input int TslTriggerPoints = 4000;
input int TslTriggerSteps = 3;
int _TslTriggerStepsBUY;

CTrade trade;

void OnTick(){

   for(int i = PositionsTotal()-1; i >=0; i--){
      ulong posTicket = PositionGetTicket(i);
      
      if (PositionSelectByTicket(posTicket) && PositionGetString(POSITION_SYMBOL) == _Symbol){
       ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
       double posOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
       double posTp = PositionGetDouble(POSITION_TP);
       double posSl = PositionGetDouble(POSITION_SL);
       
         double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
         double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
       if (_TslTriggerStepsBUY < TslTriggerSteps) {  
       if(posType == POSITION_TYPE_BUY){
         if(bid >= posOpenPrice + TslTriggerPoints * _Point){
            double sl = bid - TslPoints * _Point;
            sl = NormalizeDouble(sl,_Digits);
            _TslTriggerStepsBUY++;
           
            
            if(sl > posSl){
               if (trade.PositionModify(posTicket,sl,posTp)){
                  Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl..."); 
                  _TslTriggerStepsBUY = 0;                // rücksetzen auf 0
                   }
            }
        }
       }else if(posType == POSITION_TYPE_SELL){
         if(ask <= posOpenPrice - TslTriggerPoints * _Point){
            double sl = ask + TslPoints * _Point;
            sl = NormalizeDouble(sl,_Digits);
            
            if(sl < posSl || posSl == 0){
               if (trade.PositionModify(posTicket,sl,posTp)){
                  Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl...");   
                  }  
              }
            }
          }
        }
      }
   }
}
 

Also, wenn ein Programm ohne Fehler kompiliert, aber nicht macht, was es soll, verwendet man den Debugger, um durch das zeilenweise Verfolgen des Programmablaufs herauszufinden, warum und wo es schief läuft: https://www.metatrader5.com/de/metaeditor/help/development/debug.

Du musst wissen, es gibt fast nichts, das nicht schon für MT4/5 programmiert wurde! Also Suchen statt programmieren:

    => Suchen in den Artikeln: https://www.mql5.com/de/articles
    => Suchen in der Codebase: https://www.mql5.com/de/code
    => Suchen allgemein: https://www.mql5.com/de/search oder über Google mit: "site:mql5.com .." (verzeiht Schreibfehler)

Hier ist eine Zusammenstellung für Neulinge: https://www.mql5.com/de/forum/455957#comment_50048608

Code-Debugging - Programme entwickeln - MetaEditor Hilfe
  • www.metatrader5.com
MetaEditor hat einen eingebauten Debugger, mit dem Sie die Programmausführung Schritt für Schritt (durch einzelne Funktionen) ü...
 

Ja ohne fehler kompiliert es aber da ich mich selbst mit dem Coden auf dieser Plattform auskenne, weiß ich noch nicht so recht ob der fehler dennoch hinter der Tastatur sitzt ;-)

ich habe schon alles mögliche durchgeschaut und ausprobiert, nur finde ich entweder was komplett falsches oder nur Schnipsel, die ich nicht zusammenbekomme aufgrund des aktuellen Wissenstandes.

ich versuche es mal mit dem Debugger

 
Asix5:
#include <Trade/Trade.mqh> input int TslPoints = 4000; input int TslTriggerPoints = 4000; CTrade trade; void OnTick(){    for(int i = PositionsTotal()-1; i >=0; i--){       ulong posTicket = PositionGetTicket(i);              if (PositionSelectByTicket(posTicket) && PositionGetString(POSITION_SYMBOL) == _Symbol){        ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);        double posOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);        double posTp = PositionGetDouble(POSITION_TP);        double posSl = PositionGetDouble(POSITION_SL);                 double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);          double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);                 if(posType == POSITION_TYPE_BUY){          if(bid >= posOpenPrice + TslTriggerPoints * _Point){             double sl = bid - TslPoints * _Point;             sl = NormalizeDouble(sl,_Digits);                                     if(sl > posSl){                if (trade.PositionModify(posTicket,sl,posTp)){                   Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl...");                    }             }         }        }else if(posType == POSITION_TYPE_SELL){          if(ask <= posOpenPrice - TslTriggerPoints * _Point){             double sl = ask + TslPoints * _Point;             sl = NormalizeDouble(sl,_Digits);                          if(sl < posSl || posSl == 0){                if (trade.PositionModify(posTicket,sl,posTp)){                   Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl...");                   }             }           }         }       }    } }

Hallo,

wieso machen Sie es nicht mit "return" Befehl?

input int TslTriggerSteps = 2;

#include <Trade/Trade.mqh>

input int TslPoints = 4000;
input int TslTriggerPoints = 4000;

CTrade trade;

void OnTick(){

   for(int i = PositionsTotal()-1; i >=0; i--){
      ulong posTicket = PositionGetTicket(i);
      
      if (PositionSelectByTicket(posTicket) && PositionGetString(POSITION_SYMBOL) == _Symbol){
       ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
       double posOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
       double posTp = PositionGetDouble(POSITION_TP);
       double posSl = PositionGetDouble(POSITION_SL);
       
         double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
         double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
         
       if(posType == POSITION_TYPE_BUY){

          if(bid > posOpenPrice + (TslTriggerPoints * TslTriggerSteps)*_Point){
            return;
           }        

         if(bid >= posOpenPrice + TslTriggerPoints * _Point){
            double sl = bid - TslPoints * _Point;
            sl = NormalizeDouble(sl,_Digits);
           
            
            if(sl > posSl){
               if (trade.PositionModify(posTicket,sl,posTp)){
                  Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl...");     
               }
            }
        }
       }else if(posType == POSITION_TYPE_SELL){

         if(ask < posOpenPrice - (TslTriggerPoints * TslTriggerSteps)*_Point){
            return;
           }    

         if(ask <= posOpenPrice - TslTriggerPoints * _Point){
            double sl = ask + TslPoints * _Point;
            sl = NormalizeDouble(sl,_Digits);
            
            if(sl < posSl || posSl == 0){
               if (trade.PositionModify(posTicket,sl,posTp)){
                  Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl...");     
              }
            }
          }
        }
      }
   }
}

Gruß Igor

Grund der Beschwerde: