Esta estrategia es una conversión StockSharp del robot MetaTrader "CCI-Expert" original. Utiliza el indicador Commodity Channel Index (CCI) en un único período de tiempo y mantiene la lógica estrictamente secuencial: la estrategia espera tres velas completas antes de decidir abrir o cerrar una posición.
Lógica de trading
Suscríbete a la serie de velas configuradas y calcula un CCI con el periodo elegido.
Evalúe los últimos tres valores CCI terminados:
Configuración larga: los valores CCI actual y anterior están por encima de +1, mientras que el segundo valor anterior estaba por debajo de +1.
Configuración breve: los valores CCI actual y anterior están por debajo de +1, mientras que el segundo valor anterior estaba por encima de +1.
Abra solo una posición de mercado a la vez cuando no haya ninguna posición activa y el filtro de diferencial permita operar.
Cierre una posición existente solo si aparece la señal opuesta y la operación ya es rentable (el precio de cierre es mejor que el precio de entrada).
Gestión del riesgo
La estrategia puede utilizar un lote fijo o calcular el volumen a partir del porcentaje de riesgo y la distancia de stop-loss configurada.
StartProtection coloca automáticamente rangos de stop-loss y take-profit en los puntos de precio.
Un filtro de diferencial opcional bloquea el comercio hasta que la diferencia actual entre oferta y demanda esté por debajo del umbral MaxSpreadPoints.
Parámetros
Parámetro
Descripción
Predeterminado
FixedVolume
Tamaño de pedido fijo. Establezca en cero para activar el dimensionamiento basado en el riesgo.
0.1
RiskPercent
Porcentaje del valor de la cartera actual utilizado para dimensionar los pedidos cuando FixedVolume es cero.
0
TakeProfitPoints
Distancia de obtención de beneficios medida en puntos de precio.
150
StopLossPoints
Distancia de stop-loss medida en puntos de precio.
600
MaxSpreadPoints
Spread máximo permitido (en puntos de precio). Zero desactiva el filtro.
30
CciPeriod
Período retrospectivo del indicador CCI.
14
CandleType
Marco temporal de las velas procesadas por la estrategia.
velas de 15 minutos
Notas
El umbral CCI permanece constante en +1 y -1 al igual que la fuente MQL, por lo que las operaciones se activan solo después de un patrón claro de tres pasos.
Debido a que el tamaño del volumen basado en el riesgo depende de los metadatos del instrumento (PriceStep, StepPrice, VolumeStep, etc.), asegúrese de que esos valores estén disponibles en la placa conectada.
La estrategia dibuja velas, la línea del indicador CCI y ejecuta operaciones en el gráfico para facilitar la depuración visual.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// CCI Expert strategy: CCI crossover with level-based signals.
/// Buys when CCI crosses above +1 from below, sells when crosses below -1 from above.
/// </summary>
public class CciExpertStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _cciPeriod;
private decimal? _prevCci;
private decimal? _prevPrevCci;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int CciPeriod { get => _cciPeriod.Value; set => _cciPeriod.Value = value; }
public CciExpertStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(15).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_cciPeriod = Param(nameof(CciPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("CCI Period", "CCI period", "Indicators");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevCci = null;
_prevPrevCci = null;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevCci = null;
_prevPrevCci = null;
var cci = new CommodityChannelIndex { Length = CciPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(cci, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal cciValue)
{
if (candle.State != CandleStates.Finished) return;
if (_prevCci is decimal prev && _prevPrevCci is decimal prev2)
{
// Long: CCI stayed above +100 for 2 bars while prior bar was below
var longSignal = cciValue > 100m && prev > 100m && prev2 < 100m;
// Short: CCI stayed below -100 for 2 bars while prior bar was above
var shortSignal = cciValue < -100m && prev < -100m && prev2 > -100m;
if (longSignal && Position <= 0)
BuyMarket();
else if (shortSignal && Position >= 0)
SellMarket();
}
_prevPrevCci = _prevCci;
_prevCci = cciValue;
}
}
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 cci_expert_strategy(Strategy):
"""
CCI Expert strategy: CCI crossover with level-based signals.
Buys when CCI stays above +100 for 2 bars, sells when below -100 for 2 bars.
"""
def __init__(self):
super(cci_expert_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(15))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._cci_period = self.Param("CciPeriod", 14) \
.SetDisplay("CCI Period", "CCI period", "Indicators")
self._prev_cci = None
self._prev_prev_cci = None
@property
def candle_type(self):
return self._candle_type.Value
@candle_type.setter
def candle_type(self, value):
self._candle_type.Value = value
def OnReseted(self):
super(cci_expert_strategy, self).OnReseted()
self._prev_cci = None
self._prev_prev_cci = None
def OnStarted2(self, time):
super(cci_expert_strategy, self).OnStarted2(time)
self._prev_cci = None
self._prev_prev_cci = None
cci = CommodityChannelIndex()
cci.Length = self._cci_period.Value
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(cci, self.on_process).Start()
def on_process(self, candle, cci_value):
if candle.State != CandleStates.Finished:
return
if self._prev_cci is not None and self._prev_prev_cci is not None:
long_signal = cci_value > 100 and self._prev_cci > 100 and self._prev_prev_cci < 100
short_signal = cci_value < -100 and self._prev_cci < -100 and self._prev_prev_cci > -100
if long_signal and self.Position <= 0:
self.BuyMarket()
elif short_signal and self.Position >= 0:
self.SellMarket()
self._prev_prev_cci = self._prev_cci
self._prev_cci = cci_value
def CreateClone(self):
return cci_expert_strategy()