La RSI Estrategia de Nube Dual es una StockSharp adaptación del asesor experto MetaTrader "RSI Nube Dual EA".
Se negocia con una serie de velas configurables y analiza dos cálculos del índice de fuerza relativa (RSI): un análisis rápido.
y una línea lenta. Las señales se generan cuando el RSI rápido entra, permanece dentro o sale de una sobreventa/sobrecompra definida.
zona, o cuando la línea rápida cruza la línea lenta. La estrategia puede opcionalmente invertir sus señales y puede restringirse
a operación sólo larga o sólo corta.
La estrategia opera únicamente con órdenes de mercado. Cuando se recibe una nueva señal, la posición existente en el lado opuesto
La dirección se cierra antes de abrir una nueva posición. El tamaño de la posición se controla a través de un único parámetro de volumen.
Lógica de señal
Señal de entrada – se activa cuando el rápido RSI cruza hacia la zona:
Largo: RSI anterior por encima del nivel inferior y RSI actual por debajo de él.
Breve: RSI anterior debajo del nivel superior y RSI actual encima de él.
Siendo señal – se activa mientras el RSI rápido permanezca dentro de la zona:
Largo: rápido RSI por debajo del nivel inferior.
Corto: rápido RSI por encima del nivel superior.
Señal de salida: se activa cuando el RSI rápido sale de la zona:
Largo: RSI anterior por debajo del nivel inferior y RSI actual por encima de él.
Breve: RSI anterior por encima del nivel superior y RSI actual por debajo de él.
Señal de cruce – utiliza el comportamiento de nube dual:
Largo: RSI rápido cruzando por encima del RSI lento.
Breve: RSI rápido cruzando por debajo del RSI lento.
Se puede habilitar cualquier combinación de las cuatro condiciones. Al menos una condición debe estar activa para que se produzcan entradas.
Cuando la opción Inversa está habilitada, las señales largas y cortas se intercambian.
Parámetros
Nombre
Descripción
Tipo de vela
La serie de velas utilizada para los cálculos (predeterminado: 1 hora).
Rápido RSI / Lento RSI
Períodos para los cálculos rápidos y lentos RSI.
Nivel superior / Nivel inferior
RSI umbrales para las zonas de sobrecompra y sobreventa.
Volumen de pedido
Volumen de órdenes de mercado.
Usar Entrada / Estar / Salir / Cruzar
Alterna para cada familia de señales.
Velas Cerradas
Si está habilitado, las señales solo se evalúan en velas terminadas.
Reversa
Intercambia señales largas y cortas.
Modo comercial
Limita el comercio a largo, corto o en ambas direcciones.
Notas de uso
La estrategia se suscribe a una única serie de velas y ejecuta dos indicadores RSI vinculados a través del nivel alto API.
Sólo se utilizan órdenes de mercado; cualquier exposición abierta en la dirección opuesta se cierra antes de realizar una nueva operación.
La configuración predeterminada coincide con el asesor experto original (rápido RSI 5, lento RSI 15, niveles 25/75).
Combine los interruptores de señal para reproducir las combinaciones de indicadores de la versión MetaTrader.
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();
}
}