Auf GitHub ansehen

Strategie TemplateEAbyMarket Strategy

Überblick

TemplateEAbyMarket ist eine direkte StockSharp-Portierung des ursprünglichen MetaTrader 4-Expertenberaters TemplateEAbyMarket.mq4. Die Strategie verwendet den Indikator „Moving Average Convergence Divergence“ (MACD), um Momentumverschiebungen zu erkennen. Wenn die MACD-Hauptlinie die Signallinie kreuzt, während sich beide Komponenten in derselben positiven oder negativen Zone befinden, eröffnet die Strategie eine Marktposition in der Richtung der Kreuzung. Ausstiege werden ausschließlich durch Schutzaufträge (Take Profit und Stop Loss) verwaltet, die über den integrierten StartProtection-Helfer konfiguriert werden.

Die Version StockSharp behält das Verhalten des Programms MQL bei: Sie öffnet nur neue Positionen, ohne zu versuchen, die Gegenseite automatisch zu schließen. Sobald eine Position besetzt ist, muss der Handel durch Schutzniveaus oder manuelle Eingriffe verwaltet werden.

Handelslogik

  1. Abonnieren Sie den vom Benutzer ausgewählten Kerzentyp (Standard: 15-Minuten-Zeitrahmen).
  2. Berechnen Sie MACD (standardmäßig 26.12.9) für jede fertige Kerze.
  3. Verfolgen Sie die relative Position der MACD-Haupt- und Signalleitungen, um ein Crossover-Ereignis zu erkennen:
    • Bulnisches Setup: Bei der vorherigen Kerze lag die Hauptlinie unter der Signallinie, die aktuelle Kerze schließt mit der Hauptlinie über der Signallinie und beide Linien liegen über Null. Eine Marktkauforder mit OrderVolume wird übermittelt, wenn das aktuelle Engagement unter MaxOrders * OrderVolume liegt.
    • Bearisches Setup: Bei der vorherigen Kerze lag die Hauptlinie über der Signallinie, die aktuelle Kerze schließt mit der Hauptlinie unter der Signallinie und beide Linien liegen unter Null. Ein Market-Verkaufsauftrag mit OrderVolume wird vorbehaltlich der gleichen Exposure-Obergrenze übermittelt.
  4. Die Schutzstufen takeProfit und stopLoss werden einmalig beim Start aktiviert. Die Strategie schließt entgegengesetzte Positionen nicht automatisch; Das Risiko wird durch das Schutzmodul oder durch den Benutzer kontrolliert.

Parameter

Name Beschreibung
MacdFastPeriod Schnelle EMA-Länge für die MACD-Berechnung.
MacdSlowPeriod Langsame EMA-Länge für die MACD-Berechnung.
MacdSignalPeriod Signallänge EMA für die MACD-Berechnung.
CandleType Kerzentyp (Zeitrahmen), der den Indikator speist.
OrderVolume Mit jeder Market-Order übermitteltes Volumen.
MaxOrders Maximale Anzahl gleichzeitiger Bestellungen, ausgedrückt als Vielfaches von OrderVolume. Die Strategie prüft abs(Position) < MaxOrders * OrderVolume, bevor eine neue Bestellung gesendet wird.
TakeProfitPoints Take-Profit-Distanz in Preispunkten. Der Wert 0 deaktiviert den Take-Profit.
StopLossPoints Stop-Loss-Distanz in Preispunkten. Der Wert 0 deaktiviert den Stop-Loss.

Notizen

  • Slippage- und Magic Number-Einstellungen aus der MQL-Version werden absichtlich weggelassen, da sie in StockSharp anders gehandhabt werden.
  • Stellen Sie sicher, dass der Connector die richtigen Preisschritt-Metadaten bereitstellt. StartProtection interpretiert Entfernungen in Instrumentenpreispunkten.
  • Die Vorlage ist bewusst minimalistisch gehalten und verwaltet keine Teilfüllungen oder Pyramideneinträge über das Limit von MaxOrders hinaus.
namespace StockSharp.Samples.Strategies;

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

/// <summary>
/// Template EA by Market strategy: MACD histogram crossover with signal line.
/// </summary>
public class TemplateEAbyMarketStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<int> _signalPeriod;

	private decimal _prevMacd;
	private decimal _prevSignal;
	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 TemplateEAbyMarketStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_fastPeriod = Param(nameof(FastPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("Fast Period", "MACD fast EMA", "Indicators");
		_slowPeriod = Param(nameof(SlowPeriod), 26)
			.SetGreaterThanZero()
			.SetDisplay("Slow Period", "MACD slow EMA", "Indicators");
		_signalPeriod = Param(nameof(SignalPeriod), 9)
			.SetGreaterThanZero()
			.SetDisplay("Signal Period", "MACD signal period", "Indicators");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevMacd = 0m;
		_prevSignal = 0m;
		_hasPrev = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_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;

		var v = (MovingAverageConvergenceDivergenceSignalValue)macdValue;
		if (v.Macd is not decimal macdLine || v.Signal is not decimal signal) return;

		if (_hasPrev)
		{
			var prevHist = _prevMacd - _prevSignal;
			var currHist = macdLine - signal;

			if (prevHist <= 0 && currHist > 0 && Position <= 0)
				BuyMarket();
			else if (prevHist >= 0 && currHist < 0 && Position >= 0)
				SellMarket();
		}

		_prevMacd = macdLine;
		_prevSignal = signal;
		_hasPrev = true;
	}
}