A Estratégia Multi-Timeframe de Cinco MAs replica o consultor especialista MT4 "5matf" original usando o API de alto nível de StockSharp. A estratégia analisa cinco médias móveis simples em três períodos de tempo (primário, mais alto e mais lento) e combina a inclinação de cada média com o oscilador do acelerador para produzir sinais de entrada graduados. Quando há evidências suficientes de alta ou baixa em todos os prazos, a estratégia abre ou fecha posições de acordo.
Indicadores e Dados
Médias Móveis Simples (SMA): Períodos 5, 8, 13, 21 e 34 em todos os três períodos de tempo.
Oscilador Acelerador (AC): Aplicado nos prazos primários e terciários para avaliar a aceleração do momento.
Prazos: Padrão definido como 15 minutos (sinal), 60 minutos (confirmação) e 240 minutos (filtro de tendência). Todos os prazos podem ser ajustados através de parâmetros.
Lógica de Sinais
Cada SMA compara seu valor atual com a vela anterior para determinar uma inclinação ascendente ou descendente.
O Accelerator Oscillator verifica sequências de alta ou baixa usando os últimos quatro valores.
As contagens de inclinação e as contribuições do oscilador são agregadas em pontuações percentuais para cada período de tempo.
Quando todos os três períodos de tempo apresentam pontuações de alta acima de 50%, um sinal de COMPRA é gerado. Pontuações acima de 75% fortalecem o sinal.
Os mesmos limites aplicados na direção oposta geram sinais de VENDA.
As posições são fechadas quando um sinal oposto excede o nível de fechamento configurado. Novas negociações só são abertas quando nenhuma posição está ativa, refletindo o comportamento original do consultor especialista.
Parâmetros
Nome
Padrão
Descrição
CandleType
Velas de 15 minutos
Período primário usado para sinais de negociação.
HigherTimeframe1
Velas de 60 minutos
Primeiro prazo maior para confirmação.
HigherTimeframe2
Velas de 240 minutos
Segundo período de tempo mais alto para filtro de tendência lenta.
FirstPeriod – FifthPeriod
5, 8, 13, 21, 34
SMA comprimentos aplicados a cada período de tempo.
OpenLevel
0
Grau mínimo de sinal necessário para abrir uma nova posição.
CloseLevel
1
Grau de sinal oposto necessário para fechar uma posição existente.
Todos os parâmetros podem ser otimizados ou ajustados na interface de estratégia do StockSharp.
Notas de uso
A estratégia utiliza ordens de mercado e não emite reversões simultâneas; sempre espera por uma posição plana antes de abrir na direção oposta.
Ative feeds de dados históricos para todos os períodos selecionados para garantir cálculos sincronizados.
Considere ajustar os comprimentos de SMA ou o uso do oscilador ao aplicar a estratégia a diferentes mercados ou regimes de volatilidade.
Notas de conversão
Esta implementação mantém o comportamento central do consultor especialista MT4 "5matf" enquanto aproveita o sistema de assinatura e vinculação de indicadores de StockSharp. A lógica do acelerador requer quatro velas completadas antes que os sinais se tornem ativos, assim como o script original.
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
public class FiveMaMultiTimeframeStrategy : 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 FiveMaMultiTimeframeStrategy()
{
_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;
}
}