FiveMinuteRsiCciStrategy es un puerto StockSharp del asesor experto MetaTrader 4 5Mins Rsi Cci EA.mq4. El script original intercambia velas de cinco minutos combinando un cruce de umbral RSI con un filtro de media móvil suavizado/EMA y la polaridad de dos indicadores CCI. La versión C# mantiene la misma lógica de decisión mientras utiliza el nivel alto API de StockSharp para suscripciones de datos, vinculación de indicadores y gestión de riesgos.
Lógica comercial
Suscríbase al tipo de vela configurado (período de tiempo de cinco minutos de forma predeterminada) y actualice cinco indicadores en tiempo real: RSI, un MA suavizado del precio de apertura, un EMA del precio de apertura, además de CCI rápidos y lentos calculados a partir de precios típicos.
Cada vela terminada se evalúa solo cuando no hay ninguna posición abierta y el diferencial de oferta/demanda actual es inferior a MaxSpreadPoints (convertido a unidades de precio).
Una señal larga requiere:
el MA suavizado por encima del EMA,
el RSI cruzando hacia arriba a través de BullishRsiLevel entre la vela anterior y la actual,
ambos valores CCI superiores a cero.
Una señal corta requiere condiciones inversas (MA suavizada por debajo de EMA, RSI cruzando hacia abajo a través de BearishRsiLevel, ambos CCI por debajo de cero).
El volumen de la orden reproduce el tamaño de posición dinámica del EA: LotCoefficient × sqrt(Equity / EquityDivisor) redondeado al paso de volumen del instrumento y restringido por VolumeMin/VolumeMax.
La lógica de protección es manejada por StartProtection, que adjunta distancias de stop-loss, take-profit y trailing-stop convertidas de MetaTrader puntos a compensaciones de precios absolutos.
Parámetros
Parámetro
Predeterminado
Descripción
CandleType
TimeSpan.FromMinutes(5).TimeFrame()
Plazo utilizado para las actualizaciones de indicadores y la evaluación de señales.
RsiPeriod
14
Número de velas utilizadas en el cálculo RSI.
FastSmmaPeriod
2
Período de media móvil suavizada rápida aplicada a los precios de apertura.
SlowEmaPeriod
6
Período de la EMA lenta aplicada a los precios de apertura.
FastCciPeriod
34
Periodo del rápido CCI computado a partir del precio típico (H+L+C)/3.
SlowCciPeriod
175
Periodo del CCI lento calculado a partir del precio típico.
BullishRsiLevel
55
RSI umbral que se debe cruzar hacia arriba para armar una entrada larga.
BearishRsiLevel
45
RSI umbral que se debe cruzar hacia abajo para armar una entrada corta.
StopLossPoints
60
Distancia de stop-loss en MetaTrader puntos (convertida a precio absoluto). Establezca en 0 para desactivar.
TakeProfitPoints
0
Distancia de obtención de beneficios en MetaTrader puntos. Zero mantiene el comportamiento original EA (sin TP).
TrailingStopPoints
20
Distancia del trailing-stop en MetaTrader puntos. Zero desactiva el seguimiento.
LotCoefficient
0.01
Coeficiente base utilizado en la fórmula de dimensionamiento de posición dinámica.
EquityDivisor
10
Divisor dentro de la raíz cuadrada para el tamaño basado en acciones (sqrt(Equity / EquityDivisor)).
MaxSpreadPoints
18
Spread máximo permitido (en MetaTrader puntos). Las órdenes se omiten hasta que el diferencial se reduce.
Notas
El filtro de dispersión se basa en datos de nivel 1; Si las mejores cotizaciones de oferta/demanda no están disponibles, la estrategia espera antes de abrir nuevas posiciones.
La conversión de punto a precio escala automáticamente en PriceStep y la precisión del instrumento (5/3 instrumentos decimales multiplican el paso por 10) para reflejar el valor Point de MetaTrader.
Las paradas y el seguimiento se gestionan a través del motor de protección integrado de StockSharp con salidas de mercado, lo que coincide con el uso de órdenes de mercado por parte de EA para las actualizaciones de las paradas de seguimiento.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Five Minute RSI CCI strategy: RSI momentum with CCI trend confirmation.
/// Buys when RSI above level and CCI positive, sells when RSI below level and CCI negative.
/// </summary>
public class FiveMinuteRsiCciStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<int> _cciPeriod;
private readonly StrategyParam<decimal> _bullishLevel;
private readonly StrategyParam<decimal> _bearishLevel;
private bool _wasBullish;
private bool _hasPrevSignal;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public int CciPeriod { get => _cciPeriod.Value; set => _cciPeriod.Value = value; }
public decimal BullishLevel { get => _bullishLevel.Value; set => _bullishLevel.Value = value; }
public decimal BearishLevel { get => _bearishLevel.Value; set => _bearishLevel.Value = value; }
public FiveMinuteRsiCciStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI period", "Indicators");
_cciPeriod = Param(nameof(CciPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("CCI Period", "CCI period", "Indicators");
_bullishLevel = Param(nameof(BullishLevel), 55m)
.SetDisplay("Bullish RSI Level", "RSI above this for buy", "Signals");
_bearishLevel = Param(nameof(BearishLevel), 45m)
.SetDisplay("Bearish RSI Level", "RSI below this for sell", "Signals");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_wasBullish = false;
_hasPrevSignal = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrevSignal = false;
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var cci = new CommodityChannelIndex { Length = CciPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(rsi, cci, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsiValue, decimal cciValue)
{
if (candle.State != CandleStates.Finished) return;
var isBullish = rsiValue > BullishLevel && cciValue > 0;
if (_hasPrevSignal && isBullish != _wasBullish)
{
if (isBullish && Position <= 0)
BuyMarket();
else if (!isBullish && rsiValue < BearishLevel && cciValue < 0 && Position >= 0)
SellMarket();
}
_wasBullish = isBullish;
_hasPrevSignal = true;
}
}
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 RelativeStrengthIndex, CommodityChannelIndex
from StockSharp.Algo.Strategies import Strategy
class five_minute_rsi_cci_strategy(Strategy):
def __init__(self):
super(five_minute_rsi_cci_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(30)))
self._rsi_period = self.Param("RsiPeriod", 14)
self._cci_period = self.Param("CciPeriod", 14)
self._bullish_level = self.Param("BullishLevel", 55.0)
self._bearish_level = self.Param("BearishLevel", 45.0)
self._was_bullish = False
self._has_prev_signal = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def RsiPeriod(self):
return self._rsi_period.Value
@RsiPeriod.setter
def RsiPeriod(self, value):
self._rsi_period.Value = value
@property
def CciPeriod(self):
return self._cci_period.Value
@CciPeriod.setter
def CciPeriod(self, value):
self._cci_period.Value = value
@property
def BullishLevel(self):
return self._bullish_level.Value
@BullishLevel.setter
def BullishLevel(self, value):
self._bullish_level.Value = value
@property
def BearishLevel(self):
return self._bearish_level.Value
@BearishLevel.setter
def BearishLevel(self, value):
self._bearish_level.Value = value
def OnReseted(self):
super(five_minute_rsi_cci_strategy, self).OnReseted()
self._was_bullish = False
self._has_prev_signal = False
def OnStarted2(self, time):
super(five_minute_rsi_cci_strategy, self).OnStarted2(time)
self._has_prev_signal = False
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiPeriod
cci = CommodityChannelIndex()
cci.Length = self.CciPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(rsi, cci, self._process_candle).Start()
def _process_candle(self, candle, rsi_value, cci_value):
if candle.State != CandleStates.Finished:
return
is_bullish = float(rsi_value) > self.BullishLevel and float(cci_value) > 0
if self._has_prev_signal and is_bullish != self._was_bullish:
if is_bullish and self.Position <= 0:
self.BuyMarket()
elif not is_bullish and float(rsi_value) < self.BearishLevel and float(cci_value) < 0 and self.Position >= 0:
self.SellMarket()
self._was_bullish = is_bullish
self._has_prev_signal = True
def CreateClone(self):
return five_minute_rsi_cci_strategy()