La Estrategia Five MA Multi-Timeframe replica el asesor experto original MT4 "5matf" utilizando el API de alto nivel de StockSharp. La estrategia analiza cinco promedios móviles simples en tres períodos de tiempo (primario, superior y más lento) y combina la pendiente de cada promedio con el Oscilador Acelerador para producir señales de entrada graduadas. Cuando hay suficiente evidencia alcista o bajista en todos los plazos, la estrategia abre o cierra posiciones en consecuencia.
Indicadores y datos
Promedios móviles simples (SMA): Períodos 5, 8, 13, 21 y 34 en los tres períodos de tiempo.
Oscilador del acelerador (AC): Aplicado en los períodos de tiempo primario y terciario para evaluar la aceleración del impulso.
Períodos de tiempo: predeterminado: 15 minutos (señal), 60 minutos (confirmación) y 240 minutos (filtro de tendencias). Todos los plazos se pueden ajustar mediante parámetros.
Lógica de señal
Cada SMA compara su valor actual con la vela anterior para determinar una pendiente ascendente o descendente.
Accelerator Oscillator busca secuencias alcistas o bajistas utilizando los últimos cuatro valores.
Los recuentos de pendientes y las contribuciones del oscilador se agregan en puntuaciones porcentuales para cada período de tiempo.
Cuando los tres marcos temporales tienen puntuaciones alcistas superiores al 50%, se genera una señal de COMPRA. Las puntuaciones superiores al 75% refuerzan la señal.
Los mismos umbrales aplicados en la dirección opuesta generan señales de VENTA.
Las posiciones se cierran cuando una señal opuesta excede el nivel de cierre configurado. Las nuevas operaciones sólo se abren cuando no hay ninguna posición activa, lo que refleja el comportamiento original del asesor experto.
Parámetros
Nombre
Predeterminado
Descripción
CandleType
velas de 15 minutos
Marco de tiempo principal utilizado para las señales comerciales.
HigherTimeframe1
velas de 60 minutos
Primer plazo más alto para la confirmación.
HigherTimeframe2
velas de 240 minutos
Segundo período de tiempo más alto para el filtro de tendencia lenta.
FirstPeriod – FifthPeriod
5, 8, 13, 21, 34
SMA longitudes aplicadas a cada período de tiempo.
OpenLevel
0
Calificación de señal mínima requerida para abrir una nueva posición.
CloseLevel
1
Se requiere grado de señal opuesto para cerrar una posición existente.
Todos los parámetros se pueden optimizar o ajustar dentro de la interfaz de usuario de estrategia de StockSharp.
Notas de uso
La estrategia utiliza órdenes de mercado y no emite reversiones simultáneas; siempre espera una posición plana antes de abrirse en la dirección opuesta.
Habilite las fuentes de datos históricos para todos los períodos de tiempo seleccionados para garantizar cálculos sincronizados.
Considere ajustar las longitudes de SMA o el uso del oscilador al aplicar la estrategia a diferentes mercados o regímenes de volatilidad.
Notas de conversión
Esta implementación conserva el comportamiento principal del asesor experto MT4 "5matf" al tiempo que aprovecha el sistema de vinculación de indicadores y suscripción de StockSharp. La lógica del acelerador requiere cuatro velas completas antes de que las señales se activen, al igual que el guión 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;
}
}