Auf GitHub ansehen

XPeriod Candle System TM Plus Strategie

Übersicht

Diese Strategie ist ein StockSharp-Port des MetaTrader-Expertenberaters Exp_XPeriodCandleSystem_Tm_Plus. Der ursprüngliche Roboter basiert auf dem benutzerdefinierten Indikator XPeriod Candle System, der Kerzendaten glättet und Balken entsprechend Bollinger-Band-Ausbrüchen einfärbt. Die übersetzte Version reproduziert dieses Verhalten durch Anwendung exponentieller Glättung auf die OHLC-Reihe, Mapping derselben angewandten Preismodi und Steuerung von Trades aus den resultierenden Farbzuständen. Ein zeitbasierter Ausstieg und konfigurierbare Schutzorders ergänzen die Ausbruchslogik.

Handelslogik

  1. Geglättete Kerzen – Exponentielle gleitende Durchschnitte mit konfigurierbarer Länge erstellen synthetische Eröffnungs-, Hoch-, Tief- und Schlusskurswerte, die den Quellindikator annähern.
  2. Angewandter Preis – Der Benutzer kann eine der zwölf Preisformeln (Schluss, Eröffnung, Median, Trendfolge-Variationen, Demark usw.) auswählen, bevor Daten in die Bollinger Bänder gespeist werden.
  3. Bandanalyse – Ein Bollinger-Bänder-Indikator (Länge und Abweichung konfigurierbar) verarbeitet die geglättete Preisreihe. Abgeschlossene Bänder sind erforderlich, bevor Signale ausgewertet werden.
  4. Farbzustände
    • Bullischer Balken oberhalb des oberen Bandes → Farbe 0 (Ausbruch nach oben).
    • Bärischer Balken unterhalb des unteren Bandes → Farbe 4 (Ausbruch nach unten).
    • Andere bullische Balken → Farbe 1; andere bärische Balken → Farbe 3.
    • Ein konfigurierbarer Ausbruchs-Offset (bei Möglichkeit in Preiseinheiten unter Verwendung der Tick-Größe des Symbols umgerechnet) vermeidet Fehlauslöser.
  5. Einstiege – Die Strategie betrachtet die durch SignalBar definierte Kerze und ihren Vorgänger:
    • Long eröffnen, wenn der vorherige Balken ein bullischer Ausbruch (0) war und der Signalbalken es nicht ist.
    • Short eröffnen, wenn der vorherige Balken ein bärischer Ausbruch (4) war und der Signalbalken es nicht ist.
  6. Ausstiege
    • Longs schließen, wenn der Referenzbalken bärisch ist (> 2).
    • Shorts schließen, wenn der Referenzbalken bullisch ist (< 2).
    • Ein optionaler Haltetimer (TimeTrade und HoldingMinutes) schließt Positionen nach den angegebenen Minuten.
  7. RisikoStartProtection setzt optionale absolute Take-Profit- und Stop-Loss-Abstände für jeden Trade ein.

Parameter

Parameter Beschreibung Standardwert
OrderVolume Basisauftragsgröße für Markteinstiege. 0.1
BuyPosOpen / SellPosOpen Long- oder Short-Einstiege aktivieren/deaktivieren. true
BuyPosClose / SellPosClose Long- oder Short-Positionsausstiege erlauben. true
TimeTrade Aktiviert den zeitbasierten Ausstiegsfilter. true
HoldingMinutes Maximale Haltezeit, bevor der Zeitfilter eine Position schließt. 960
CandleType Kerzendatentyp (Zeitrahmen), der vom Markt angefordert wird. 4 Stunden
Period Länge der exponentiellen gleitenden Durchschnitte zur Glättung. 5
BollingerLength Anzahl geglätteter Balken im Bollinger-Berechnungsfenster. 20
BandsDeviation Bandbreiten-Multiplikator. 1.001
AppliedPriceMode Preistransformation vor dem Bollinger-Indikator (Schluss, Eröffnung, Median, Trendfolge, Demark usw.). Close
SignalBar Index des Balkens für die Signalauswertung (1 = letzter geschlossener Balken). 1
StopLoss / TakeProfit Absolute Abstände (in Preiseinheiten) für die Schutz-Engine. 1000 / 2000
Deviation Zusätzlicher Ausbruchs-Offset, der über/unter die Bollinger Bänder addiert wird. 10

Verwendungshinweise

  • Der Glättungsschritt verwendet exponentielle gleitende Durchschnitte zur Replikation der proprietären XPeriod-Berechnung. Kleinere Perioden halten die synthetischen Kerzen näher an den Marktpreisen, während größere Perioden die Trendstruktur betonen.
  • SignalBar muss innerhalb des gespeicherten Verlaufs bleiben (bis zu 14 Positionen nach dem aktuellen Balken). Werte größer als der verfügbare Verlauf überspringen das Trading automatisch.
  • Der Ausbruchs-Offset wird mit PriceStep multipliziert, wenn das Wertpapier eine Tick-Größe offenlegt. Dies hält das Verhalten ähnlich zur MetaTrader-Version, wo Deviation in Punkten definiert ist.
  • StopLoss und TakeProfit werden in absoluten Preiseinheiten angegeben. Auf null setzen, um Schutzorders zu deaktivieren, während die Verwaltungsinfrastruktur aktiv bleibt.
  • Noch keine Python-Übersetzung vorhanden; dieser Ordner enthält nur die C#-Implementierung.
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>
/// XPeriod candle system with Bollinger Bands breakout.
/// Buys on close above upper band with bullish candle, sells on close below lower band with bearish candle.
/// </summary>
public class XPeriodCandleSystemTmPlusStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _bbPeriod;
	private readonly StrategyParam<decimal> _bbWidth;

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

	public int BbPeriod
	{
		get => _bbPeriod.Value;
		set => _bbPeriod.Value = value;
	}

	public decimal BbWidth
	{
		get => _bbWidth.Value;
		set => _bbWidth.Value = value;
	}

	public XPeriodCandleSystemTmPlusStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe", "General");

		_bbPeriod = Param(nameof(BbPeriod), 20)
			.SetGreaterThanZero()
			.SetDisplay("BB Period", "Bollinger Bands period", "Indicators");

		_bbWidth = Param(nameof(BbWidth), 2m)
			.SetGreaterThanZero()
			.SetDisplay("BB Width", "Bollinger Bands width", "Indicators");
	}

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

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var bb = new BollingerBands { Length = BbPeriod, Width = BbWidth };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.BindEx(bb, ProcessCandle)
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, bb);
			DrawOwnTrades(area);
		}
	}

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

		var bb = (BollingerBandsValue)value;
		if (bb.UpBand is not decimal upper ||
			bb.LowBand is not decimal lower ||
			bb.MovingAverage is not decimal middle)
			return;

		var close = candle.ClosePrice;
		var isBullish = candle.ClosePrice > candle.OpenPrice;
		var isBearish = candle.ClosePrice < candle.OpenPrice;

		// Buy: close above upper band with bullish candle
		if (close > upper && isBullish && Position <= 0)
		{
			if (Position < 0)
				BuyMarket();
			BuyMarket();
		}
		// Sell: close below lower band with bearish candle
		else if (close < lower && isBearish && Position >= 0)
		{
			if (Position > 0)
				SellMarket();
			SellMarket();
		}
		// Exit long at middle band
		else if (Position > 0 && close < middle)
		{
			SellMarket();
		}
		// Exit short at middle band
		else if (Position < 0 && close > middle)
		{
			BuyMarket();
		}
	}
}