Diskussion zum Artikel "Cross-Plattform Expert Advisor: Eigene Stopps, Breakeven und Trailing" - Seite 2

 
Enrico Lambino:

Ihr erster Code aktiviert den Breakeven, nicht den Trailingstop. Wenn es eine weitere Änderung des SL gäbe, wäre es der Takeprofit. Aber wenn Ihr TP bei 500 Punkten liegt, würde der Trailingstop bei 500 Punkten überhaupt nicht aktiviert, da der Handel zu diesem Zeitpunkt den Markt bereits verlassen hat.

Ihr zweiter Code verwendet den Trailingstop, aber nicht den Breakeven. Denn noch bevor der Breakeven angewendet werden kann, hat sich der SL bereits über den Breakeven-Preis bewegt.


Hallo Enrico,

ich habe deinen Punkt nicht verstanden.

Das ist Breakeven:

 //--- Erreichen der Gewinnschwelle
   CTrail *trail_be=new CTrail();
   //trail_be.Set(BELevel,BEOpenPriceDist,0); 
   trail_be.Set(230,250,0);   
   trails.Add(trail_be);

Das ist Trailing:

//--- Einstellung des Nachlaufstopps
   CTrail *trail=new CTrail();
   //Trail.Set(trail_value,trail_start,trail_step);
   trail.Set(400,500,10);
   trails.Add(trail);

Breakeven wird bei 250 Punkten aktiviert, Trailing wird bei 500 Punkten aktiviert. Wie Sie sehen, wird Trailing nicht früher als Breakeven aktiviert.

Der SL wurde nicht über (oder unter) den Breakeven-Preis verschoben. Der Stop Loss war derselbe anfängliche SL unterhalb des Eröffnungskurses. Der Trailing-Stop bewegte SL das erste Mal über den Eröffnungskurs (und den Breakeven-Kurs).

Trailing funktioniert gut. Breakeven funktioniert nicht(trail_be object). Wenn ich den Trailing-Stop nicht verwende, funktioniert der Breakeven problemlos.

 

Das Problem scheint nur bei Verkaufsaufträgen aufzutreten.

double CTrailsBase::Check(const string symbol,const ENUM_ORDER_TYPE type,const double entry_price,const double price,const ENUM_TRAIL_TARGET mode)
  {
   if(!Active())
      return 0;   
   double val=0.0,ret=0.0;
   MqlDateTime time_curr;
   TimeCurrent(time_curr);
   if(time_curr.day==3 && time_curr.hour==11 && time_curr.min>=30)
      Print("");
   for(int i=0;i<Total();i++)
     {
      CTrail *trail=At(i);
      if(!CheckPointer(trail))
         continue;
      if(!trail.Active())
         continue;
      int trail_target=trail.TrailTarget();
      if(mode!=trail_target)
         continue;
      val=trail.Check(symbol,type,entry_price,price,mode);
      if((type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if(val>ret || ret==0.0)
            ret=val;
      }      
      else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if(val<ret || ret==0.0)
            ret=val;
      }      
     }
   return ret;
  }

Problem an dieser Stelle

 else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if(val<ret || ret==0.0)
            ret=val;
      }      

Ich denke, es sollte geändert werden in:

 else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if( (val>0 && val<ret) || ret==0.0)
            ret=val;
      }      
 

Vielen Dank, dass Sie das Problem näher erläutert haben, und es tut mir leid, dass ich das vorhin falsch verstanden habe. Bezüglich dieser Änderung:

else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if( (val>0 && val<ret) || ret==0.0)
            ret=val;
      }   

Normalerweise setze ich den Breakeven-CTrail einfach als letzten Index, damit er zuletzt ausgewertet wird, aber der obige Code ist eine dauerhaftere Lösung für das Trailing des Stoploss von Verkaufstrades.

 

Wie kann ich einen bestimmten Stop an ein bestimmtes Signal binden? Aufgrund meiner Strategielogik hat jedes Einstiegssignal seinen eigenen Stopp.

Dasselbe gilt für Ausstiegssignale.

 

Hallo, ich habe ein Problem mit dem Experten, können Sie mir helfen?


'SetContainer' - unexpected token, probably type is missing?	SymbolManagerBase.mqh	55	21
'SetContainer' - function already defined and has different type	SymbolManagerBase.mqh	55	21
'Deinit' - unexpected token, probably type is missing?	SymbolManagerBase.mqh	62	21
'Deinit' - function already defined and has different type	SymbolManagerBase.mqh	62	21