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;
}
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import CommodityChannelIndex
from StockSharp.Algo.Strategies import Strategy
class abc_ws_cci_strategy(Strategy):
def __init__(self):
super(abc_ws_cci_strategy, self).__init__()
self._cci_period = self.Param("CciPeriod", 14) \
.SetDisplay("CCI Period", "CCI period for confirmation", "Indicators")
self._signal_cooldown = self.Param("SignalCooldownCandles", 6) \
.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading")
self._cci = None
self._bull_count = 0
self._bear_count = 0
self._candles_since_trade = 0
@property
def cci_period(self):
return self._cci_period.Value
@property
def signal_cooldown(self):
return self._signal_cooldown.Value
def OnReseted(self):
super(abc_ws_cci_strategy, self).OnReseted()
self._cci = None
self._bull_count = 0
self._bear_count = 0
self._candles_since_trade = self.signal_cooldown
def OnStarted2(self, time):
super(abc_ws_cci_strategy, self).OnStarted2(time)
self._cci = CommodityChannelIndex()
self._cci.Length = self.cci_period
self._bull_count = 0
self._bear_count = 0
self._candles_since_trade = self.signal_cooldown
subscription = self.SubscribeCandles(DataType.TimeFrame(TimeSpan.FromMinutes(60)))
subscription.Bind(self._cci, self._process_candle)
subscription.Start()
def _process_candle(self, candle, cci_value):
if candle.State != CandleStates.Finished:
return
if not self._cci.IsFormed:
return
cci_val = float(cci_value)
if self._candles_since_trade < self.signal_cooldown:
self._candles_since_trade += 1
close = float(candle.ClosePrice)
open_p = float(candle.OpenPrice)
if close > open_p:
self._bull_count += 1
self._bear_count = 0
elif close < open_p:
self._bear_count += 1
self._bull_count = 0
else:
self._bull_count = 0
self._bear_count = 0
if self.Position > 0 and cci_val > 200.0 and self._candles_since_trade >= self.signal_cooldown:
self.SellMarket()
self._candles_since_trade = 0
elif self.Position < 0 and cci_val < -200.0 and self._candles_since_trade >= self.signal_cooldown:
self.BuyMarket()
self._candles_since_trade = 0
if self._bull_count >= 3 and cci_val < 100.0 and self.Position <= 0 and self._candles_since_trade >= self.signal_cooldown:
self.BuyMarket()
self._bull_count = 0
self._candles_since_trade = 0
elif self._bear_count >= 3 and cci_val > -100.0 and self.Position >= 0 and self._candles_since_trade >= self.signal_cooldown:
self.SellMarket()
self._bear_count = 0
self._candles_since_trade = 0
def CreateClone(self):
return abc_ws_cci_strategy()