Ver en GitHub

Estrategia Up3x1 Krohabor D

Descripción general

Esta estrategia utiliza tres medias móviles simples (rápida, media, lenta) para identificar la dirección del tendencia. Se abre una posición larga cuando la MA rápida cruza por encima de la MA media y tanto la MA rápida como la MA media están por encima de la MA lenta en las barras actual y anterior. Se abre una posición corta cuando la MA rápida cruza por debajo de la MA media y tanto la MA rápida como la MA media están por debajo de la MA lenta en las barras actual y anterior.

Las posiciones se protegen con niveles de take profit, stop loss y trailing stop opcional. Las órdenes se ejecutan a precios de mercado.

Parámetros

  • Volume – tamaño de la orden.
  • Fast Period – período de la SMA rápida.
  • Middle Period – período de la SMA media.
  • Slow Period – período de la SMA lenta.
  • Take Profit – distancia al objetivo de beneficio en unidades de precio.
  • Stop Loss – distancia al stop de protección en unidades de precio.
  • Trailing Stop – distancia para la activación del trailing stop en unidades de precio.
  • Candle Type – marco temporal de las velas usadas para los cálculos.

Señales

  • Compra – la MA rápida cruza por encima de la MA media y ambas MAs permanecen por encima de la MA lenta.
  • Venta – la MA rápida cruza por debajo de la MA media y ambas MAs permanecen por debajo de la MA lenta.

Protecciones

  • Los niveles de take profit y stop loss se establecen en la entrada.
  • Cuando está habilitado, el trailing stop mueve el stop de protección en la dirección de la operación a medida que el precio avanza.

Notas

Esta es una conversión directa de la estrategia MQL original a StockSharp usando la API de alto nivel e indicadores integrados.

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>
/// Three moving averages crossover strategy.
/// </summary>
public class Up3x1KrohaborDStrategy : Strategy
{
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _middlePeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevFast;
	private decimal _prevMiddle;
	private bool _isInitialized;

	public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
	public int MiddlePeriod { get => _middlePeriod.Value; set => _middlePeriod.Value = value; }
	public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public Up3x1KrohaborDStrategy()
	{
		_fastPeriod = Param(nameof(FastPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("Fast Period", "Fast EMA period", "MA Settings");

		_middlePeriod = Param(nameof(MiddlePeriod), 26)
			.SetGreaterThanZero()
			.SetDisplay("Middle Period", "Middle EMA period", "MA Settings");

		_slowPeriod = Param(nameof(SlowPeriod), 50)
			.SetGreaterThanZero()
			.SetDisplay("Slow Period", "Slow EMA period", "MA Settings");

		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Type of candles", "General");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
		=> [(Security, CandleType)];

	protected override void OnReseted()
	{
		base.OnReseted();
		_prevFast = 0;
		_prevMiddle = 0;
		_isInitialized = false;
	}

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

		var fastMa = new ExponentialMovingAverage { Length = FastPeriod };
		var middleMa = new ExponentialMovingAverage { Length = MiddlePeriod };
		var slowMa = new ExponentialMovingAverage { Length = SlowPeriod };

		SubscribeCandles(CandleType)
			.Bind(fastMa, middleMa, slowMa, ProcessCandle)
			.Start();
	}

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

		if (!_isInitialized)
		{
			_prevFast = fast;
			_prevMiddle = middle;
			_isInitialized = true;
			return;
		}

		var crossUp = _prevFast <= _prevMiddle && fast > middle;
		var crossDown = _prevFast >= _prevMiddle && fast < middle;

		_prevFast = fast;
		_prevMiddle = middle;

		if (crossUp && Position <= 0)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
		}
		else if (crossDown && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
		}
	}
}