Auf GitHub ansehen

SUPERMACBOT von The Guardian Forex TV Strategy

Überblick

Die SUPERMACBOT by The Guardian Forex TV Strategy repliziert das Konzept des ursprünglichen MetaTrader-Expertenberaters, indem sie den MACD-Oszillator mit einem dualen einfachen Trendfilter für gleitende Durchschnitte und einem Ausstiegsfilter für nachlaufende Durchschnitte kombiniert. Die konvertierte StockSharp-Implementierung funktioniert bei abgeschlossenen Kerzen und sendet Marktaufträge, wenn sich ein bullischer oder bärischer Zusammenfluss bildet. Die Strategie vermeidet den Tick-für-Tick-Handel und folgt den übergeordneten API-Richtlinien, indem sie auf Kerzenabonnements und Indikatorbindungen setzt.

Die Handelsmaschine bewertet die Dynamik anhand des MACD-Histogramms und der Trendausrichtung zwischen zwei einfachen gleitenden Durchschnitten. Ein nachlaufender gleitender Durchschnitt fungiert sowohl als Referenz für das Handelsmanagement als auch als verzögerter Bestätigungsfilter und spiegelt das im Experten MQL konfigurierte Nachlaufmodul wider. Die StockSharp-Version konzentriert sich auf Klarheit und Portabilität über Instrumente und Zeitrahmen hinweg, indem jeder Schlüsselwert als konfigurierbarer Parameter verfügbar gemacht wird.

Handelslogik

  1. Datenquelle – die Strategie abonniert einen konfigurierbaren Kerzentyp (Zeitrahmen). Jede abgeschlossene Kerze löst den Entscheidungsfluss aus.
  2. Indikatorvorbereitung – MACD (mit einstellbaren schnellen, langsamen und Signalperioden) und zwei SMAs werden bei jeder Kerze neu berechnet. Ein zusätzlicher SMA repliziert den nachgestellten Filter des MQL-Experten.
  3. Eintrittsregeln
    • Langer Eintrag
      • MACD Histogramm überschreitet den konfigurierbaren Schwellenwert.
      • Der schnelle SMA liegt über dem langsamen SMA und zeigt einen etablierten Aufwärtstrend.
      • Der Schlusskurs bleibt über dem letzten SMA, um die Preisstärke sicherzustellen.
      • Die Strategie hat keine bestehende Long-Position (es wird nur eine Nettoposition beibehalten).
    • Kurzer Eintrag
      • Das Histogramm von MACD unterschreitet den negativen Schwellenwert.
      • Der schnelle SMA liegt unter dem langsamen SMA, was auf ein rückläufiges Umfeld hinweist.
      • Der Schlusskurs bleibt unter dem nachfolgenden SMA.
      • Die Strategie beinhaltet kein Short-Engagement.
  4. Ausgangsregeln
    • Long-Positionen werden geschlossen, wenn eines der folgenden Ereignisse eintritt: Das Histogramm wird negativ, der schnelle SMA fällt unter den langsamen SMA oder der Preis schließt unter dem nachlaufenden SMA.
    • Short-Positionen werden geschlossen, wenn das Histogramm positiv wird, der schnelle SMA über den langsamen SMA steigt oder der Preis über dem nachlaufenden SMA schließt.
  5. Risikomanagement – der Algorithmus handelt eine einzelne Nettoposition und niemals Pyramiden. Schutzstopps können bei Bedarf extern mithilfe von StockSharp-Risikoregeln hinzugefügt werden.

Parameter

Name Beschreibung Standard
CandleType Von der Strategie verarbeitete Kerzenserie. Zeitrahmen von 1 Minute
FastMaPeriod Periode des schnellen einfachen gleitenden Durchschnittsfilters. 12
SlowMaPeriod Periode des langsamen einfachen gleitenden Durchschnittsfilters. 26
MacdFastPeriod Schneller Zeitraum von EMA für den Indikator MACD. 12
MacdSlowPeriod Langsamer Zeitraum von EMA für den Indikator MACD. 24
MacdSignalPeriod Signalzeitraum von EMA für den Indikator MACD. 9
HistogramThreshold Minimaler absoluter Wert, der aus dem MACD-Histogramm benötigt wird, bevor eine Position eröffnet wird. 0,0
TrailingPeriod Zeitraum des nachlaufenden einfachen gleitenden Durchschnitts, der für Bestätigungen und Ausstiege verwendet wird. 12

Alle Parameter werden über StrategyParam<T> verfügbar gemacht und können im StockSharp Designer optimiert werden.

Nutzungshinweise

  • Hängen Sie die Strategie an jede Sicherheit und jeden Zeitrahmen an, der zu Ihrer Testumgebung passt.
  • Stellen Sie sicher, dass ein ausreichender Verlaufspuffer zur Verfügung steht, damit alle Indikatoren vollständig ausgebildet sind, bevor der Handel beginnt.
  • Da die Strategie mit fertigen Kerzen und Nettopositionen arbeitet, ist es sicher, Portfolios mit mehreren Instrumenten ohne widersprüchliche Aufträge auszuführen.
  • Durch die Zusammenstellung der Strategie mit anderen StockSharp-Modulen kann zusätzliches Geldmanagement (Lotgröße, Stop-Losses, Teilausstiege) hinzugefügt werden.

Unterschiede zum Original-Experten

  • Die StockSharp-Konvertierung konzentriert sich auf die Candle-Close-Logik und nicht auf die ereignisgesteuerte Engine des MetaTrader Expert Advisors. Dadurch bleibt das Verhalten bei Backtests und Live-Handel deterministisch.
  • Lot-Sizing- und Trailing-Stop-Orders des ursprünglichen Expert Advisors werden durch einen vereinfachten, positionbasierten Ausstieg ersetzt, der durch den Trailing Average bedingt ist.
  • Signalschwellenwerte werden über den Histogramm-Schwellenwertparameter MACD verwaltet, sodass Benutzer das Bewertungssystem des MQL-Experten nachahmen können, indem sie den Wert anpassen.

