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();
}
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import SuperTrend
from StockSharp.Algo.Strategies import Strategy
class exp_super_trend_strategy(Strategy):
def __init__(self):
super(exp_super_trend_strategy, self).__init__()
self._atr_period = self.Param("AtrPeriod", 10) \
.SetDisplay("ATR Period", "ATR period for SuperTrend", "SuperTrend")
self._multiplier = self.Param("Multiplier", 3.0) \
.SetDisplay("Multiplier", "ATR multiplier for SuperTrend", "SuperTrend")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Timeframe for indicator calculation", "General")
self._super_trend = None
@property
def atr_period(self):
return self._atr_period.Value
@property
def multiplier(self):
return self._multiplier.Value
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(exp_super_trend_strategy, self).OnReseted()
self._super_trend = None
def OnStarted2(self, time):
super(exp_super_trend_strategy, self).OnStarted2(time)
self._super_trend = SuperTrend()
self._super_trend.Length = self.atr_period
self._super_trend.Multiplier = self.multiplier
subscription = self.SubscribeCandles(self.candle_type)
subscription.BindEx(self._super_trend, self.process_candle).Start()
def process_candle(self, candle, st_value):
if candle.State != CandleStates.Finished:
return
is_up_trend = st_value.IsUpTrend
if is_up_trend and self.Position <= 0:
self.BuyMarket()
elif not is_up_trend and self.Position >= 0:
self.SellMarket()
def CreateClone(self):
return exp_super_trend_strategy()