Die AMS ES RSI-Strategie repliziert das Verhalten des MetaTrader-Experten Expert_AMS_ES_RSI innerhalb von StockSharp. Es kombiniert Morgen-/Abendsternkerzenformationen mit einem Bestätigungsfilter für den Relative Strength Index (RSI). Long-Trades werden eröffnet, wenn ein bullischer Morgenstern erscheint, während RSI überverkaufte Bedingungen anzeigt. Short-Trades werden eingegangen, wenn sich in Verbindung mit einem überkauften RSI ein rückläufiger Abendstern bildet. Positionen werden geschlossen, wenn RSI wieder die konfigurierbaren Schwellenwerte überschreitet.
Marktannahmen
Funktioniert auf jedem Instrument, das normale OHLC-Kerzen erzeugt. Spot FX und Index-Futures waren die ursprünglichen Ziele des MQL-Experten.
Die Strategie erwartet eine reibungslose Preisbewegung, bei der japanische Candlestick-Muster sinnvoll sind. Extrem verrauschte Tick-Charts erzeugen möglicherweise keine zuverlässigen Signale.
Eingabelogik
Abonnieren Sie den konfigurierten Zeitrahmen (Standard: 1 Stunde) und warten Sie, bis drei vollständig geschlossene Kerzen vorhanden sind.
Berechnen Sie die durchschnittliche Körpergröße über die letzten BodyAveragePeriod-Kerzen (Standard: 3).
Erkennen Sie einen Morgenstern, wenn:
Kerze 3 ist stark bärisch (Open - Close größer als die durchschnittliche Körpergröße).
Kerze 2 hat einen kleinen realen Körper (weniger als die Hälfte des Durchschnitts) und Lücken unter Kerze 3.
Kerze 1 schließt über dem Mittelpunkt von Kerze 3.
Erkennen Sie einen Abendstern mit den symmetrischen rückläufigen Bedingungen.
Bestätigen Sie lange Einträge, wenn der aktuelle RSI-Wert unter LongEntryRsi liegt (Standard: 40). Bestätigen Sie kurze Einträge, wenn RSI über ShortEntryRsi liegt (Standard: 60).
Führen Sie Marktaufträge mit der Strategie Volume aus.
Exit-Logik
Schließen Sie Long-Positionen, wenn RSI durch UpperExitRsi (Standard: 70) oder LowerExitRsi (Standard: 30) nach unten kreuzt.
Schließen Sie Short-Positionen, wenn RSI die gleichen Niveaus nach oben kreuzt.
Es wird kein harter Stop-Loss oder Take-Profit angewendet. Das Risikomanagement muss extern oder durch Anpassung der Schwellenwerte erfolgen.
Parameter
Name
Beschreibung
Standard
Reichweite
CandleType
Datentyp, der die zu abonnierende Kerzenserie darstellt.
1-stündiger Zeitrahmen
Jeder unterstützte Kerzentyp
RsiPeriod
RSI Berechnungslänge.
47
Optimierbar (10–70)
BodyAveragePeriod
Anzahl der Kerzen, die zur Berechnung der durchschnittlichen Körpergröße verwendet werden, die für die Mustervalidierung erforderlich ist.
3
Optimierbar (2–6)
LongEntryRsi
Maximaler RSI-Wert, der lange Einträge zulässt.
40
Optimierbar (20–50)
ShortEntryRsi
Mindestwert RSI, der kurze Einträge zulässt.
60
Optimierbar (50–80)
LowerExitRsi
Untere Grenze, die beim Überschreiten nach oben Ausgänge auslöst.
30
Optimierbar (20–40)
UpperExitRsi
Obere Grenze, die beim Überschreiten nach unten Ausgänge auslöst.
70
Optimierbar (60–80)
Implementierungshinweise
Verwendet das StockSharp-High-Level-API mit automatischen Kerzenabonnements.
Verlässt sich ausschließlich auf die von Bind bereitgestellten Indikatorwerte und vermeidet manuelle GetValue-Aufrufe gemäß den Projektrichtlinien.
Behält nur einen minimalen Speicherverlauf (drei aktuelle Kerzen) zur Mustervalidierung bei.
Die Strategie ruft beim Start automatisch StartProtection() auf, um integrierte Sicherheitsmechanismen zu aktivieren.
Nutzungstipps
Hängen Sie die Strategie an ein Instrument/Portfolio-Paar an und stellen Sie sicher, dass die Kerzenserie über Ihren Connector verfügbar ist.
Passen Sie die RSI-Werte entsprechend der Vermögensvolatilität an. Höhere Schwellenwerte verringern die Anzahl der Trades, erhöhen jedoch die Bestätigungsqualität.
Kombinieren Sie es mit externen Positionsgrößenmodulen (z. B. risikobasiertes Volumen), um das feste Lotverhalten des Originals EA zu emulieren.
Stellen Sie beim Backtesting sicher, dass die Kerzendaten Lücken enthalten, damit die Sternmuster korrekt identifiziert werden können.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Morning/Evening Star + RSI strategy.
/// Buys on morning star with low RSI, sells on evening star with high RSI.
/// </summary>
public class AmsEsRsiStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<decimal> _rsiLow;
private readonly StrategyParam<decimal> _rsiHigh;
private ICandleMessage _prevCandle;
private ICandleMessage _prevPrevCandle;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public decimal RsiLow { get => _rsiLow.Value; set => _rsiLow.Value = value; }
public decimal RsiHigh { get => _rsiHigh.Value; set => _rsiHigh.Value = value; }
public AmsEsRsiStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI period", "Indicators");
_rsiLow = Param(nameof(RsiLow), 40m)
.SetDisplay("RSI Low", "RSI oversold threshold", "Signals");
_rsiHigh = Param(nameof(RsiHigh), 60m)
.SetDisplay("RSI High", "RSI overbought threshold", "Signals");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevCandle = null;
_prevPrevCandle = null;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevCandle = null;
_prevPrevCandle = null;
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(rsi, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsiValue)
{
if (candle.State != CandleStates.Finished) return;
if (_prevCandle != null && _prevPrevCandle != null)
{
var prevBody = Math.Abs(_prevCandle.ClosePrice - _prevCandle.OpenPrice);
var prevRange = _prevCandle.HighPrice - _prevCandle.LowPrice;
var isSmallBody = prevRange > 0 && prevBody < prevRange * 0.3m;
var firstBearish = _prevPrevCandle.OpenPrice > _prevPrevCandle.ClosePrice;
var currBullish = candle.ClosePrice > candle.OpenPrice;
var isMorningStar = firstBearish && isSmallBody && currBullish;
var firstBullish = _prevPrevCandle.ClosePrice > _prevPrevCandle.OpenPrice;
var currBearish = candle.OpenPrice > candle.ClosePrice;
var isEveningStar = firstBullish && isSmallBody && currBearish;
if (isMorningStar && rsiValue < RsiLow && Position <= 0)
BuyMarket();
else if (isEveningStar && rsiValue > RsiHigh && Position >= 0)
SellMarket();
}
_prevPrevCandle = _prevCandle;
_prevCandle = candle;
}
}
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
from StockSharp.Algo.Strategies import Strategy
class ams_es_rsi_strategy(Strategy):
def __init__(self):
super(ams_es_rsi_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5)))
self._rsi_period = self.Param("RsiPeriod", 14)
self._rsi_low = self.Param("RsiLow", 40.0)
self._rsi_high = self.Param("RsiHigh", 60.0)
self._prev_candle = None
self._prev_prev_candle = None
@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 RsiLow(self):
return self._rsi_low.Value
@RsiLow.setter
def RsiLow(self, value):
self._rsi_low.Value = value
@property
def RsiHigh(self):
return self._rsi_high.Value
@RsiHigh.setter
def RsiHigh(self, value):
self._rsi_high.Value = value
def OnReseted(self):
super(ams_es_rsi_strategy, self).OnReseted()
self._prev_candle = None
self._prev_prev_candle = None
def OnStarted2(self, time):
super(ams_es_rsi_strategy, self).OnStarted2(time)
self._prev_candle = None
self._prev_prev_candle = None
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(rsi, self._process_candle).Start()
def _process_candle(self, candle, rsi_value):
if candle.State != CandleStates.Finished:
return
rsi_val = float(rsi_value)
if self._prev_candle is not None and self._prev_prev_candle is not None:
prev_body = abs(float(self._prev_candle.ClosePrice) - float(self._prev_candle.OpenPrice))
prev_range = float(self._prev_candle.HighPrice) - float(self._prev_candle.LowPrice)
is_small_body = prev_range > 0 and prev_body < prev_range * 0.3
first_bearish = float(self._prev_prev_candle.OpenPrice) > float(self._prev_prev_candle.ClosePrice)
curr_bullish = float(candle.ClosePrice) > float(candle.OpenPrice)
is_morning_star = first_bearish and is_small_body and curr_bullish
first_bullish = float(self._prev_prev_candle.ClosePrice) > float(self._prev_prev_candle.OpenPrice)
curr_bearish = float(candle.OpenPrice) > float(candle.ClosePrice)
is_evening_star = first_bullish and is_small_body and curr_bearish
if is_morning_star and rsi_val < self.RsiLow and self.Position <= 0:
self.BuyMarket()
elif is_evening_star and rsi_val > self.RsiHigh and self.Position >= 0:
self.SellMarket()
self._prev_prev_candle = self._prev_candle
self._prev_candle = candle
def CreateClone(self):
return ams_es_rsi_strategy()