Esta estrategia utiliza el oscilador de Convergencia/Divergencia de Medias Móviles (MACD) para operar en ambas direcciones. Se abre una posición larga cuando la línea MACD cruza por encima de su línea de señal. Se abre una posición corta cuando la línea MACD cruza por debajo de su línea de señal. Las posiciones están protegidas por niveles fijos de stop-loss y take-profit, mientras que un trailing stop opcional puede asegurar ganancias durante tendencias fuertes.
Detalles
Criterios de entrada:
Largo: MACD cruza por encima de la línea de señal.
Corto: MACD cruza por debajo de la línea de señal.
Largo/Corto: Ambos lados.
Criterios de salida:
Se alcanza el nivel de stop-loss o take-profit.
Se activa el trailing stop.
Stops: Sí, incluye stop-loss, take-profit y trailing stop opcional.
Valores predeterminados:
FastPeriod = 14
SlowPeriod = 26
SignalPeriod = 1
TakeProfit = 500 puntos
StopLoss = 2500 puntos
Filtros:
Categoría: Seguimiento de tendencia
Dirección: Ambos
Indicadores: MACD
Stops: Sí
Complejidad: Moderado
Marco temporal: Corto plazo
Estacionalidad: No
Redes neuronales: No
Divergencia: No
Nivel de riesgo: Medio
using System;
using System.Collections.Generic;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// EMA crossover strategy inspired by MACD concept.
/// </summary>
public class TerminatorV2z0Strategy : Strategy
{
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevFast;
private decimal _prevSlow;
private bool _hasPrev;
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public TerminatorV2z0Strategy()
{
_fastPeriod = Param(nameof(FastPeriod), 12)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "Fast EMA period", "MACD");
_slowPeriod = Param(nameof(SlowPeriod), 26)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "Slow EMA period", "MACD");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle type", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
=> [(Security, CandleType)];
protected override void OnReseted()
{
base.OnReseted();
_prevFast = 0;
_prevSlow = 0;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
SubscribeCandles(CandleType)
.Bind(fast, slow, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fastVal, decimal slowVal)
{
if (candle.State != CandleStates.Finished) return;
if (!_hasPrev)
{
_prevFast = fastVal;
_prevSlow = slowVal;
_hasPrev = true;
return;
}
var crossUp = _prevFast <= _prevSlow && fastVal > slowVal;
var crossDown = _prevFast >= _prevSlow && fastVal < slowVal;
if (crossUp && Position <= 0)
{
if (Position < 0) BuyMarket();
BuyMarket();
}
else if (crossDown && Position >= 0)
{
if (Position > 0) SellMarket();
SellMarket();
}
_prevFast = fastVal;
_prevSlow = slowVal;
}
}