Ver en GitHub

Estrategia RSI a Largo Plazo 15min

Esta estrategia utiliza señales de sobreventa del RSI combinadas con medias móviles a largo plazo y confirmación de volumen para entrar en posiciones largas. Compra cuando el RSI está por debajo de 30, la SMA de 250 períodos está por encima de la SMA de 500 períodos y el volumen es significativamente superior al promedio.

Detalles

  • Criterios de entrada: RSI por debajo de 30, SMA(250) por encima de SMA(500) y volumen mayor a 2,5 veces su SMA de 20 períodos
  • Largo/Corto: Solo largos
  • Criterios de salida: SMA(250) cruzando por debajo de SMA(500) o stop-loss
  • Stops: Sí, porcentaje fijo
  • Valores predeterminados:
    • RsiLength = 10
    • VolumeSmaLength = 20
    • Sma1Length = 250
    • Sma2Length = 500
    • VolumeMultiplier = 2.5
    • StopLossPercent = 5
  • Filtros:
    • Categoría: Tendencia
    • Dirección: Largo
    • Indicadores: RSI, SMA
    • Stops: Sí
    • Complejidad: Básico
    • Marco temporal: Intradía
    • Estacionalidad: No
    • Redes neuronales: No
    • Divergencia: No
    • Nivel de riesgo: Medio
using System;
using System.Collections.Generic;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// RSI long term 15min strategy using EMA crossover.
/// </summary>
public class RsiLongTerm15minStrategy : Strategy
{
	private readonly StrategyParam<int> _slowLength;
	private readonly StrategyParam<DataType> _candleType;

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

	public RsiLongTerm15minStrategy()
	{
		_slowLength = Param(nameof(SlowLength), 40)
			.SetGreaterThanZero()
			.SetDisplay("Slow Length", "Slow EMA period", "General");

		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candle type", "General");
	}

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

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		var fast = new ExponentialMovingAverage { Length = 14 };
		var slow = new ExponentialMovingAverage { Length = SlowLength };
		var prevF = 0m; var prevS = 0m; var init = false;
		var lastSignal = DateTimeOffset.MinValue;
		var cooldown = TimeSpan.FromMinutes(360);
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fast, slow, (candle, f, s) =>
		{
			if (candle.State != CandleStates.Finished) return;
			if (!fast.IsFormed || !slow.IsFormed) return;
			if (!init) { prevF = f; prevS = s; init = true; return; }
			if (candle.OpenTime - lastSignal >= cooldown)
			{
				if (prevF <= prevS && f > s && Position <= 0) { BuyMarket(); lastSignal = candle.OpenTime; }
				else if (prevF >= prevS && f < s && Position >= 0) { SellMarket(); lastSignal = candle.OpenTime; }
			}
			prevF = f; prevS = s;
		}).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
	}
}