Bruno Trend Strategy é uma versão StockSharp do MetaTrader consultor especialista "Bruno_v1". A estratégia é negociada em velas de 30 minutos e se concentra em sinais de alta sincronizados de vários indicadores clássicos de acompanhamento de tendências e de impulso. Apenas posições longas são abertas, imitando o especialista original que se concentrou em rompimentos de alta confirmados pelo alinhamento do indicador.
Lógica de negociação
Prazo: velas de 30 minutos.
Indicadores:
Média Móvel Simples (SMA) com comprimento 4 usada como medidor de momentum de curto prazo.
Médias Móveis Exponenciais (EMAs) com comprimentos 8 e 21 para definir a direção da tendência primária.
Índice Direcional Médio (ADX) com período 13 para garantir força direcional por meio de componentes +DI e -DI.
Stochastic Oscilador com parâmetros %K=21, %D=3, slowing=3 para confirmar o impulso enquanto evita níveis de sobrecompra.
MACD (13, 34, 8) para histograma e confirmação de linha de sinal.
Parabolic SAR (etapa 0,055, máximo 0,21) para verificar a aceleração ascendente e gerenciar saídas.
Regras de inscrição:
EMA(8) deve estar acima de EMA(21).
Filtro ADX: +DI maior que -DI e acima de 20.
Filtro Stochastic: %K acima de %D, mas ainda abaixo de 80 para ficar fora dos extremos de sobrecompra.
Histograma MACD acima de zero e acima da linha de sinal.
Parabolic SAR aumentando (atual SAR maior que a leitura anterior).
A posição atual deve ser plana ou curta. Qualquer posição curta é fechada antes de entrar na nova negociação longa.
Regras de saída:
Feche a posição longa quando o fechamento da vela anterior cair abaixo do valor Parabolic SAR anterior, replicando o gatilho de saída MetaTrader.
Gestão de risco
Tamanho do lote padrão: 0,1 lote.
Proteção opcional estilo MetaTrader: take-profit de 50 pip e stop-loss de 30 pip, configurado com StartProtection. As paradas finais são desabilitadas por padrão para espelhar o script original.
Notas
A estratégia ignora a configuração curta não utilizada do código MetaTrader, correspondendo ao comportamento original onde as negociações curtas foram efetivamente desativadas.
Os valores dos indicadores são processados por meio do API de alto nível do API para evitar buffer manual e permanecer alinhados com as diretrizes do projeto.
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Bruno trend strategy - EMA trend following with RSI confirmation.
/// Buys when fast EMA is above slow EMA and RSI is rising.
/// Sells when fast EMA crosses below slow EMA.
/// </summary>
public class BrunoTrendStrategy : Strategy
{
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevFast;
private decimal _prevSlow;
private decimal _prevRsi;
private bool _hasPrev;
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public BrunoTrendStrategy()
{
_fastPeriod = Param(nameof(FastPeriod), 8)
.SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 21)
.SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetDisplay("RSI Period", "RSI period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
protected override void OnReseted() { base.OnReseted(); _prevFast = 0m; _prevSlow = 0m; _prevRsi = 0m; _hasPrev = false; }
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(fast, slow, rsi, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow, decimal rsi)
{
if (candle.State != CandleStates.Finished)
return;
if (!_hasPrev)
{
_prevFast = fast;
_prevSlow = slow;
_prevRsi = rsi;
_hasPrev = true;
return;
}
var crossUp = _prevFast <= _prevSlow && fast > slow;
var crossDown = _prevFast >= _prevSlow && fast < slow;
// Buy on bullish crossover with rising RSI
if (crossUp && rsi > _prevRsi && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// Sell on bearish crossover
else if (crossDown && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevFast = fast;
_prevSlow = slow;
_prevRsi = rsi;
}
}