Haftungsausschluss

Handelsalgorithmen beinhalten finanzielle Risiken. Führen Sie einen gründlichen Back- und Forward-Test der Strategie durch, bevor Sie sie mit echtem Kapital einsetzen.

using System;
using System.Linq;
using System.Collections.Generic;

using Ecng.Common;
using Ecng.Collections;
using Ecng.Serialization;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// SUPERMACBOT strategy converted from the MQL expert by The Guardian Forex TV.
/// </summary>
public class SupermacbotByTheGuardianForexTvStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastMaPeriod;
	private readonly StrategyParam<int> _slowMaPeriod;
	private readonly StrategyParam<int> _macdFastPeriod;
	private readonly StrategyParam<int> _macdSlowPeriod;
	private readonly StrategyParam<int> _macdSignalPeriod;
	private readonly StrategyParam<decimal> _histogramThreshold;
	private readonly StrategyParam<int> _trailingPeriod;

	/// <summary>
	/// Candle type to process.
	/// </summary>
	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	/// <summary>
	/// Fast simple moving average period.
	/// </summary>
	public int FastMaPeriod
	{
		get => _fastMaPeriod.Value;
		set => _fastMaPeriod.Value = value;
	}

	/// <summary>
	/// Slow simple moving average period.
	/// </summary>
	public int SlowMaPeriod
	{
		get => _slowMaPeriod.Value;
		set => _slowMaPeriod.Value = value;
	}

	/// <summary>
	/// Fast EMA period for MACD.
	/// </summary>
	public int MacdFastPeriod
	{
		get => _macdFastPeriod.Value;
		set => _macdFastPeriod.Value = value;
	}

	/// <summary>
	/// Slow EMA period for MACD.
	/// </summary>
	public int MacdSlowPeriod
	{
		get => _macdSlowPeriod.Value;
		set => _macdSlowPeriod.Value = value;
	}

	/// <summary>
	/// Signal EMA period for MACD.
	/// </summary>
	public int MacdSignalPeriod
	{
		get => _macdSignalPeriod.Value;
		set => _macdSignalPeriod.Value = value;
	}

	/// <summary>
	/// Minimal absolute histogram value required for new entries.
	/// </summary>
	public decimal HistogramThreshold
	{
		get => _histogramThreshold.Value;
		set => _histogramThreshold.Value = value;
	}

	/// <summary>
	/// Trailing simple moving average period.
	/// </summary>
	public int TrailingPeriod
	{
		get => _trailingPeriod.Value;
		set => _trailingPeriod.Value = value;
	}

	/// <summary>
	/// Initializes a new instance of <see cref="SupermacbotByTheGuardianForexTvStrategy"/>.
	/// </summary>
	public SupermacbotByTheGuardianForexTvStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Type of candles to process", "General");

		_fastMaPeriod = Param(nameof(FastMaPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("Fast SMA", "Fast SMA period", "Indicators")
			
			.SetOptimize(5, 30, 1);

		_slowMaPeriod = Param(nameof(SlowMaPeriod), 26)
			.SetGreaterThanZero()
			.SetDisplay("Slow SMA", "Slow SMA period", "Indicators")
			
			.SetOptimize(10, 60, 1);

		_macdFastPeriod = Param(nameof(MacdFastPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("MACD Fast", "MACD fast EMA period", "Indicators")
			
			.SetOptimize(5, 20, 1);

		_macdSlowPeriod = Param(nameof(MacdSlowPeriod), 24)
			.SetGreaterThanZero()
			.SetDisplay("MACD Slow", "MACD slow EMA period", "Indicators")
			
			.SetOptimize(18, 40, 1);

		_macdSignalPeriod = Param(nameof(MacdSignalPeriod), 9)
			.SetGreaterThanZero()
			.SetDisplay("MACD Signal", "MACD signal EMA period", "Indicators")
			
			.SetOptimize(3, 15, 1);

		_histogramThreshold = Param(nameof(HistogramThreshold), 0m)
			.SetDisplay("Histogram Threshold", "Required MACD histogram magnitude", "Logic");

		_trailingPeriod = Param(nameof(TrailingPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("Trailing SMA", "Trailing SMA period", "Logic")
			
			.SetOptimize(6, 30, 1);
	}

	/// <inheritdoc />
	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
	{
		return [(Security, CandleType)];
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();

	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var fastMa = new SimpleMovingAverage { Length = FastMaPeriod };
		var slowMa = new SimpleMovingAverage { Length = SlowMaPeriod };
		var trailingMa = new SimpleMovingAverage { Length = TrailingPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fastMa, slowMa, trailingMa, ProcessCandle)
			.Start();

		StartProtection(
			takeProfit: new Unit(2, UnitTypes.Percent),
			stopLoss: new Unit(1, UnitTypes.Percent));

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, fastMa);
			DrawIndicator(area, slowMa);
			DrawOwnTrades(area);
		}
	}

	private void ProcessCandle(ICandleMessage candle, decimal fastMa, decimal slowMa, decimal trailingMa)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (Position != 0)
			return;

		var bullishTrend = fastMa > slowMa;
		var bearishTrend = fastMa < slowMa;
		var price = candle.ClosePrice;

		if (bullishTrend && price > trailingMa)
			BuyMarket();
		else if (bearishTrend && price < trailingMa)
			SellMarket();
	}
}