Expert Advisors: TrailingStopAndTake

 

TrailingStopAndTake:

Einfaches Trailing von Stop-Loss und Take-Profit-Orders offener Positionen.

Autor: Scriptor

 
//+------------------------------------------------------------------+
//| Gibt den korrekten StopLoss relativ zum StopLevel zurück |
//+------------------------------------------------------------------+
double CorrectStopLoss(const string symbol_name,const ENUM_POSITION_TYPE position_type,const int stop_loss) {
   if(stop_loss==0) return 0;
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   if(pt==0) return 0;
   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(symbol_name,SYMBOL_ASK) : SymbolInfoDouble(symbol_name,SYMBOL_BID));
   int lv=StopLevel(symbol_name),dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   return
     (position_type==POSITION_TYPE_BUY ?
      NormalizeDouble(::fmin(price-lv*pt,price-stop_loss*pt),dg) :
      NormalizeDouble(::fmax(price+lv*pt,price+stop_loss*pt),dg)
     );
}
//+------------------------------------------------------------------+
//| Prüft StopLoss auf Korrektheit in Bezug auf StopLevel |
//+------------------------------------------------------------------+
bool CheckCorrectStopLoss(const string symbol_name,const ENUM_POSITION_TYPE position_type,const double stop_loss)
  {
   if(stop_loss==0) return true;
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   if(pt==0) return false;
   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(symbol_name,SYMBOL_ASK) : SymbolInfoDouble(symbol_name,SYMBOL_BID));
   int lv=StopLevel(symbol_name),dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   return
     (
      position_type==POSITION_TYPE_BUY ? 
      NormalizeDouble(stop_loss-price- lv*pt,dg)<0 :
      NormalizeDouble(stop_loss-price+ lv*pt,dg)>0
     );
  }

Fehler hervorgehoben.

 
fxsaber:

Fehler werden hervorgehoben.

   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(symbol_name,SYMBOL_ASK) : SymbolInfoDouble(symbol_name,SYMBOL_BID));
   int lv=StopLevel(symbol_name),dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   return
     (position_type==POSITION_TYPE_BUY ?
      NormalizeDouble(::fmin(price-lv*pt,price-stop_loss*pt),dg) :
      NormalizeDouble(::fmax(price+lv*pt,price+stop_loss*pt),dg)
     );

Worin besteht der Fehler?

 
Artyom Trishkin:

Wo liegt der Fehler?

Es wird der falsche Preis verwendet.

 
fxsaber:

Der Preis wird falsch verwendet.

Begründen Sie.
 
Artyom Trishkin:
Begründen.
OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, Bid);

Es funktioniert, wenn StopLevel == 0 ist.

 
Gibt es eine mt4-Version?
 

Tolle Arbeit! Ich danke Ihnen vielmals!

 
Einfach zu bedienen. Top. Großartig.
 

Hallo zusammen.


Ich versuche, Ihre EA zu verwenden, aber es bekommen aus mit Code 1.

Es ist brasilianischen IBOV Markt. gedeckte Verträge und real-Konto.

 
Die Trailing-Stops scheinen sich nicht anzupassen, wenn sich der Preis weiter entfernt. Gibt es etwas, das ich übersehe?