Ver en GitHub

Estrategia Forex Cielo

Descripción general

La Estrategia Forex Sky es una adaptación directa del MetaTrader asesor experto Forex_SKY.mq4. Negocia MACD cambios de impulso y se limita estrictamente a una única posición por día de negociación. La implementación StockSharp mantiene los umbrales originales MACD y el control de seguridad que evita más de un pedido por vela.

La estrategia se suscribe al marco temporal definido por CandleType (velas de 15 minutos por defecto) y evalúa el clásico MACD (26/12/9) al cierre de cada vela completa.

Lógica de trading

  • Entrada larga – Realice una compra en el mercado cuando:
    • La línea principal actual MACD está por encima de cero;
    • También supera +0.00009 para confirmar el impulso;
    • Al menos una de las tres lecturas anteriores de MACD fue menor o igual a cero (capturando un giro alcista desde territorio negativo).
  • Entrada corta: realice una venta de mercado cuando se cumpla alguna de las siguientes condiciones:
    • La línea principal MACD está por debajo de cero, cae por debajo de -0.0004, al menos una de las últimas tres lecturas no fue negativa y el valor de hace cuatro barras fue al menos +0.001.
    • O el valor de hace cuatro barras era ≥ +0.003, lo que autoriza inmediatamente una operación corta como en el código MetaTrader original.
  • Gestión de posiciones: el algoritmo nunca abre más de una orden por vela (Time0 guardia) y nunca negocia más de una vez por día calendario (CheckTodaysOrders guardia). Las órdenes de salida de protección son manejadas por el ayudante StockSharp StartProtection, por lo que todas las paradas y objetivos permanecen sincronizados con el volumen actual.

No existe una lógica de liquidación autónoma más allá de las órdenes de protección: se espera que las posiciones se cierren mediante toma de ganancias, stop-loss o intervención manual, reflejando el comportamiento del asesor experto original.

Parámetros

Nombre Predeterminado Descripción
FastPeriod 12 Longitud rápida EMA del indicador MACD.
SlowPeriod 26 Longitud lenta de EMA del indicador MACD.
SignalPeriod 9 Longitud de la señal EMA del indicador MACD.
TakeProfitPoints 100 Distancia a la orden de toma de ganancias expresada en puntos del instrumento. Convertido a precio multiplicando por el paso del precio del valor.
StopLossPoints 3000 Distancia a la orden stop-loss en puntos del instrumento.
TradeVolume 0.1 Tamaño base de la orden del mercado (lotes).
CandleType plazo de 15 minutos Plazo que alimenta los cálculos y decisiones comerciales de MACD.

Cálculo del punto del instrumento

TakeProfitPoints y StopLossPoints se especifican exactamente igual que la versión MetaTrader: Point en MQL4 corresponde a Security.PriceStep en StockSharp. Para un par de divisas de cinco dígitos (PriceStep = 0.00001), la configuración predeterminada se traduce en:

  • Take-profit: 100 × 0.00001 = 0.001 unidades de precio.
  • Stop-loss: 3000 × 0.00001 = 0.03 unidades de precio.

Gestión del riesgo

StartProtection instala automáticamente las órdenes de obtención de ganancias y de limitación de pérdidas después de completar una entrada. Están vinculados a la dirección comercial y utilizan órdenes de mercado cuando se activan, coincidiendo con el comportamiento MetaTrader. Establezca cualquiera de los parámetros en 0 para desactivar la orden de protección correspondiente.

Notas de migración

  • El búfer de historial MACD mantiene los últimos cuatro valores completados en los campos de clase, por lo que no se requieren llamadas de indicador con índices desplazados.
  • La limitación del comercio diario y la restricción de un solo comercio por barra replican CheckTodaysOrders() y Time0 de la fuente original.
  • Todos los comentarios se reescribieron en inglés y la lógica se basa en StockSharp enlaces de alto nivel (Bind) para el procesamiento de indicadores.

Consejos de uso

  • Ajuste CandleType al período del gráfico que desea emular; el script original hereda el período de tiempo del gráfico automáticamente.
  • Dado que solo se permite una operación por día, elija mercados con oscilaciones intradiarias significativas o considere aumentar los umbrales de MACD cuando utilice instrumentos de mayor volatilidad.
  • Supervise el reloj/zona horaria de la plataforma para asegurarse de que el límite del día coincida con su sesión de negociación, ya que el contador de límite se reinicia según la fecha de apertura de la vela.
using System;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Forex Sky: MACD zero-line cross with EMA trend filter.
/// </summary>
public class ForexSkyStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastLength;
	private readonly StrategyParam<int> _slowLength;
	private readonly StrategyParam<int> _emaLength;
	private readonly StrategyParam<int> _atrLength;

	private decimal _prevMacd;
	private decimal _entryPrice;

	public ForexSkyStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe.", "General");

		_fastLength = Param(nameof(FastLength), 12)
			.SetDisplay("Fast EMA", "MACD fast period.", "Indicators");

		_slowLength = Param(nameof(SlowLength), 26)
			.SetDisplay("Slow EMA", "MACD slow period.", "Indicators");

		_emaLength = Param(nameof(EmaLength), 50)
			.SetDisplay("EMA Length", "Trend filter.", "Indicators");

		_atrLength = Param(nameof(AtrLength), 14)
			.SetDisplay("ATR Length", "ATR period.", "Indicators");
	}

	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	public int FastLength
	{
		get => _fastLength.Value;
		set => _fastLength.Value = value;
	}

	public int SlowLength
	{
		get => _slowLength.Value;
		set => _slowLength.Value = value;
	}

	public int EmaLength
	{
		get => _emaLength.Value;
		set => _emaLength.Value = value;
	}

	public int AtrLength
	{
		get => _atrLength.Value;
		set => _atrLength.Value = value;
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();

		_prevMacd = 0;
		_entryPrice = 0;
	}

		protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		_prevMacd = 0;
		_entryPrice = 0;

		var fastEma = new ExponentialMovingAverage { Length = FastLength };
		var slowEma = new ExponentialMovingAverage { Length = SlowLength };
		var ema = new ExponentialMovingAverage { Length = EmaLength };
		var atr = new AverageTrueRange { Length = AtrLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fastEma, slowEma, ema, atr, ProcessCandle)
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, ema);
			DrawOwnTrades(area);
		}
	}

	private void ProcessCandle(ICandleMessage candle, decimal fastVal, decimal slowVal, decimal emaVal, decimal atrVal)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (atrVal <= 0)
			return;

		var macd = fastVal - slowVal;
		var close = candle.ClosePrice;

		if (_prevMacd == 0)
		{
			_prevMacd = macd;
			return;
		}

		if (Position > 0)
		{
			if (close >= _entryPrice + atrVal * 3m || close <= _entryPrice - atrVal * 2m || (macd < 0 && _prevMacd >= 0))
			{
				SellMarket();
				_entryPrice = 0;
			}
		}
		else if (Position < 0)
		{
			if (close <= _entryPrice - atrVal * 3m || close >= _entryPrice + atrVal * 2m || (macd > 0 && _prevMacd <= 0))
			{
				BuyMarket();
				_entryPrice = 0;
			}
		}

		if (Position == 0)
		{
			if (macd > 0 && _prevMacd <= 0 && close > emaVal)
			{
				_entryPrice = close;
				BuyMarket();
			}
			else if (macd < 0 && _prevMacd >= 0 && close < emaVal)
			{
				_entryPrice = close;
				SellMarket();
			}
		}

		_prevMacd = macd;
	}
}