FiveMinuteRsiCciStrategy ist ein StockSharp-Port des MetaTrader 4-Expertenberaters 5Mins Rsi Cci EA.mq4. Das ursprüngliche Skript handelt Fünf-Minuten-Kerzen, indem es einen RSI-Schwellenwertdurchschnitt mit einem geglätteten/EMA-Gleitenden-Durchschnitts-Filter und der Polarität von zwei CCI-Indikatoren kombiniert. Die C#-Version behält die gleiche Entscheidungslogik bei, während sie das übergeordnete API von StockSharp für Datenabonnements, Indikatorbindung und Risikomanagement verwendet.
Handelslogik
Abonnieren Sie den konfigurierten Kerzentyp (standardmäßig fünfminütiger Zeitrahmen) und aktualisieren Sie fünf Indikatoren in Echtzeit: RSI, ein geglätteter MA des Eröffnungspreises, ein EMA des Eröffnungspreises sowie schnelle und langsame CCIs, die aus typischen Preisen berechnet werden.
Jede fertige Kerze wird nur dann ausgewertet, wenn keine Position offen ist und die aktuelle Geld-/Briefspanne unter MaxSpreadPoints liegt (umgerechnet in Preiseinheiten).
Ein langes Signal erfordert:
der geglättete MA über dem EMA,
die RSI-Kreuzung nach oben durch BullishRsiLevel zwischen der vorherigen und der aktuellen Kerze,
beide CCI-Werte über Null.
Ein kurzes Signal erfordert die umgekehrten Bedingungen (geglätteter MA unter EMA, RSI kreuzt nach unten durch BearishRsiLevel, beide CCIs unter Null).
Das Ordervolumen reproduziert die dynamische Positionsgröße des EA: LotCoefficient × sqrt(Equity / EquityDivisor) wird auf den Volumenschritt des Instruments gerundet und durch VolumeMin/VolumeMax eingeschränkt.
Die Schutzlogik wird von StartProtection verwaltet, das Stop-Loss-, Take-Profit- und Trailing-Stop-Distanzen hinzufügt, die aus MetaTrader Punkten in absolute Preisversätze umgewandelt werden.
Parameter
Parameter
Standard
Beschreibung
CandleType
TimeSpan.FromMinutes(5).TimeFrame()
Zeitrahmen für Indikatoraktualisierungen und Signalauswertung.
RsiPeriod
14
Anzahl der Kerzen, die in der RSI-Berechnung verwendet werden.
FastSmmaPeriod
2
Zeitraum des schnell geglätteten gleitenden Durchschnitts, der auf die Eröffnungspreise angewendet wird.
SlowEmaPeriod
6
Zeitraum der langsamen EMA, angewendet auf die Eröffnungspreise.
FastCciPeriod
34
Zeitraum des Fastens CCI, berechnet aus dem typischen Preis (H+L+C)/3.
SlowCciPeriod
175
Zeitraum des langsamen CCI, berechnet aus dem typischen Preis.
BullishRsiLevel
55
RSI Schwellenwert, der nach oben überschritten werden muss, um einen langen Eintrag zu aktivieren.
BearishRsiLevel
45
RSI Schwellenwert, der nach unten überschritten werden muss, um einen kurzen Eintrag zu aktivieren.
StopLossPoints
60
Stop-Loss-Distanz in MetaTrader Punkten (umgerechnet in absoluten Preis). Zum Deaktivieren auf 0 setzen.
TakeProfitPoints
0
Take-Profit-Distanz in MetaTrader Punkten. Zero behält das ursprüngliche EA-Verhalten bei (kein TP).
TrailingStopPoints
20
Trailing-Stop-Distanz in MetaTrader Punkten. Null deaktiviert das Nachziehen.
LotCoefficient
0.01
Basiskoeffizient, der in der dynamischen Positionsgrößenformel verwendet wird.
EquityDivisor
10
Teiler innerhalb der Quadratwurzel für die auf Eigenkapital basierende Dimensionierung (sqrt(Equity / EquityDivisor)).
MaxSpreadPoints
18
Maximal zulässiger Spread (in MetaTrader Punkten). Aufträge werden übersprungen, bis sich der Spread verringert.
Notizen
Der Spread-Filter basiert auf Daten der Ebene 1; Wenn die besten Geld-/Briefkurse nicht verfügbar sind, wartet die Strategie, bevor neue Positionen eröffnet werden.
Die Punkt-zu-Preis-Umrechnung wird automatisch um PriceStep und die Instrumentengenauigkeit skaliert (5/3-Dezimalinstrumente multiplizieren den Schritt mit 10), um den Point-Wert von MetaTrader widerzuspiegeln.
Stops und Trailing werden über die integrierte Schutz-Engine von StockSharp mit Marktausstiegen verwaltet, was der Verwendung von Marktaufträgen für Trailing-Stop-Updates durch EA entspricht.
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()