Auf GitHub ansehen

BreakOut15-Strategie

Überblick

BreakOut15 ist eine 15-minütige Breakout-Strategie, die vom MetaTrader 4-Expertenberater „BreakOut15.mq4“ übernommen wurde. Die Strategie kombiniert einen Crossover-Filter mit gleitendem Durchschnitt mit Breakout-Ausführung und mehrstufigem Trailing-Schutz. Bestellungen werden über die übergeordnete StockSharp API gesendet und basieren nur auf fertigen Kerzen.

Kernlogik

  1. Berechnen Sie zwei konfigurierbare gleitende Durchschnitte (schnell und langsam) mit der ausgewählten Methode, dem Zeitraum, der Verschiebung und dem angewendeten Preis.
  2. Wenn der schnelle Durchschnitt den langsamen Durchschnitt überschreitet, planen Sie einen langen Ausbruchspreis bei Close + BreakoutLevel * PriceStep. Ein rückläufiger Crossover plant einen kurzen Ausbruch bei Close - BreakoutLevel * PriceStep.
  3. Ausstehende Breakout-Preise werden gelöscht, wenn die Crossover-Bedingung verschwindet, die Handelszeiten enden oder ein Breakout in die entgegengesetzte Richtung aktiv wird.
  4. Markteintritte werden ausgeführt, sobald die Kerze das ausstehende Niveau durchbricht und die Aktien- und Risikoprüfungen erfolgreich sind.
  5. Offene Positionen werden durch Stop-Loss, Take-Profit und einen von drei Trailing-Stop-Modi verwaltet. Crossbacks mit gleitendem Durchschnitt erzwingen einen sofortigen Ausstieg.
  6. Optionale Zeitfilter verhindern neue Trades außerhalb des konfigurierten Fensters und können Positionen freitags spät auflösen.

Money-Management

  • UseMoneyManagement / TradeSizePercent – ermöglicht risikobasierte Größenbestimmung. Die Positionsgröße entspricht dem ganzzahligen Teil von floor(equity * percent / 10000) / 10, mit einem Minimum von 1 Lot.
  • FixedVolume – Fallback-Größe, wenn die Geldverwaltung deaktiviert ist oder kein Eigenkapital verfügbar ist.
  • MaxVolume – begrenzt jedes berechnete Volumen.
  • MinimumEquity – blockiert neue Trades, wenn das Eigenkapital unter den Schwellenwert fällt.

Risikomanagement

  • StopLossPips / TakeProfitPips – klassische Schutz-Offsets, gemessen in Pips (umgerechnet über die Preisstufe des Instruments).
  • UseTrailingStop – aktiviert die dynamische Stop-Verarbeitung, sobald eine Position vorhanden ist.
  • TrailingStopType
    • Immediate: Sofort um die ursprüngliche Stop-Loss-Distanz nachlaufen.
    • Delayed: Warten Sie auf einen Gewinn von TrailingStopPips, bevor Sie auf diese Distanz zurückfallen.
    • MultiLevel: Gewinne bei drei programmierbaren Meilensteinen (Level1/2/3TriggerPips) sichern und dann um Level3TrailingPips nachlaufen.

Handelsplan

  • UseTimeLimit, StartHour, StopHour – Handel nur innerhalb des angegebenen Stundenintervalls zulassen.
  • UseFridayClose, FridayCloseHour – optional alle Positionen spät am Freitag reduzieren.

Indikatoren und Daten

  • Schnelle/langsame gleitende Durchschnitte – Wählen Sie zwischen der einfachen, exponentiellen, geglätteten, linear gewichteten oder der Methode der kleinsten Quadrate.
  • Angewandte Preismodi – reproduzieren MT4-Preisquellen (Schluss, Eröffnung, Hoch, Tief, Median, typisch, gewichtet).
  • CandleType – standardmäßig sind Kerzen mit einem Zeitrahmen von 15 Minuten eingestellt, können aber bei Bedarf geändert werden.

Zusätzliche Hinweise

  • Die Strategie synchronisiert automatisch Einstiegs-, Stopp- und Zielpreise mit dem aktuellen durchschnittlichen Positionspreis, sodass nachlaufende Anpassungen die tatsächlichen Ausführungen widerspiegeln.
  • Alle Berechnungen hängen vom Instrument PriceStep ab; Stellen Sie sicher, dass es mit dem gehandelten Markt übereinstimmt.
  • Tests sollten die Auslösung von Ausbrüchen, Trailing-Stop-Übergänge und Rundungsregeln für das Geldmanagement in bullischen und bärischen Szenarien validieren.
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>
/// BreakOut15 strategy - EMA crossover with breakout confirmation.
/// Buys when fast EMA crosses above slow EMA and price breaks above the fast EMA.
/// Sells on bearish crossover with price below fast EMA.
/// </summary>
public class BreakOut15Strategy : 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;

	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 BreakOut15Strategy()
	{
		_fastPeriod = Param(nameof(FastPeriod), 10)
			.SetDisplay("Fast EMA", "Fast EMA period", "Indicators");

		_slowPeriod = Param(nameof(SlowPeriod), 20)
			.SetDisplay("Slow EMA", "Slow EMA period", "Indicators");

		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
	protected override void OnReseted() { base.OnReseted(); _prevFast = 0m; _prevSlow = 0m; _hasPrev = false; }

	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 (!_hasPrev)
		{
			_prevFast = fast;
			_prevSlow = slow;
			_hasPrev = true;
			return;
		}

		var crossUp = _prevFast <= _prevSlow && fast > slow;
		var crossDown = _prevFast >= _prevSlow && fast < slow;

		if (crossUp && Position <= 0)
		{
			if (Position < 0)
				BuyMarket();
			BuyMarket();
		}
		else if (crossDown && Position >= 0)
		{
			if (Position > 0)
				SellMarket();
			SellMarket();
		}

		_prevFast = fast;
		_prevSlow = slow;
	}
}