Ver en GitHub

Estrategia de Señal Supertrend

Esta estrategia abre posiciones cuando el precio de cierre cruza la línea SuperTrend. Se coloca una operación larga cuando el precio sube por encima de la línea, y se abre una operación corta cuando el precio cae por debajo de ella. Las señales opuestas cierran e invierten las posiciones existentes.

El indicador SuperTrend utiliza el Rango Verdadero Promedio (ATR) para seguir el precio y definir la tendencia predominante. Los parámetros permiten configurar el período ATR, el multiplicador y el marco temporal de las velas.

Detalles

  • Criterios de entrada:
    • Largo: El precio de cierre cruza por encima de SuperTrend
    • Corto: El precio de cierre cruza por debajo de SuperTrend
  • Largo/Corto: Largo y Corto
  • Criterios de salida:
    • Cruce opuesto de SuperTrend
  • Stops: Ninguno
  • Valores predeterminados:
    • AtrPeriod = 5
    • Multiplier = 3
    • CandleType = TimeSpan.FromMinutes(15).TimeFrame()
  • Filtros:
    • Categoría: Seguimiento de tendencia
    • Dirección: Ambos
    • Indicadores: SuperTrend (basado en ATR)
    • Stops: No
    • Complejidad: Principiante
    • Marco temporal: Medio plazo
    • Estacionalidad: Ninguno
    • Redes neuronales: No
    • Divergencia: No
    • Nivel de riesgo: Medio
using System;
using System.Linq;
using System.Collections.Generic;
using Ecng.Common;
using Ecng.Collections;
using Ecng.Serialization;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Simple SuperTrend crossover strategy.
/// </summary>
public class SupertrendSignalStrategy : Strategy
{
	private readonly StrategyParam<int> _atrPeriod;
	private readonly StrategyParam<decimal> _multiplier;
	private readonly StrategyParam<DataType> _candleType;

	private bool? _prevIsUpTrend;

	public int AtrPeriod { get => _atrPeriod.Value; set => _atrPeriod.Value = value; }
	public decimal Multiplier { get => _multiplier.Value; set => _multiplier.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public SupertrendSignalStrategy()
	{
		_atrPeriod = Param(nameof(AtrPeriod), 5)
			.SetDisplay("ATR Period", "ATR period for SuperTrend", "Parameters");

		_multiplier = Param(nameof(Multiplier), 3m)
			.SetDisplay("Multiplier", "ATR multiplier for SuperTrend", "Parameters");

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

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

	protected override void OnReseted()
	{
		base.OnReseted();
		_prevIsUpTrend = null;
	}

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

		var st = new SuperTrend { Length = AtrPeriod, Multiplier = Multiplier };
		var subscription = SubscribeCandles(CandleType);
		subscription
			.BindEx(st, ProcessCandle)
			.Start();

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

	private void ProcessCandle(ICandleMessage candle, IIndicatorValue stValue)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (!stValue.IsFormed)
			return;

		var stv = stValue as SuperTrendIndicatorValue;
		if (stv == null)
			return;

		var isUpTrend = stv.IsUpTrend;

		if (IsFormedAndOnlineAndAllowTrading() && _prevIsUpTrend.HasValue)
		{
			if (isUpTrend && !_prevIsUpTrend.Value && Position <= 0)
				BuyMarket();
			else if (!isUpTrend && _prevIsUpTrend.Value && Position >= 0)
				SellMarket();
		}

		_prevIsUpTrend = isUpTrend;
	}
}