Alexav D1 Profit GBPUSD ist ein tägliches Breakout-System, das aus dem MetaTrader 4 Expert Advisor Alexav_d1_profit_gbpusd.mq4 konvertiert wurde. Die Strategie basiert auf täglichen GBP/USD-Kerzen und wertet die abgeschlossene Sitzung einmal täglich (Dienstag bis Freitag) aus. Die Bestätigung des Momentums erfolgt durch RSI und MACD, während volatilitätsbereinigte Stopps und gestaffelte Gewinnziele von ATR abgeleitet werden.
Handelslogik
Indikatorvorbereitung
Zwei EMAs mit demselben Zeitraum werden auf die täglichen Höchst- und Tiefstpreise angewendet, um bullische und bärische Referenzniveaus zu definieren.
RSI mit einem 10-Perioden-Lookback misst die Dynamik. Extreme RSI-Werte blockieren vorübergehend neue Trades in diese Richtung.
MACD (24.05.14) liefert einen Beschleunigungsfilter durch Vergleich der letzten beiden Histogrammwerte.
ATR (28) stellt die Volatilitätseinheit dar, die für Stopps und Gewinnziele verwendet wird.
Sitzungsfilter
Für jede abgeschlossene Tageskerze von Dienstag bis Freitag wird nur eine Auswertung durchgeführt. Montags und Wochenenden werden ausgelassen.
Lange Einrichtung
Die vorherige Tageskerze muss über den vor zwei Sitzungen berechneten Höchstständen von EMA schließen.
RSI der vorherigen Sitzung muss über der Obergrenze (Standard 60), aber unter der Obergrenze (Standard 80) liegen.
MACD muss entweder vor zwei Sitzungen unter Null liegen oder eine ausreichende positive Beschleunigung im Vergleich zum vorherigen Wert aufweisen.
Wenn die vorherige Eröffnung wieder unter die EMA-Höchstwerte fällt, ermöglicht die Strategie eine neue Reihe von Käufen, nachdem der Block zurückgesetzt wurde.
Kurze Einrichtung
Spiegeln Sie die Logik des langen Setups wider und verwenden Sie EMA von Tiefstwerten, RSI untere Schwellenwerte (39/25) und MACD-Filter.
Orderverwaltung
Wenn eine Einrichtung bestätigt wird, öffnet die Strategie einen Stapel von vier Marktaufträgen (jeweils unter Verwendung der Strategie Volume):
Stops: Jede Order hat denselben Schutzstopp, der ATR * AtrStopMultiplier (Standard 1,6) vom Einstiegspreis entfernt ist.
Ziele: Gewinnziele werden für den Auftragsindex i in [0..3] um AtrTargetMultiplier * (1 + i / 2) skaliert und replizieren die ursprünglichen EA-Offsets von 1,0, 1,5, 2,0 und 2,5 ATR.
Konfliktbehandlung: Gegensätzliche Positionen werden abgeflacht, bevor ein neuer Stapel geöffnet wird. Durch das Auslösen einer langen Charge werden alle ausstehenden kurzen Chargen gelöscht (und umgekehrt).
Die Strategie überwacht abgeschlossene Kerzen. Wenn das Tagestief den Stop berührt, wird die entsprechende Long-Order zum Marktwert geschlossen; Erreicht das Hoch das Ziel, wird die Order ebenfalls geschlossen. Shorts werden symmetrisch gehandhabt, wobei das Hoch der Kerze für Stopps und das Tief der Kerze für Ziele verwendet wird.
Parameter
Parameter
Beschreibung
Standard
CandleType
Primäre Kerzenserie, standardmäßig täglich.
1 Tag
MaPeriod
Zeitraum von EMA, angewendet auf Höchst-/Tiefstwerte.
6
RsiPeriod
RSI Zeitraum für Momentumfilter.
10
AtrPeriod
ATR Zeitraum für Stopp-/Zielgrößenbestimmung.
28
AtrStopMultiplier
ATR Vielfaches für Stopps.
1.6
AtrTargetMultiplier
Basis ATR Vielfaches für Ziele.
1,0
RsiUpperLevel
Der Schwellenwert von RSI bestätigt die Aufwärtsdynamik.
60
RsiUpperLimit
RSI-Obergrenze, die neue Long-Positionen blockiert.
80
RsiLowerLevel
Der Schwellenwert von RSI bestätigt die rückläufige Dynamik.
39
RsiLowerLimit
RSI Boden, der neue Shorts blockiert.
25
FastMaPeriod
Schneller Zeitraum von EMA für MACD.
5
SlowMaPeriod
Langsamer Zeitraum von EMA für MACD.
24
SignalMaPeriod
Signalisieren Sie einen Zeitraum von EMA für MACD.
14
MacdDiffBuy
Mindestbeschleunigung von MACD für lange Strecken.
0,5
MacdDiffSell
Mindestbeschleunigung MACD für Kurzschlüsse.
0,15
Stellen Sie die Strategie Volume auf die gewünschte Losgröße pro Auftrag ein, bevor Sie die Strategie starten.
Notizen
Bei der Konvertierung wird die Logik der Einzelauswertung pro Tag des ursprünglichen Expert Advisors beibehalten.
Verwenden Sie beim Backtesting historische Tagesdaten für GBP/USD, um das beabsichtigte Verhalten zu reproduzieren.
Schutzstopps und -ziele werden anhand abgeschlossener Kerzenextreme simuliert. Intraday-Spitzen innerhalb einer Tageskerze sind für die Strategie nicht sichtbar.
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Alexav D1 Profit breakout strategy.
/// Buys when price breaks above EMA and RSI is rising.
/// Sells when price breaks below EMA and RSI is falling.
/// </summary>
public class AlexavD1ProfitGbpUsdBreakoutStrategy : Strategy
{
private readonly StrategyParam<int> _emaPeriod;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevClose;
private decimal _prevEma;
private decimal _prevRsi;
private bool _hasPrev;
public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public AlexavD1ProfitGbpUsdBreakoutStrategy()
{
_emaPeriod = Param(nameof(EmaPeriod), 20)
.SetDisplay("EMA Period", "EMA period", "Indicators");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetDisplay("RSI Period", "RSI period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
/// <inheritdoc />
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevClose = 0m;
_prevEma = 0m;
_prevRsi = 0m;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(ema, rsi, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal emaValue, decimal rsiValue)
{
if (candle.State != CandleStates.Finished)
return;
var close = candle.ClosePrice;
if (!_hasPrev)
{
_prevClose = close;
_prevEma = emaValue;
_prevRsi = rsiValue;
_hasPrev = true;
return;
}
// Breakout above EMA with rising RSI
if (_prevClose <= _prevEma && close > emaValue && rsiValue > _prevRsi && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// Breakout below EMA with falling RSI
else if (_prevClose >= _prevEma && close < emaValue && rsiValue < _prevRsi && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevClose = close;
_prevEma = emaValue;
_prevRsi = rsiValue;
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan, Math
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import ExponentialMovingAverage, RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class alexav_d1_profit_gbp_usd_breakout_strategy(Strategy):
"""Alexav D1 Profit breakout strategy.
Buys when price breaks above EMA and RSI is rising.
Sells when price breaks below EMA and RSI is falling."""
def __init__(self):
super(alexav_d1_profit_gbp_usd_breakout_strategy, self).__init__()
self._ema_period = self.Param("EmaPeriod", 20) \
.SetDisplay("EMA Period", "EMA period", "Indicators")
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._prev_close = 0.0
self._prev_ema = 0.0
self._prev_rsi = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def EmaPeriod(self):
return self._ema_period.Value
@property
def RsiPeriod(self):
return self._rsi_period.Value
def OnReseted(self):
super(alexav_d1_profit_gbp_usd_breakout_strategy, self).OnReseted()
self._prev_close = 0.0
self._prev_ema = 0.0
self._prev_rsi = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(alexav_d1_profit_gbp_usd_breakout_strategy, self).OnStarted2(time)
self._has_prev = False
ema = ExponentialMovingAverage()
ema.Length = self.EmaPeriod
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(ema, rsi, self._process_candle).Start()
def _process_candle(self, candle, ema_value, rsi_value):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
ema_val = float(ema_value)
rsi_val = float(rsi_value)
if not self._has_prev:
self._prev_close = close
self._prev_ema = ema_val
self._prev_rsi = rsi_val
self._has_prev = True
return
# Breakout above EMA with rising RSI
if self._prev_close <= self._prev_ema and close > ema_val and rsi_val > self._prev_rsi and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
# Breakout below EMA with falling RSI
elif self._prev_close >= self._prev_ema and close < ema_val and rsi_val < self._prev_rsi and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._prev_close = close
self._prev_ema = ema_val
self._prev_rsi = rsi_val
def CreateClone(self):
return alexav_d1_profit_gbp_usd_breakout_strategy()