FiveMinuteRsiCciStrategy é uma porta StockSharp do consultor especialista MetaTrader 4 5Mins Rsi Cci EA.mq4. O script original negocia velas de cinco minutos combinando um cruzamento de limite RSI com um filtro de média móvel suavizado/EMA e a polaridade de dois indicadores CCI. A versão C# mantém a mesma lógica de decisão ao usar o API de alto nível do API para assinaturas de dados, vinculação de indicadores e gerenciamento de risco.
Lógica de negociação
Assine o tipo de vela configurado (período de cinco minutos por padrão) e atualize cinco indicadores em tempo real: RSI, um MA suavizado do preço de abertura, um EMA do preço de abertura, além de CCIs rápidos e lentos calculados a partir de preços típicos.
Cada vela finalizada é avaliada apenas quando nenhuma posição está aberta e o spread de compra/venda atual está abaixo de MaxSpreadPoints (convertido em unidades de preço).
Um sinal longo requer:
o MA suavizado acima de EMA,
o RSI cruzando para cima através de BullishRsiLevel entre a vela anterior e a atual,
ambos os valores CCI acima de zero.
Um sinal curto requer as condições inversas (MA suavizada abaixo de EMA, RSI cruzando para baixo através de BearishRsiLevel, ambos os CCIs abaixo de zero).
O volume do pedido reproduz o dimensionamento da posição dinâmica do EA: LotCoefficient × sqrt(Equity / EquityDivisor) arredondado para a etapa de volume do instrumento e limitado por VolumeMin/VolumeMax.
A lógica de proteção é tratada por StartProtection, que anexa distâncias de stop-loss, take-profit e trailing-stop convertidas de MetaTrader pontos em compensações de preço absoluto.
Parâmetros
Parâmetro
Padrão
Descrição
CandleType
TimeSpan.FromMinutes(5).TimeFrame()
Prazo usado para atualizações de indicadores e avaliação de sinais.
RsiPeriod
14
Número de velas usadas no cálculo RSI.
FastSmmaPeriod
2
Período da média móvel suavizada rápida aplicada aos preços de abertura.
SlowEmaPeriod
6
Período de lentidão EMA aplicado aos preços de abertura.
FastCciPeriod
34
Período do rápido CCI calculado a partir do preço típico (H+L+C)/3.
SlowCciPeriod
175
Período de lentidão CCI calculado a partir do preço típico.
BullishRsiLevel
55
RSI limite que deve ser ultrapassado para cima para armar uma entrada longa.
BearishRsiLevel
45
RSI limite que deve ser ultrapassado para baixo para armar uma entrada curta.
StopLossPoints
60
Distância stop-loss em MetaTrader pontos (convertido em preço absoluto). Defina como 0 para desativar.
TakeProfitPoints
0
Distância de lucro em MetaTrader pontos. Zero mantém o comportamento original EA (sem TP).
TrailingStopPoints
20
Distância do trailing-stop em MetaTrader pontos. Zero desativa o rastreamento.
LotCoefficient
0.01
Coeficiente base usado na fórmula de dimensionamento de posição dinâmica.
EquityDivisor
10
Divisor dentro da raiz quadrada para dimensionamento baseado em patrimônio (sqrt(Equity / EquityDivisor)).
MaxSpreadPoints
18
Spread máximo permitido (em MetaTrader pontos). Os pedidos são ignorados até que o spread diminua.
Notas
O filtro de propagação depende de dados de nível 1; se as melhores cotações de compra/venda não estiverem disponíveis, a estratégia espera antes de abrir novas posições.
A conversão ponto-preço é dimensionada automaticamente em PriceStep e a precisão do instrumento (5/3 instrumentos decimais multiplicam o passo por 10) para espelhar o valor Point de MetaTrader.
Stops e trailing são gerenciados por meio do mecanismo de proteção integrado do StockSharp com saídas de mercado, correspondendo ao uso de ordens de mercado do EA para atualizações de trailing stop.
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()