Auf GitHub ansehen

Warnung MACD Langsame Strategie

Die Strategie Alert MACD Slow reproduziert den MetaTrader 4 Experten Alert_MACD_Slow.mq4. Es beobachtet die Hauptlinie MACD und zwei exponentielle gleitende Durchschnitte und löst Textwarnungen aus, wenn der Indikatorstapel einen möglichen Ausbruch signalisiert. Es werden keine Bestellungen übermittelt – die Konvertierung bleibt dem ursprünglichen Ratgeber treu, der nur Popup-Meldungen anzeigte.

Kernidee

  1. Abonnieren Sie die ausgewählte Kerzenserie und geben Sie einen MACD(3, 20, 9) zusammen mit schnellen und langsamen EMAs (20 und 65 Perioden) ein.
  2. Zwischenspeichern Sie MACD-Werte für die vorherigen vier abgeschlossenen Kerzen, um die vom MQL-Code verwendeten Steigungsübergänge auszuwerten.
  3. Speichern Sie die Höchst- und Tiefstwerte der letzten beiden Kerzen, um die Breakout-Filter High[1]/High[2] und Low[1]/Low[2] zu emulieren.
  4. Wenn der schnelle EMA über (oder unter) dem langsamen EMA bleibt und der Kerzenschluss die gespeicherten Hochs (oder Tiefs) durchbricht, während MACD unter der Nulllinie nach oben (oder nach unten) dreht, protokollieren Sie die entsprechende Warnmeldung.

Parameter

Name Standard Beschreibung
MacdFastPeriod 3 Schnelle EMA-Länge innerhalb der MACD-Berechnung.
MacdSlowPeriod 20 Langsame EMA-Länge, die von MACD verwendet wird.
MacdSignalPeriod 9 Signalglättungszeitraum des MACD.
QuickEmaPeriod 20 Zeitraum des trendfolgenden schnellen EMA (Ma_Quick).
SlowEmaPeriod 65 Zeitraum des langsamen EMA-Trendfilters (Ma_Slow).
CandleType TimeFrame(30m) Kerzenquelle wird an die Indikatorkette übergeben; Wählen Sie einen Zeitrahmen, der zu Ihrem Diagramm passt.

Details zur Alarmlogik

  • MACD Steigungsspeicher: Die Strategie verschiebt die vorherigen MACD-Werte intern, anstatt GetValue aufzurufen, und erfüllt so die Konvertierungsrichtlinien, während die ursprünglichen Vergleiche (Macd_1 > Macd_2 usw.) erhalten bleiben.
  • Breakout-Check: Schlusskurse über früheren Höchstständen oder unter früheren Tiefstständen werden als Proxy für die Bid/Ask-Checks von MetaTrader behandelt, bei denen der Live-Kurs im Vergleich zu historischen Candle-Extremen verwendet wurde.
  • Trendfilter: Die Warnung wird nur ausgelöst, wenn der schnelle EMA auf der richtigen Seite des langsamen EMA liegt und mit den Long/Short-Filtern im MQL-Experten übereinstimmt.
  • Protokollierung: Benachrichtigungen werden über AddInfoLog gesendet. Sie umfassen die vier zwischengespeicherten MACD-Werte und die Breakout-Ebenen, um das Debuggen und Backtesting zu erleichtern.
  • Kein Handel: Da der Quellberater nie Geschäfte platziert hat, bleibt die Strategie bei der StockSharp-Konvertierung flach und konzentriert sich ausschließlich auf die Signalisierung.

Typische Verwendung

  1. Hängen Sie die Strategie an ein Symbol an, konfigurieren Sie den Kerzentyp für den gewünschten Zeitrahmen und behalten Sie die Standardindikatorperioden bei oder passen Sie sie zum Experimentieren an.
  2. Starten Sie die Strategie und warten Sie, bis sich die Indikatoren MACD und EMA gebildet haben (mehrere Kerzen sind erforderlich, da MACD eine Historie erfordert).
  3. Sehen Sie sich das Journal an: Wenn ein bullisches Setup auftritt, sehen Sie SET UP LONG, während ein bärisches Setup SET UP SHORT_VALUE ergibt. Das Suffix spiegelt den ursprünglichen Warntext wider.
  4. Nutzen Sie die gedruckten Diagnosen, um zu entscheiden, ob Sie manuell handeln oder die Strategie mit benutzerdefinierter Automatisierung verketten möchten.

Klassifizierung

  • Kategorie: Warnungen/Bestätigung von Trendausbrüchen
  • Handelsrichtung: Keine (nur Signal)
  • Ausführungsstil: Ereignisgesteuert für fertige Kerzen
  • Datenanforderungen: Kerzenserie kompatibel mit dem gewählten CandleType
  • Komplexität: Moderat (mehrere Indikatorfilter, aber einfache Statusbehandlung)
  • Risikomanagement: Nicht anwendbar (keine Positionen eröffnet)

Dieser Port behält das Benachrichtigungsverhalten des MQL-Experten bei und nutzt gleichzeitig StockSharp-Abonnements, Indikatorbindungen und Protokollierungsdienstprogramme.

using System;

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

namespace StockSharp.Samples.Strategies;

public class AlertMacdSlowStrategy : Strategy
{
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevFast;
	private decimal _prevSlow;
	private bool _hasPrev;
	private int _cooldown;

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

	public AlertMacdSlowStrategy()
	{
		_fastPeriod = Param(nameof(FastPeriod), 12).SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
		_slowPeriod = Param(nameof(SlowPeriod), 26).SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(15).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevFast = default;
		_prevSlow = default;
		_hasPrev = default;
		_cooldown = default;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_hasPrev = false;
		var fast = new ExponentialMovingAverage { Length = FastPeriod };
		var slow = new ExponentialMovingAverage { Length = SlowPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fast, slow, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!IsFormedAndOnlineAndAllowTrading()) return;

		if (!_hasPrev) { _prevFast = fast; _prevSlow = slow; _hasPrev = true; return; }
		if (_cooldown > 0)
		{
			_cooldown--;
			_prevFast = fast;
			_prevSlow = slow;
			return;
		}

		if (_prevFast <= _prevSlow && fast > slow && Position <= 0)
		{
			var volume = Volume + Math.Abs(Position);
			BuyMarket(volume);
			_cooldown = 2;
		}
		else if (_prevFast >= _prevSlow && fast < slow && Position >= 0)
		{
			var volume = Volume + Math.Abs(Position);
			SellMarket(volume);
			_cooldown = 2;
		}

		_prevFast = fast; _prevSlow = slow;
	}
}