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
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.
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.
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.
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();
}
}