Auf GitHub ansehen

Plan-X-Breakout-Strategie

Die Plan-X-Breakout-Strategie repliziert den MetaTrader-Expertenberater „Plan Es konzentriert sich auf die Londoner Vormittagssitzung und wartet vor dem Einstieg darauf, dass der Preis von einer Referenzkerze abweicht. Es kann jeweils nur eine Nettoposition offen sein, und das Risiko wird durch Pip-basierte Stopps kontrolliert, die hinter dem Trade zurückbleiben, wenn er sich zu seinen Gunsten entwickelt.

Handelslogik

  1. Sitzungsanker

    • Die Strategie berücksichtigt 15-Minuten-Kerzen.
    • Zur konfigurierten Startzeit der Sitzung (Standard 11:00) wird das Schließen dieser Kerze aufgezeichnet. Dieser Schlusskurs dient als Ankerpreis für den Rest der Sitzung.
    • Der Handel wird erst in Betracht gezogen, nachdem mindestens eine weitere Kerze geschlossen wurde und vor der Sitzungsendestunde (Standard 15:00 Uhr).
  2. Eintrittsbedingungen

    • Long: Wenn die zuletzt abgeschlossene Kerze mehr als LongTargetPips (Standard 25 Pips) über dem Ankerschluss schließt und keine Position offen ist.
    • Short: Wenn die zuletzt abgeschlossene Kerze mehr als ShortTargetPips (Standard 20 Pips) unter dem Ankerschluss schließt und keine Position offen ist.
    • Alle Vergleiche werden in Pip-Einheiten durchgeführt, die von der Tick-Größe des Instruments abgeleitet werden.
  3. Positionsmanagement

    • Ein fester anfänglicher Stop-Loss in Höhe von InitialStopPips (Standard 25 Pips) wird relativ zum Einstiegspreis festgelegt.
    • Der Stop wird in einen Trailing Stop umgewandelt, sobald der Trade mindestens TrailTriggerPips (Standard 10 Pips) gewinnt.
    • Jedes Mal, wenn der Preis um weitere TrailTriggerPips steigt, wird der Stop um TrailStepPips (Standard 5 Pips) weiter in die profitable Richtung verschoben.
    • Wenn der Preis den Stop erreicht, wird die Position zum Marktwert geschlossen.
  4. Volumen

    • Bestellungen verwenden den Parameter TradeVolume (Standard 0,1 Lots). Passen Sie es an die Größe des Sicherheitsvertrags an.

Parameter

Name Beschreibung Standard
TradeVolume Marktauftragsvolumen, das für Ein- und Ausstiege verwendet wird. 0,1
LongTargetPips Für lange Einstiege ist eine Ausbruchsdistanz über dem Anker erforderlich. 25
ShortTargetPips Für kurze Einstiege ist eine Ausbruchsdistanz unterhalb des Ankers erforderlich. 20
InitialStopPips Abstand vom Einstiegspreis bis zum schützenden Stop-Loss. 25
TrailTriggerPips Gewinn in Pips, der benötigt wird, bevor der Trailing Stop aktiviert wird oder vorrückt. 10
TrailStepPips Pip-Inkrement, das bei jeder Bewegung auf den Trailing Stop angewendet wird. 5
SessionStartHour Dezimale Stunde, die angibt, wann die Ankerkerze beginnt (z. B. 11.0, 11.5). 11.0
SessionEndHour Dezimale Stunde, nach der keine neuen Einträge mehr vorgenommen werden. Muss später als SessionStartHour sein. 15.0
CandleType Für Auswertungen verwendete Kerzenserien. Standardmäßig sind 15-Minuten-Kerzen eingestellt. 15 Minuten

Notizen

  • Die Pip-Größe passt sich automatisch an, basierend auf dem PriceStep des Instruments und der Dezimalgenauigkeit (3 oder 5 Dezimalstellen erhalten einen 10-fachen Multiplikator).
  • Die Strategie geht von einem kontinuierlichen Intraday-Markt aus; Bei Instrumenten mit täglichen Lücken kommt es an jedem Handelstag zu einem Re-Anker-Verhalten.
  • Da StockSharp-Strategien Nettopositionen verwenden, geht die Konvertierung jeweils nur von einer offenen Richtung aus. Dies spiegelt das Standardverhalten des ursprünglichen Experten wider, wenn keine Absicherung aktiv ist.

Dateien

  • CS/PlanXBreakoutStrategy.cs – C#-Implementierung der Plan X-Breakout-Logik für StockSharp.
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>
/// Plan X Breakout strategy using highest high / lowest low channel breakout.
/// Buy when price breaks above the highest high of the lookback period.
/// Sell when price breaks below the lowest low of the lookback period.
/// </summary>
public class PlanXBreakoutStrategy : Strategy
{
	private readonly StrategyParam<int> _lookback;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevHigh;
	private decimal _prevLow;
	private bool _hasPrev;

	public int Lookback { get => _lookback.Value; set => _lookback.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public PlanXBreakoutStrategy()
	{
		_lookback = Param(nameof(Lookback), 20)
			.SetDisplay("Lookback", "Channel lookback period", "Indicators");

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

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

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

		_prevHigh = 0m;
		_prevLow = 0m;
		_hasPrev = false;
	}

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

		_hasPrev = false;

		var highestHigh = new Highest { Length = Lookback };
		var lowestLow = new Lowest { Length = Lookback };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(highestHigh, lowestLow, ProcessCandle)
			.Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal highest, decimal lowest)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (!_hasPrev)
		{
			_prevHigh = highest;
			_prevLow = lowest;
			_hasPrev = true;
			return;
		}

		// Breakout above previous highest high
		if (Position <= 0 && candle.ClosePrice > _prevHigh)
		{
			if (Position < 0)
				BuyMarket();
			BuyMarket();
		}
		// Breakout below previous lowest low
		else if (Position >= 0 && candle.ClosePrice < _prevLow)
		{
			if (Position > 0)
				SellMarket();
			SellMarket();
		}

		_prevHigh = highest;
		_prevLow = lowest;
	}
}