Auf GitHub ansehen

Tageseröffnung MACD Histogrammstrategie

Überblick

Diese Strategie repliziert den MetaTrader-Experten „2 1000 1 0,7 % 0,5 500lev st“, indem sie zu Beginn jedes neuen Handelstages einen Trade eingibt und die Richtung mit der MACD-Histogrammsteigung filtert. Das System wurde für stündliche Kerzen entwickelt und basiert auf festen Geldverwaltungsparametern, die aus den ursprünglichen MQL-Einstellungen konvertiert wurden.

Handelslogik

  • Die Strategie überwacht stündliche Kerzen und erkennt die erste Kerze jedes neuen Tages.
  • Es wertet das MACD-Histogramm der beiden zuletzt abgeschlossenen Kerzen des Vortages aus.
  • Wenn das Histogramm zwischen diesen beiden Balken sinkt, eröffnet das System eine Long-Position bei der ersten Kerze des neuen Tages.
  • Wenn das Histogramm zunimmt, wird stattdessen eine Short-Position eröffnet.
  • Es kann jeweils nur eine Position aktiv sein. Gegensätzliche Signale schließen den aktuellen Handel ab, bevor sie die neue Richtung eröffnen.

Risikomanagement

  • Anfängliche Stop-Loss-Distanz: 875 Punkte (umgerechnet in den Preis durch Multiplikation mit der Preisstufe des Instruments).
  • Take-Profit-Distanz: 510 Punkte.
  • Trailing-Stop-Distanz: 2172 Punkte. Der Stop folgt dem höchsten (Long) oder niedrigsten (Short) Preis, der seit dem Einstieg erreicht wurde, und überschreibt den anfänglichen Stop, wenn dieser enger wird.
  • Die ursprüngliche Break-Even-Option wurde deaktiviert und daher hier weggelassen.

Parameter

Name Beschreibung Standard
CandleType Von der Strategie verwendete Kerzenserie (standardmäßig stündlich). 1 Stunde Kerzen
MacdFastPeriod Schneller Zeitraum von EMA für den MACD. 58
MacdSlowPeriod Langsamer Zeitraum von EMA für den MACD. 195
MacdSignalPeriod Signalleitungsperiode für MACD. 183
StopLossPoints Stop-Loss-Distanz, ausgedrückt in Instrumentenpunkten. 875
TakeProfitPoints Take-Profit-Distanz in Punkten. 510
TrailingStopPoints Trailing-Stop-Distanz in Punkten. 2172

Notizen

  • Die Strategie verwendet nur abgeschlossene Kerzen, um einen Look-Ahead innerhalb des Balkens zu vermeiden, und spiegelt die Option „Vorherigen Balkenwert verwenden“ des Quellexperten wider.
  • Trailing- und Fixed-Exits werden intern gehandhabt, daher sollten zusätzliche Portfolioschutzmaßnahmen deaktiviert bleiben, um eine doppelte Handhabung von Stops zu verhindern.
  • Die Logik geht davon aus, dass der Broker Standardpunktdefinitionen (Preisschritt) verwendet. Passen Sie die Parameter an, wenn das Instrument eine andere Tick-Größe verwendet.
namespace StockSharp.Samples.Strategies;

using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;

/// <summary>
/// Day Opening MACD Histogram strategy: MACD histogram direction.
/// Buys when MACD histogram turns positive, sells when turns negative.
/// </summary>
public class DayOpeningMacdHistogramStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<int> _signalPeriod;
	private readonly StrategyParam<int> _signalCooldownCandles;

	private decimal _prevHistogram;
	private int _candlesSinceTrade;
	private bool _hasPrev;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
	public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
	public int SignalPeriod { get => _signalPeriod.Value; set => _signalPeriod.Value = value; }
	public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }

	public DayOpeningMacdHistogramStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_fastPeriod = Param(nameof(FastPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("MACD Fast", "MACD fast EMA period", "Indicators");
		_slowPeriod = Param(nameof(SlowPeriod), 26)
			.SetGreaterThanZero()
			.SetDisplay("MACD Slow", "MACD slow EMA period", "Indicators");
		_signalPeriod = Param(nameof(SignalPeriod), 9)
			.SetGreaterThanZero()
			.SetDisplay("Signal Period", "MACD signal period", "Indicators");
		_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 4)
			.SetGreaterThanZero()
			.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevHistogram = 0;
		_candlesSinceTrade = SignalCooldownCandles;
		_hasPrev = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevHistogram = 0;
		_candlesSinceTrade = SignalCooldownCandles;
		_hasPrev = false;
		var macd = new MovingAverageConvergenceDivergenceSignal
		{
			Macd = { ShortMa = { Length = FastPeriod }, LongMa = { Length = SlowPeriod } },
			SignalMa = { Length = SignalPeriod }
		};
		var subscription = SubscribeCandles(CandleType);
		subscription.BindEx(macd, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, IIndicatorValue macdValue)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!macdValue.IsFinal) return;

		if (_candlesSinceTrade < SignalCooldownCandles)
			_candlesSinceTrade++;

		if (macdValue is not MovingAverageConvergenceDivergenceSignalValue typed) return;
		if (typed.Macd is not decimal macdMain || typed.Signal is not decimal signal) return;

		var histogram = macdMain - signal;

		if (_hasPrev)
		{
			if (_prevHistogram <= 0 && histogram > 0 && Position <= 0 && _candlesSinceTrade >= SignalCooldownCandles)
			{
				BuyMarket();
				_candlesSinceTrade = 0;
			}
			else if (_prevHistogram >= 0 && histogram < 0 && Position >= 0 && _candlesSinceTrade >= SignalCooldownCandles)
			{
				SellMarket();
				_candlesSinceTrade = 0;
			}
		}

		_prevHistogram = histogram;
		_hasPrev = true;
	}
}