MQL5 Trailing Stop

 
Findet jemand den Fehler?
Ich stehe gerade auf dem Schlauch.
Tralling stop funktioniert nicht obwohl ich die Anleiung übernommen habe.

#include<Trade\Trade.mqh>

CTrade trade;

void OnTick()
  {
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   
   if(PositionsTotal()<2)
   {
   trade.Buy(0.10,NULL,Ask,(Ask-100*_Point),(Ask+50*_Point),NULL);
   
   checkTrailingStop(Ask);
   }
   }
   void checkTrailingStop(double Ask)
   {
   double SL = NormalizeDouble(Ask-150*_Point,_Digits);
   
   for(int i = PositionsTotal() -1; i>=0; i--)
   {
   string symbol = PositionGetSymbol(i);
       if(_Symbol==symbol)
       {
      ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
      double CurrentStopLoss = PositionGetDouble(POSITION_SL);
      if(CurrentStopLoss<SL)
          {
          trade.PositionModify(PositionTicket,(CurrentStopLoss+10*_Point),0);
          }
      }   
   
}
   
   
   
   
   
      
   
   

 
Janis Hellmuth:
Findet jemand den Fehler?

Hab ihn !

Du hast den Code ohne den "Code-Button" eingefügt


Sieht doch gleich viel netter aus.

 #include<Trade\Trade.mqh>

CTrade trade;

void OnTick()
  {
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   
   if(PositionsTotal()<2)
   {
   trade.Buy(0.10,NULL,Ask,(Ask-100*_Point),(Ask+50*_Point),NULL);
   
   checkTrailingStop(Ask);
   }
   }
   void checkTrailingStop(double Ask)
   {
   double SL = NormalizeDouble(Ask-150*_Point,_Digits);
   
   for(int i = PositionsTotal() -1; i>=0; i--)
   {
   string symbol = PositionGetSymbol(i);
       if(_Symbol==symbol)
       {
      ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
      double CurrentStopLoss = PositionGetDouble(POSITION_SL);
      if(CurrentStopLoss<SL)
          {
          trade.PositionModify(PositionTicket,(CurrentStopLoss+10*_Point),0);
          }
      }   
   
}
} 
    

:-)

 

Ergänzend möchte ich noch empfehlen vor dem Posten im Editor unter Extras => Styler (Ctrl+,) den Code zu strukturieren!

Außerdem steht bestimmt nicht in der Anleitung, dass eine Funktion innerhalb von OnTick() deklariert wird!

Es gibt so viele funktionierende Beispiele für einen Trailng-Stop - man muss nur suchen!

 

Janis , dreh mal dein Vergleichsoperator von < auf >

void checkTrailingStop(double Ask)
   {
      double SL = NormalizeDouble(Ask-150*_Point,_Digits);
   
      for(int i = PositionsTotal() -1; i>=0; i--)
        {
          string symbol = PositionGetSymbol(i);
          if(_Symbol==symbol)
            {
              ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
              double CurrentStopLoss = PositionGetDouble(POSITION_SL);
              if(CurrentStopLoss>SL) // ********************************************
                {
                 trade.PositionModify(PositionTicket,(CurrentStopLoss+10*_Point),0);
                }
            }   
   
       }
   } 
   
   

Dann funktioniert er

 
Carl Schreiber:

Außerdem steht bestimmt nicht in der Anleitung, dass eine Funktion innerhalb von OnTick() deklariert wird!

Ist sie nicht , er hat nur die Klammern schlecht positioniert.

#include<Trade\Trade.mqh>

CTrade trade;

void OnTick()
  {
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   
   if(PositionsTotal()<2)
     {
       trade.Buy(0.10,NULL,Ask,(Ask-100*_Point),(Ask+50*_Point),NULL); 
       checkTrailingStop(Ask);
     }
   }
    
void checkTrailingStop(double Ask)
   {
      double SL = NormalizeDouble(Ask-150*_Point,_Digits);
   
      for(int i = PositionsTotal() -1; i>=0; i--)
        {
          string symbol = PositionGetSymbol(i);
          if(_Symbol==symbol)
            {
              ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
              double CurrentStopLoss = PositionGetDouble(POSITION_SL);
              if(CurrentStopLoss<SL)
                {
                 trade.PositionModify(PositionTicket,(CurrentStopLoss+10*_Point),0);
                }
            }   
   
       }
   } 
   
   
   
    
 
Christian:

Janis , dreh mal dein Vergleichsoperator von < auf >

Dann funktioniert er

Abe4r nur bei der Hälfte, da nicht nach Kauf- oder Verkaufspositionen unterschieden wird!
 
Carl Schreiber:
Abe4r nur bei der Hälfte, da nicht nach Kauf- oder Verkaufspositionen unterschieden wird!

Richtig, gilt nur für den Code mit BUY


Carl, versuch mal die Ausrufezeichen sparsam einzusetzen.

Das wirkt immer so streng, und das bist du doch nicht.

 
vielen dank für eure Hilfe! Beim nächsten mal werde ich die Codezeilen benutzen =) 

ich verstehe meinen Fehler nicht. Ich habe anstatt einer limit Order eine direkte verwendet und dann ging es....
 
Christian:

Ist sie nicht , er hat nur die Klammern schlecht positioniert.

Das kann so nicht gehen, der ea mcht 2 positionen auf, bis 2 positionen checkt er den tl, dann kommt er nicht mehr in die if rein

der trailing gehört in eine extra schleife wo er fragt ob eine position vorhanden ist

Und preis muss erstmal 100 points für mich sein, da er ja einen slvon 50 und einen tl von 150 hat
 
amando:

Das kann so nicht gehen, der ea mcht 2 positionen auf, bis 2 positionen checkt er den tl, dann kommt er nicht mehr in die if rein

der trailing gehört in eine extra schleife wo er fragt ob eine position vorhanden ist

Und preis muss erstmal 100 points für mich sein, da er ja einen slvon 50 und einen tl von 150 hat

Ist ja richtig, aber erstmal musste das konkrete Problem gefunden werden.


Der Rest ist dann erstmal uninteressant. Stück für Stück ...kennste doch noch aus deinen Anfängen.

Man sollte die Latte nicht zu hoch hängen dann kommt keiner mehr mit.

Meine Meinung.

 
Christian:

Ist ja richtig, aber erstmal musste das konkrete Problem gefunden werden.


Der Rest ist dann erstmal uninteressant. Stück für Stück ...kennste doch noch aus deinen Anfängen.

Man sollte die Latte nicht zu hoch hängen dann kommt keiner mehr mit.

Meine Meinung.

Geb ich dir recht christian, aber du kommst ja nie in den trailingstop

 if(PositionsTotal()<2)
     {
       trade.Buy(0.10,NULL,Ask,(Ask-100*_Point),(Ask+50*_Point),NULL);
     }




 if(PositionsTotal()!=0)
     {

       checkTrailingStop(Ask);
     }
   }
  
Dann könnte es funktionieren, ohne den 2 rahmen, der kommt weil ich am tablett bin