Ver en GitHub

Estrategia MTF RSI SAR

Esta estrategia combina lecturas del Índice de Fuerza Relativa (RSI) en cuatro marcos temporales, Parabolic SAR y Bandas de Bollinger para capturar la continuación de tendencias después de breves retrocesos. Las señales se generan en velas de 5 minutos mientras los marcos temporales superiores actúan como filtros de confirmación.

Concepto

  1. Filtro RSI – Los valores de RSI en 5, 15, 30 y 60 minutos deben estar todos por encima de 50 para entradas largas o por debajo de 50 para entradas cortas. Esta confirmación multi-temporalidad busca alinear las operaciones con la tendencia más amplia.
  2. Filtro Parabolic SAR – Los valores del Parabolic SAR en los gráficos de 5, 15 y 30 minutos deben estar por debajo de la vela actual para largos o por encima para cortos. Esto asegura que el precio esté tendiendo en la dirección deseada.
  3. Disparador de Bandas de Bollinger – En el gráfico de 5 minutos el cierre de la vela debe romper la banda superior para largos o la banda inferior para cortos. Las Bandas de Bollinger proporcionan un disparador de sobrecompra/sobreventa.
  4. Entrada y salida – Se abre una posición larga cuando todos los filtros activos apuntan hacia arriba. Se abre una posición corta cuando todos los filtros activos apuntan hacia abajo. La señal opuesta cierra una posición abierta.

Cualquiera de los tres filtros puede desactivarse individualmente mediante parámetros, permitiendo que la estrategia opere solo con RSI, solo con Bandas de Bollinger, solo con SAR, o cualquier combinación de los anteriores.

Parámetros

  • UseRsi – activar filtro RSI (predeterminado: true).
  • UseBollinger – activar disparador de Bandas de Bollinger (predeterminado: true).
  • UseSar – activar filtro Parabolic SAR (predeterminado: true).
  • RsiPeriod – período de cálculo del RSI (predeterminado: 14).
  • BollingerPeriod – número de barras para las Bandas de Bollinger (predeterminado: 20).
  • BollingerWidth – amplitud (multiplicador de desviación estándar) para las Bandas de Bollinger (predeterminado: 2).
  • SarStep – factor de aceleración para el Parabolic SAR (predeterminado: 0.02).
  • SarMax – factor de aceleración máximo para el Parabolic SAR (predeterminado: 0.2).
  • CandleType – marco temporal de vela base, 5 minutos por defecto.

Reglas de Trading

  • Largo: todos los filtros habilitados proporcionan señales alcistas.
  • Corto: todos los filtros habilitados proporcionan señales bajistas.
  • Salida: la señal opuesta cierra la posición.

Notas

  • La estrategia opera sobre un valor con cuatro suscripciones de vela: marcos temporales de 5, 15, 30 y 60 minutos.
  • Diseñada como ejemplo educativo de confirmación multi-temporalidad usando la API de alto nivel de StockSharp.
  • No hay stop-loss fijo ni objetivos de beneficio; la gestión del riesgo debe añadirse externamente si se requiere.
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 and Parabolic SAR strategy.
/// Buys when RSI below oversold and SAR below price; sells on opposite.
/// </summary>
public class MtfRsiSarStrategy : Strategy
{
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<decimal> _rsiOversold;
	private readonly StrategyParam<decimal> _rsiOverbought;
	private readonly StrategyParam<DataType> _candleType;

	public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
	public decimal RsiOversold { get => _rsiOversold.Value; set => _rsiOversold.Value = value; }
	public decimal RsiOverbought { get => _rsiOverbought.Value; set => _rsiOverbought.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public MtfRsiSarStrategy()
	{
		_rsiPeriod = Param(nameof(RsiPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI Period", "RSI period", "Indicators");

		_rsiOversold = Param(nameof(RsiOversold), 35m)
			.SetDisplay("RSI Oversold", "RSI oversold level", "Indicators");

		_rsiOverbought = Param(nameof(RsiOverbought), 65m)
			.SetDisplay("RSI Overbought", "RSI overbought level", "Indicators");

		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Type of candles", "General");
	}

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

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

		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var sar = new ParabolicSar();

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(rsi, sar, ProcessCandle)
			.Start();
	}

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

		var close = candle.ClosePrice;

		// Buy: RSI oversold + SAR below price
		if (rsi < RsiOversold && sar < close)
		{
			if (Position < 0)
				BuyMarket();
			if (Position <= 0)
				BuyMarket();
		}
		// Sell: RSI overbought + SAR above price
		else if (rsi > RsiOverbought && sar > close)
		{
			if (Position > 0)
				SellMarket();
			if (Position >= 0)
				SellMarket();
		}
		// Exit long when RSI overbought
		else if (Position > 0 && rsi > RsiOverbought)
		{
			SellMarket();
		}
		// Exit short when RSI oversold
		else if (Position < 0 && rsi < RsiOversold)
		{
			BuyMarket();
		}
	}
}