Fehler:
- Die Schleife sollte umgedreht werden.
- PositionSelect sollte aus dem Code entfernt werden.
Irrtümer:
- Die Schleife sollte umgedreht werden.
- PositionSelect sollte aus dem Code entfernt werden.
Argumente für das Studio.
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?
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.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
eaBreakeven:
Autor: Alexey Lopatin