La estrategia Alerta MACD Lenta reproduce el MetaTrader 4 experto Alert_MACD_Slow.mq4. Observa la línea principal MACD y dos promedios móviles exponenciales y genera alertas textuales cuando la pila de indicadores señala una posible ruptura. No se envían pedidos: la conversión se mantiene fiel al asesor original, que solo mostraba mensajes emergentes.
Idea central
Suscríbase a la serie de velas seleccionada y alimente un MACD(3, 20, 9) junto con EMA rápidas y lentas (20 y 65 períodos).
Almacene en caché los valores MACD de las cuatro velas completadas anteriores para evaluar las transiciones de pendiente utilizadas por el código MQL.
Almacene los máximos y mínimos de las dos últimas velas para emular los filtros de ruptura High[1]/High[2] y Low[1]/Low[2].
Cuando el EMA rápido permanece por encima (o por debajo) del EMA lento y el cierre de la vela rompe los máximos (o mínimos) memorizados mientras que MACD sube (o baja) por debajo de la línea cero, registre el mensaje de alerta respectivo.
Parámetros
Nombre
Predeterminado
Descripción
MacdFastPeriod
3
Longitud rápida de EMA dentro del cálculo de MACD.
MacdSlowPeriod
20
Longitud lenta de EMA utilizada por el MACD.
MacdSignalPeriod
9
Período de suavizado de señal del MACD.
QuickEmaPeriod
20
Período del rápido seguimiento de tendencias EMA (Ma_Quick).
SlowEmaPeriod
65
Período del filtro de tendencia EMA lenta (Ma_Slow).
CandleType
TimeFrame(30m)
La fuente de la vela pasó a la cadena del indicador; elija un período de tiempo que coincida con su gráfico.
Detalles de la lógica de alerta
MACD memoria de pendiente: la estrategia cambia los valores MACD anteriores internamente en lugar de llamar a GetValue, satisfaciendo las pautas de conversión y preservando las comparaciones originales (Macd_1 > Macd_2, etc.).
Comprobación de ruptura: los precios de cierre por encima de los máximos anteriores o por debajo de los mínimos anteriores se tratan como un indicador de las comprobaciones de oferta/demanda de MetaTrader, que utilizó la cotización en vivo contra los extremos históricos de las velas.
Filtro de tendencias: la alerta se activa solo cuando el EMA rápido está en el lado correcto del EMA lento, coincidiendo con los filtros largos/cortos en el experto MQL.
Registro: las alertas se envían a través de AddInfoLog. Incluyen los cuatro valores MACD almacenados en caché y los niveles de ruptura para facilitar la depuración y las pruebas retrospectivas.
Sin operaciones: debido a que el asesor de origen nunca realizó operaciones, la conversión StockSharp mantiene la estrategia plana y se centra únicamente en la señalización.
Uso típico
Adjunte la estrategia a un símbolo, configure el tipo de vela en el período de tiempo deseado y mantenga los períodos de indicador predeterminados o ajústelos para experimentar.
Inicie la estrategia y espere hasta que se formen los indicadores MACD y EMA (se necesitan varias velas porque MACD requiere historial).
Mire el diario: cuando aparezca una configuración alcista verá SET UP LONG, mientras que las configuraciones bajistas producirán SET UP SHORT_VALUE. El sufijo refleja el texto de alerta original.
Utilice los diagnósticos impresos para decidir si actuar manualmente o encadenar la estrategia con una automatización personalizada.
Clasificación
Categoría: Alertas/Confirmación de ruptura de tendencia
Dirección comercial: Ninguna (solo señal)
Estilo de ejecución: Basado en eventos en velas terminadas
Requisitos de datos: Serie de velas compatible con el CandleType elegido
Complejidad: Moderada (múltiples filtros de indicador, pero manejo de estado sencillo)
Gestión de Riesgos: No aplicable (no hay posiciones abiertas)
Este puerto mantiene el comportamiento de alerta del experto MQL mientras aprovecha las suscripciones de StockSharp, enlaces de indicadores y utilidades de registro.
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
public class AlertMacdSlowStrategy : 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;
private int _cooldown;
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 AlertMacdSlowStrategy()
{
_fastPeriod = Param(nameof(FastPeriod), 12).SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 26).SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(15).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = default;
_prevSlow = default;
_hasPrev = default;
_cooldown = default;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
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 (!IsFormedAndOnlineAndAllowTrading()) return;
if (!_hasPrev) { _prevFast = fast; _prevSlow = slow; _hasPrev = true; return; }
if (_cooldown > 0)
{
_cooldown--;
_prevFast = fast;
_prevSlow = slow;
return;
}
if (_prevFast <= _prevSlow && fast > slow && Position <= 0)
{
var volume = Volume + Math.Abs(Position);
BuyMarket(volume);
_cooldown = 2;
}
else if (_prevFast >= _prevSlow && fast < slow && Position >= 0)
{
var volume = Volume + Math.Abs(Position);
SellMarket(volume);
_cooldown = 2;
}
_prevFast = fast; _prevSlow = slow;
}
}