Ver no GitHub

Estratégia Exp Super Trend

Estratégia convertida do script MQL Exp_Super_Trend.mq5 (ID 14269). Ela segue a direção do indicador SuperTrend e inverte posições sempre que a tendência muda. A implementação usa a API de alto nível do StockSharp e o indicador SuperTrend integrado.

O indicador calcula uma linha dinâmica de suporte ou resistência baseada em ATR. Quando o preço permanece acima dessa linha, a tendência é considerada de alta; caso contrário, de baixa. A estratégia abre uma posição comprada durante os períodos de alta e muda para uma posição vendida durante os períodos de baixa. Cada mudança do indicador provoca uma inversão imediata de posição.

Essa abordagem funciona melhor em mercados com tendência, onde grandes movimentos seguem um rompimento. Também é útil como modelo educacional mostrando como conectar um indicador usando BindEx e executar ordens de mercado em velas concluídas.

Detalhes

  • Critérios de entrada:
    • Comprado: SuperTrend sinaliza uma tendência de alta.
    • Vendido: SuperTrend sinaliza uma tendência de baixa.
  • Comprado/Vendido: Ambos.
  • Critérios de saída: Sinal oposto do SuperTrend (a posição é invertida).
  • Stops: Sem stop loss explícito; a linha do indicador atua como trailing stop.
  • Valores padrão:
    • AtrPeriod = 10
    • Multiplier = 3m
    • CandleType = TimeSpan.FromHours(1).TimeFrame()
  • Filtros:
    • Categoria: Seguidor de tendência
    • Direção: Ambos
    • Indicadores: SuperTrend
    • Stops: Baseado em indicador
    • Complexidade: Básico
    • Período: Médio (1 hora por padrão)
    • Sazonalidade: Nenhum
    • Redes neurais: Não
    • Divergência: Não
    • Nível de risco: Médio
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>
/// SuperTrend expert strategy.
/// Opens positions following the SuperTrend direction.
/// </summary>
public class ExpSuperTrendStrategy : Strategy
{
	private readonly StrategyParam<int> _atrPeriod;
	private readonly StrategyParam<decimal> _multiplier;
	private readonly StrategyParam<DataType> _candleType;

	private SuperTrend _superTrend;

	/// <summary>
	/// ATR period for SuperTrend.
	/// </summary>
	public int AtrPeriod
	{
		get => _atrPeriod.Value;
		set => _atrPeriod.Value = value;
	}

	/// <summary>
	/// ATR multiplier for SuperTrend.
	/// </summary>
	public decimal Multiplier
	{
		get => _multiplier.Value;
		set => _multiplier.Value = value;
	}

	/// <summary>
	/// Candle type.
	/// </summary>
	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	/// <summary>
	/// Initializes a new instance of <see cref="ExpSuperTrendStrategy"/>.
	/// </summary>
	public ExpSuperTrendStrategy()
	{
		_atrPeriod = Param(nameof(AtrPeriod), 10)
			.SetDisplay("ATR Period", "ATR period for SuperTrend", "SuperTrend")
			.SetGreaterThanZero()
			
			.SetOptimize(5, 20, 1);

		_multiplier = Param(nameof(Multiplier), 3m)
			.SetDisplay("Multiplier", "ATR multiplier for SuperTrend", "SuperTrend")
			.SetGreaterThanZero()
			
			.SetOptimize(1m, 5m, 0.5m);

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

	/// <inheritdoc />
	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
	{
		return [(Security, CandleType)];
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_superTrend = default;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		_superTrend = new SuperTrend
		{
			Length = AtrPeriod,
			Multiplier = Multiplier
		};

		var subscription = SubscribeCandles(CandleType);
		subscription
			.BindEx(_superTrend, ProcessCandle)
			.Start();
	}

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

		if (stValue is not SuperTrendIndicatorValue st)
			return;

		var isUpTrend = st.IsUpTrend;

		if (isUpTrend && Position <= 0)
		{
			BuyMarket();
		}
		else if (!isUpTrend && Position >= 0)
		{
			SellMarket();
		}
	}
}