Ver en GitHub

Estrategia ABCWsCci

Descripción general

La Estrategia AbcWsCci combina dos patrones clásicos de inversión de velas japonesas (Tres soldados blancos y Tres cuervos negros) con el indicador Commodity Channel Index (CCI) para confirmación. El sistema escanea velas terminadas, mide el tamaño del cuerpo en relación con una línea base de promedio móvil y abre operaciones solo cuando el fuerte impulso de múltiples velas se alinea con CCI extremos. Las salidas de posición se activan cuando el CCI abandona las zonas extremas, lo que indica que el impulso se está desvaneciendo.

Lógica de trading

  • Mantenga un promedio móvil de los tamaños del cuerpo de las velas para calificar velas "largas".
  • Detecte el patrón de los Tres Soldados Blancos (tres velas alcistas fuertes consecutivas con puntos medios ascendentes).
  • Detecte el patrón de los Tres Cuervos Negros (tres velas bajistas fuertes consecutivas con puntos medios descendentes).
  • Confirme las entradas alcistas con CCI cayendo por debajo de -50 y las entradas bajistas con CCI subiendo por encima de 50.
  • Cierre las posiciones largas cuando CCI cruce los niveles -80 o 80, y cierre las posiciones cortas en las condiciones reflejadas.

Parámetros

Nombre Descripción Predeterminado
CciPeriod Longitud del indicador CCI utilizado para la confirmación. 37
BodyAveragePeriod Número de velas en la media móvil que define el tamaño corporal mínimo "fuerte". 13
CandleType Marco de tiempo de vela utilizado para la detección de patrones. 1 hora

Indicadores

  • Índice de canales de productos básicos (CCI): Evalúa los extremos del impulso para señales de confirmación y salida.
  • Promedio Móvil Simple de cuerpos de velas: Establece el tamaño mínimo de vela requerido para un patrón válido.

Gestión de Puestos

  • Ingrese largo cuando se formen Tres Soldados Blancos y CCI esté por debajo de -50 mientras no haya ninguna posición larga activa.
  • Ingrese short cuando se formen Three Black Crows y CCI esté por encima de 50 mientras no haya ninguna posición corta activa.
  • Salga de las posiciones largas cuando CCI abandone la banda -80/80, lo que indica que el impulso alcista se ha agotado.
  • Salga de las posiciones cortas cuando CCI abandone la banda +80/-80, lo que indica una pérdida de impulso bajista.

Notas de uso

  • La estrategia está basada en eventos: sólo se procesan velas completamente completadas.
  • Funciona mejor en instrumentos de tendencia donde el impulso de múltiples velas combinado con los extremos del oscilador proporciona señales confiables.
  • Considere combinarlo con reglas adicionales de gestión de riesgos (stop-loss, tamaño de posición) dependiendo de su entorno comercial.
namespace StockSharp.Samples.Strategies;

using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;

/// <summary>
/// ABC WS CCI strategy: 3 white soldiers / 3 black crows pattern with CCI confirmation.
/// Buys after 3 bullish candles with CCI below 100, sells after 3 bearish candles with CCI above -100.
/// </summary>
public class AbcWsCciStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _cciPeriod;
	private readonly StrategyParam<int> _signalCooldownCandles;

	private int _bullCount;
	private int _bearCount;
	private int _candlesSinceTrade;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int CciPeriod { get => _cciPeriod.Value; set => _cciPeriod.Value = value; }
	public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }

	public AbcWsCciStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_cciPeriod = Param(nameof(CciPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("CCI Period", "CCI period for confirmation", "Indicators");
		_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 6)
			.SetGreaterThanZero()
			.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_bullCount = 0;
		_bearCount = 0;
		_candlesSinceTrade = SignalCooldownCandles;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_bullCount = 0;
		_bearCount = 0;
		_candlesSinceTrade = SignalCooldownCandles;
		var cci = new CommodityChannelIndex { Length = CciPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(cci, ProcessCandle).Start();
	}

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

		if (_candlesSinceTrade < SignalCooldownCandles)
			_candlesSinceTrade++;

		if (candle.ClosePrice > candle.OpenPrice)
		{
			_bullCount++;
			_bearCount = 0;
		}
		else if (candle.ClosePrice < candle.OpenPrice)
		{
			_bearCount++;
			_bullCount = 0;
		}
		else
		{
			_bullCount = 0;
			_bearCount = 0;
		}

		// Exit on CCI reversal
		if (Position > 0 && cci > 200 && _candlesSinceTrade >= SignalCooldownCandles)
		{
			SellMarket();
			_candlesSinceTrade = 0;
		}
		else if (Position < 0 && cci < -200 && _candlesSinceTrade >= SignalCooldownCandles)
		{
			BuyMarket();
			_candlesSinceTrade = 0;
		}

		// Entry on 3 soldiers/crows pattern
		if (_bullCount >= 3 && cci < 100 && Position <= 0 && _candlesSinceTrade >= SignalCooldownCandles)
		{
			BuyMarket();
			_bullCount = 0;
			_candlesSinceTrade = 0;
		}
		else if (_bearCount >= 3 && cci > -100 && Position >= 0 && _candlesSinceTrade >= SignalCooldownCandles)
		{
			SellMarket();
			_bearCount = 0;
			_candlesSinceTrade = 0;
		}
	}
}