Ver en GitHub

Estrategia C-Factor HLH4 Solo Compra

Esta estrategia es una traducción en C# del asesor experto MQL original C_Factor_HLH4_buy_only. Demuestra cómo portar estrategias de MetaTrader a la API de alto nivel de StockSharp.

Lógica de la estrategia

  • Utiliza velas de marco temporal de cuatro horas.
  • Abre una posición larga cuando la vela actual cierra por encima del máximo de la vela anterior.
  • Sale de la posición larga cuando el precio de cierre:
    • supera el mínimo de la vela anterior en 100 ticks, o
    • cae por debajo del máximo de la vela anterior en 20 ticks.
  • La gestión del riesgo se maneja con distancias de stop-loss y take-profit configurables.
  • El volumen de la orden se calcula a partir del porcentaje del capital de la cuenta arriesgado por operación.

Parámetros

Nombre Descripción
StopLoss Distancia en ticks para el stop de protección.
TakeProfit Distancia en ticks para el objetivo de beneficio.
RiskPercent Porcentaje del capital de la cuenta arriesgado en cada operación.
CandleType Tipo y marco temporal de la vela para el análisis (por defecto: velas de 4 horas).

Notas

La estrategia opera solo en largo y está diseñada con fines educativos. Ajuste los parámetros y la configuración de riesgo antes de usarla en trading real.

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>
/// C Factor HLH4 buy-only strategy.
/// Buys when close breaks above previous high, sells on EMA cross.
/// </summary>
public class CFactorHlh4BuyOnlyStrategy : Strategy
{
	private readonly StrategyParam<int> _emaPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevHigh;
	private decimal _prevLow;
	private bool _hasPrev;

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

	public CFactorHlh4BuyOnlyStrategy()
	{
		_emaPeriod = Param(nameof(EmaPeriod), 20)
			.SetGreaterThanZero()
			.SetDisplay("EMA Period", "EMA period for trend filter", "Indicators");

		_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();
		_prevHigh = 0;
		_prevLow = 0;
		_hasPrev = false;
	}

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

		var ema = new ExponentialMovingAverage { Length = EmaPeriod };

		SubscribeCandles(CandleType)
			.Bind(ema, ProcessCandle)
			.Start();
	}

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

		if (!_hasPrev)
		{
			_prevHigh = candle.HighPrice;
			_prevLow = candle.LowPrice;
			_hasPrev = true;
			return;
		}

		var close = candle.ClosePrice;

		if (close > _prevHigh && Position <= 0 && close > emaVal)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
		}
		else if (close < _prevLow && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
		}

		_prevHigh = candle.HighPrice;
		_prevLow = candle.LowPrice;
	}
}