Ver en GitHub

Estrategia Sunil BB Blast con Heikin Ashi

Combina la ruptura de Bandas de Bollinger con la confirmación de velas Heikin Ashi.

La estrategia espera una ruptura de las Bandas de Bollinger alineada con la dirección de la Heikin Ashi anterior y la vela estándar. Las posiciones utilizan la banda opuesta como stop y un objetivo basado en la relación riesgo-recompensa.

Detalles

  • Criterios de entrada: El precio rompe las Bandas de Bollinger con la Heikin Ashi anterior y la vela en la misma dirección.
  • Largo/Corto: Configurable mediante Direction.
  • Criterios de salida: Toma de ganancias o stop-loss basado en las bandas.
  • Stops: Banda de Bollinger y relación riesgo/recompensa.
  • Valores predeterminados:
    • BollingerPeriod = 19
    • BollingerMultiplier = 2m
    • RiskRewardRatio = 1m
    • CandleType = TimeSpan.FromMinutes(5)
    • Direction = TradeDirection.Both
    • SessionBegin = 09:20:00
    • SessionEnd = 15:00:00
  • Filtros:
    • Categoría: Tendencia
    • Dirección: Ambos
    • Indicadores: Bollinger, HeikinAshi
    • Stops: Sí
    • Complejidad: Básico
    • Marco temporal: Intradía (5m)
    • 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>
/// Sunil BB Blast Heikin Ashi strategy using EMA crossover.
/// </summary>
public class SunilBbBlastHeikinAshiStrategy : Strategy
{
	private readonly StrategyParam<int> _slowLength;
	private readonly StrategyParam<DataType> _candleType;

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

	public SunilBbBlastHeikinAshiStrategy()
	{
		_slowLength = Param(nameof(SlowLength), 40)
			.SetGreaterThanZero()
			.SetDisplay("Slow Length", "Slow EMA period", "General");

		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candle type", "General");
	}

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

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		var fast = new ExponentialMovingAverage { Length = 14 };
		var slow = new ExponentialMovingAverage { Length = SlowLength };
		var prevF = 0m; var prevS = 0m; var init = false;
		var lastSignal = DateTimeOffset.MinValue;
		var cooldown = TimeSpan.FromMinutes(360);
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fast, slow, (candle, f, s) =>
		{
			if (candle.State != CandleStates.Finished) return;
			if (!fast.IsFormed || !slow.IsFormed) return;
			if (!init) { prevF = f; prevS = s; init = true; return; }
			if (candle.OpenTime - lastSignal >= cooldown)
			{
				if (prevF <= prevS && f > s && Position <= 0) { BuyMarket(); lastSignal = candle.OpenTime; }
				else if (prevF >= prevS && f < s && Position >= 0) { SellMarket(); lastSignal = candle.OpenTime; }
			}
			prevF = f; prevS = s;
		}).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
	}
}