Auf GitHub ansehen

Alexav D1 Profit GBPUSD-Strategie

Überblick

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

  1. 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.
  2. Sitzungsfilter
    • Für jede abgeschlossene Tageskerze von Dienstag bis Freitag wird nur eine Auswertung durchgeführt. Montags und Wochenenden werden ausgelassen.
  3. 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.
  4. 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;
	}
}