A estratégia 4 SMA replica o consultor especialista MetaTrader 4 SMA.mq4. Ele funciona em velas de 30 minutos calculadas com preços medianos e compara quatro médias móveis simples (5, 20, 40 e 60 períodos) para detectar rompimentos de impulso. A porta StockSharp mantém o comportamento de posição única do código original e usa auxiliares API de alto nível para entradas de mercado e gerenciamento de risco.
Lógica de negociação
Calcule o preço médio (high + low) / 2 para cada vela finalizada e insira-o nos quatro SMAs.
Entrada longa acontece quando o rápido SMA está acima do médio SMA, o médio SMA está acima do lento SMA, o lento SMA está acima do muito lento SMA em pelo menos uma etapa de preço, e o lento anterior SMA estava abaixo ou igual ao muito lento SMA. Apenas uma posição longa pode estar ativa por vez.
Entrada curta é a condição de espelho: o rápido SMA está abaixo do médio SMA, o médio SMA está abaixo do lento SMA, o muito lento SMA está acima do lento SMA em pelo menos uma etapa de preço, e o lento anterior SMA estava acima ou igual ao muito lento SMA. Apenas uma posição curta pode estar ativa por vez.
Gerenciamento de posição
A estratégia fecha posições compradas quando o lento SMA cruza abaixo do muito lento SMA e fecha posições curtas quando o lento SMA cruza acima do muito lento SMA.
Os níveis de proteção são pré-calculados após cada entrada. As distâncias de stop-loss e take-profit seguem as configurações originais baseadas em pontos e dependem da etapa do preço do título.
Os trailing stops são ativados depois que o preço ultrapassa a distância final configurada. A parada é seguida vela por vela e nunca afrouxada.
Parâmetros
Nome
Descrição
Padrão
Tipo de vela
Série de velas usada para cálculos (30 minutos por padrão).
Prazo M30
Obter lucro
Distância de lucro em pontos.
50
StopLoss
Distância de stop-loss em pontos.
50
TrailingStop
Distância de parada final em pontos.
11
Comprimento Rápido
Comprimento do rápido SMA.
5
Comprimento Médio
Comprimento do meio SMA.
20
Comprimento Lento
Comprimento da lentidão SMA.
40
Comprimento muito lento
Comprimento do muito lento SMA.
60
Todos os parâmetros numéricos são expostos para otimização por meio da IU de parâmetro StockSharp.
Diferenças da versão MQL
O trailing stop original manipulou ordens MT4 diretamente; o porto recalcula os preços de saída e emite ordens de mercado quando os níveis são ultrapassados.
Os cálculos conscientes do nível de preço permitem que a estratégia opere em instrumentos com tamanhos de ticks não forex.
A implementação do StockSharp depende de ligações SubscribeCandles de alto nível e parâmetros de estratégia, mantendo-se próximo das práticas recomendadas da estrutura.
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
public class FourSmaStrategy : Strategy
{
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<int> _cooldownCandles;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevFast;
private decimal _prevSlow;
private bool _hasPrev;
private int _cooldownRemaining;
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public int CooldownCandles { get => _cooldownCandles.Value; set => _cooldownCandles.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public FourSmaStrategy()
{
_fastPeriod = Param(nameof(FastPeriod), 20).SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 80).SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
_cooldownCandles = Param(nameof(CooldownCandles), 100).SetDisplay("Cooldown", "Candles between signals", "General");
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = default;
_prevSlow = default;
_hasPrev = default;
_cooldownRemaining = default;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevFast = 0;
_prevSlow = 0;
_hasPrev = false;
_cooldownRemaining = 0;
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fast, slow, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
{
if (candle.State != CandleStates.Finished) return;
if (!_hasPrev) { _prevFast = fast; _prevSlow = slow; _hasPrev = true; return; }
if (_cooldownRemaining > 0)
{
_cooldownRemaining--;
_prevFast = fast;
_prevSlow = slow;
return;
}
if (_prevFast <= _prevSlow && fast > slow && Position <= 0)
{
if (Position < 0) BuyMarket();
BuyMarket();
_cooldownRemaining = CooldownCandles;
}
else if (_prevFast >= _prevSlow && fast < slow && Position >= 0)
{
if (Position > 0) SellMarket();
SellMarket();
_cooldownRemaining = CooldownCandles;
}
_prevFast = fast;
_prevSlow = slow;
}
}