Expert Advisors: eaBreakeven

 

eaBreakeven:

Der Expert Advisor bewegt den Stop-Loss der Position zum benutzerdefiniertem Breakeven (Gewinnschwelle).

Autor: Alexey Lopatin

 

Fehler:

  1. Die Schleife sollte umgedreht werden.
  2. PositionSelect sollte aus dem Code entfernt werden.

 
fxsaber:

Irrtümer:

  1. Die Schleife sollte umgedreht werden.
  2. PositionSelect sollte aus dem Code entfernt werden.


Argumente für das Studio.

 
Alexey Lopatin:

Argumente, bitte.

Es dauert sehr lange, die Schleife zu erklären. Und PositionSelect ist nach PositionGetSymbol unnötig, weil die Auswahl bereits getroffen wurde, wenn LastError OK ist. Aber auch bei einem Hedge-Konto ist PositionSelect ein Übel.

Die beste Option ist es, immer diese statt der oben genannten zu verwenden.

if (PositionGetTicket(i))


Auch latest_price für jede Positionsrichtung könnte über POSITION_PRICE_CURRENT genommen werden.


Und diese Bedingung

if(latest_price.bid-price_open>=Breakeven*point && new_stoploss>stoploss && latest_price.bid-new_stoploss>stop_level)

kann auch in Fällen ausgelöst werden (aufgrund doppelter Eigenheiten), in denen nichts geändert werden muss.


Generell kann man es etwas kompakter und fehlerfreier umschreiben. Ich würde es im MT4-Stil machen.

#include <MT4Orders.mqh>     // https://www.mql5.com/de/code/16006
#include <Price_Compare.mqh> // https://www.mql5.com/de/code/16169

input int    Breakeven           = 15;           //Breakeven in Punkten
input int    Distance            = 5;            //Breakeven-Abstand in Punkten vom Eröffnungskurs der Position
input int    MagicNumber         = 16112017;     //Magische Zahl
input bool   EnableSound         = true;         /Aktivieren/Deaktivieren der Tonwiedergabe bei Erreichen des Break-Even-Wertes
input string SoundFile           = "alert1.wav"; //Tondateiname

void OnTick()
{
  DoBreakeven();
}

double GetNewStopLoss()
{
  const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);  
  const double stop_level = SymbolInfoInteger(OrderSymbol(), SYMBOL_TRADE_STOPS_LEVEL) * point;
  
  const double price_open = OrderOpenPrice();
  const double latest_price = OrderClosePrice();  
  const double stoploss = OrderStopLoss();

  double new_stoploss = 0;
  
  //--- Stop-Loss zum Breakeven-Kurs + Abstand verschieben, wenn Positionsgewinn größer als Breakeven-Punkte 
  return(((OrderType() == OP_BUY)  && (CP(latest_price - price_open, point) >= Breakeven * point) &&
                                      (CP(new_stoploss = price_open + Distance * point, point) > stoploss) &&
                                      (CP(latest_price - new_stoploss, point) > stop_level)) ||
         ((OrderType() == OP_SELL) && (CP(price_open - latest_price, point) >= Breakeven * point) &&
                                      ((CP(new_stoploss = price_open - Distance * point, point) < stoploss) || !stoploss) &&
                                      (CP(new_stoploss - latest_price, point) > stop_level))
         ? NormalizeDouble(new_stoploss, (int)SymbolInfoInteger(OrderSymbol(), SYMBOL_DIGITS)) : 0);
}

void DoBreakeven()
{
//Wenn Breakeven negativ ist, dann deaktivieren Sie die Breakeven-Funktion
  if (Breakeven >= 0)      
  //Schleife für Positionen
    for (int i = OrdersTotal() - 1; i >= 0; i--)
      if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (!MagicNumber || (OrderMagicNumber() == MagicNumber)))
      {
        const double new_stoploss = GetNewStopLoss();
        
        if (new_stoploss)      
        {
          if (!OrderModify(OrderTicket(), OrderOpenPrice(), new_stoploss, OrderTakeProfit(), OrderExpiration()))
            Print(GetLastError());
          else if(EnableSound)
            PlaySound(SoundFile);
        }
      }
}
 

Danke für die Antwort mit dem Beispiel. Ich freue mich immer, wenn ich etwas Neues für mich lerne.

Aber hier wäre es interessant zu wissen, warum PositionSelect bei einem Hedge-Konto schlecht ist?

 
Alexey Lopatin:

Aber hier wäre es interessant zu wissen, warum PositionSelect auf dem Hash Count böse ist?

Weil das Symbol die Position nicht eindeutig definiert.

 
caolyhuynh:
 
5000000
 
caolyhuynh: