Auf GitHub ansehen

RSI Dual-Cloud-Strategie

Überblick

Die RSI Dual-Cloud-Strategie ist eine StockSharp-Portierung des MetaTrader-Expertenberaters „RSI Dual Cloud EA“. Es handelt mit einer konfigurierbaren Kerzenserie und analysiert zwei Berechnungen des Relative Strength Index (RSI) – und zwar schnell und eine langsame Linie. Signale werden generiert, wenn der schnelle RSI einen definierten überverkauften/überkauften Wert erreicht, darin bleibt oder ihn verlässt Zone oder wenn die schnelle Linie die langsame Linie kreuzt. Die Strategie kann optional ihre Signale invertieren und kann eingeschränkt werden auf Nur-Lang- oder Nur-Kurz-Betrieb.

Die Strategie funktioniert nur mit Marktaufträgen. Bei Empfang eines neuen Signals wird die bestehende Position umgekehrt Die Richtung wird geschlossen, bevor eine neue Position eröffnet wird. Die Positionsgröße wird über einen einzelnen Volumenparameter gesteuert.

Signallogik

  1. Eingangssignal – wird ausgelöst, wenn der schnelle RSI in die Zone eindringt:
    • Lang: vorheriges RSI über der unteren Ebene und aktuelles RSI darunter.
    • Kurz: vorheriges RSI unterhalb der oberen Ebene und aktuelles RSI darüber.
  2. Signal sein – wird ausgelöst, solange das schnelle RSI innerhalb der Zone bleibt:
    • Lang: schnell RSI unter dem unteren Niveau.
    • Kurz: schnell RSI über dem oberen Niveau.
  3. Abfahrsignal – wird ausgelöst, wenn der schnelle RSI die Zone verlässt:
    • Lang: vorheriges RSI unterhalb der unteren Ebene und aktuelles RSI darüber.
    • Kurz: vorheriges RSI über der oberen Ebene und aktuelles RSI darunter.
  4. Kreuzungssignal – nutzt das Dual-Cloud-Verhalten:
    • Lang: schnelles RSI, das über das langsame RSI kreuzt.
    • Kurz: Schnelles RSI, das unter dem langsamen RSI kreuzt.

Jede Kombination der vier Bedingungen kann aktiviert werden. Damit Einträge erfolgen, muss mindestens eine Bedingung aktiv sein. Wenn die Option Reverse aktiviert ist, werden Long- und Short-Signale vertauscht.

Parameter

Name Beschreibung
Kerzentyp Die für die Berechnungen verwendete Kerzenreihe (Standard: 1 Stunde).
Schnell RSI / Langsam RSI Zeiträume für die schnellen und langsamen RSI-Berechnungen.
Obere Ebene / Untere Ebene RSI Schwellenwerte für die überkauften und überverkauften Zonen.
Bestellvolumen Volumen für Marktaufträge.
Eingang / Sein / Verlassen / Überqueren nutzen Schaltet für jede Signalfamilie um.
Geschlossene Kerzen Wenn aktiviert, werden Signale nur bei fertigen Kerzen ausgewertet.
Umgekehrt Tauscht Long- und Short-Signale aus.
Handelsmodus Beschränkt den Handel auf Long-, Short- oder beide Richtungen.

Nutzungshinweise

  • Die Strategie abonniert eine einzelne Kerzenserie und führt zwei RSI-Indikatoren aus, die durch das übergeordnete API gebunden sind.
  • Es werden nur Marktaufträge verwendet; Jedes offene Exposure in die entgegengesetzte Richtung wird geschlossen, bevor ein neuer Trade platziert wird.
  • Die Standardkonfiguration entspricht dem ursprünglichen Expert Advisor (schnell RSI 5, langsam RSI 15, Stufen 25/75).
  • Kombinieren Sie die Signalschalter, um die Anzeigekombinationen der MetaTrader-Version zu reproduzieren.
using System;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Uses fast and slow RSI crossovers to detect entry signals.
/// Simplified from the "RSI Dual Cloud EA" MetaTrader strategy.
/// </summary>
public class RsiDualCloudStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastLength;
	private readonly StrategyParam<int> _slowLength;

	private RelativeStrengthIndex _fastRsi;
	private RelativeStrengthIndex _slowRsi;
	private decimal? _prevFast;
	private decimal? _prevSlow;

	/// <summary>
	/// Candle type used for calculations.
	/// </summary>
	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	/// <summary>
	/// Fast RSI period.
	/// </summary>
	public int FastLength
	{
		get => _fastLength.Value;
		set => _fastLength.Value = value;
	}

	/// <summary>
	/// Slow RSI period.
	/// </summary>
	public int SlowLength
	{
		get => _slowLength.Value;
		set => _slowLength.Value = value;
	}

	public RsiDualCloudStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe for RSI calculations", "General");

		_fastLength = Param(nameof(FastLength), 14)
			.SetGreaterThanZero()
			.SetDisplay("Fast RSI", "Fast RSI period", "Indicators");

		_slowLength = Param(nameof(SlowLength), 42)
			.SetGreaterThanZero()
			.SetDisplay("Slow RSI", "Slow RSI period", "Indicators");
	}

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

		_prevFast = null;
		_prevSlow = null;

		_fastRsi = new RelativeStrengthIndex { Length = FastLength };
		_slowRsi = new RelativeStrengthIndex { Length = SlowLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(_fastRsi, _slowRsi, ProcessCandle)
			.Start();

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

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

		if (!_fastRsi.IsFormed || !_slowRsi.IsFormed)
		{
			_prevFast = fastValue;
			_prevSlow = slowValue;
			return;
		}

		if (_prevFast is null || _prevSlow is null)
		{
			_prevFast = fastValue;
			_prevSlow = slowValue;
			return;
		}

		var crossUp = _prevFast < _prevSlow && fastValue > slowValue;
		var crossDown = _prevFast > _prevSlow && fastValue < slowValue;

		var volume = Volume;
		if (volume <= 0)
			volume = 1;

		var minSpread = 5m;

		if (crossUp && Math.Abs(fastValue - slowValue) >= minSpread)
		{
			if (Position <= 0)
				BuyMarket(Position < 0 ? Math.Abs(Position) + volume : volume);
		}
		else if (crossDown && Math.Abs(fastValue - slowValue) >= minSpread)
		{
			if (Position >= 0)
				SellMarket(Position > 0 ? Math.Abs(Position) + volume : volume);
		}

		_prevFast = fastValue;
		_prevSlow = slowValue;
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		_fastRsi = null;
		_slowRsi = null;
		_prevFast = null;
		_prevSlow = null;

		base.OnReseted();
	}
}