Die Basic RSI EA Template Strategy repliziert den MetaTrader 4 Expert Advisor „Basic Rsi EA Template.mq4“ (MQL/26750). Es beobachtet den Relative Strength Index (RSI) der ausgewählten Kerzenserie und reagiert, wenn sich die Dynamik in konfigurierbare überkaufte oder überverkaufte Zonen ausdehnt. Die StockSharp-Konvertierung behält den einfachen Ein-Positions-Workflow und die schützende Stop/Take-Logik des ursprünglichen Roboters bei und übernimmt gleichzeitig das High-Level-Abonnement API.
Strategielogik
Indikatoren
Relative Strength Index (RSI) mit einem konfigurierbaren Zeitraum, berechnet für den ausgewählten Kerzentyp.
Teilnahmebedingungen
Lange Einrichtung: Wenn RSI unter OversoldLevel fällt und die Strategie keine offene Position hat, sendet sie eine Marktkauforder für den konfigurierten OrderVolume.
Kurzes Setup: Wenn RSI über OverboughtLevel steigt und die Strategie keine offene Position hat, sendet sie einen Marktverkaufsauftrag für den konfigurierten OrderVolume.
Der Algorithmus arbeitet im Netting-Modus: Es kann immer nur eine Position existieren. Wenn eine Long-Position aktiv ist, wartet die Strategie darauf, dass sie geschlossen wird, bevor eine Short-Position eingegangen wird (und umgekehrt).
Ausstiegsbedingungen
Schutzstopp: StopLossPips wird anhand der Tick-Größe des Instruments in einen absoluten Preisabstand umgewandelt. Sobald der Preis um diesen Betrag zurückgeht, schließt die eingebaute Schutzmaschine die Position.
Gewinn mitnehmen: TakeProfitPips wird auf die gleiche Weise verarbeitet – wenn sich der Preis um die konfigurierte Distanz zu Ihren Gunsten bewegt, wird die Position mit Gewinn geschlossen.
Es gibt keinen zusätzlichen nachgestellten oder signalbasierten Exit. Die Strategie basiert ausschließlich auf Schutzabständen oder manuellen Eingriffen zum Ausstieg aus Trades und spiegelt das minimalistische Design der ursprünglichen Vorlage wider.
Umgang mit Risiken und Volumen
OrderVolume definiert den festen Betrag, der mit jeder Market-Order übermittelt wird (standardmäßig 0,01 Lots, entsprechend der MQL-Probe).
Bei der Strategie handelt es sich weder um eine Pyramide noch um eine Absicherung. Wenn ein schützender Stop oder Take-Profit den aktiven Handel schließt, wird der Algorithmus flach und wartet auf den nächsten RSI-Trigger.
Parameter
CandleType: Kerzenserie, die zur Signalgenerierung verwendet wird (Standard: 1-Minuten-Zeitrahmen).
RsiPeriod: Anzahl der Balken im Fenster RSI (Standard: 14).
OverboughtLevel: RSI Schwellenwert, der kurze Einträge zulässt (Standard: 70).
OversoldLevel: RSI Schwellenwert, der lange Einträge zulässt (Standard: 30).
StopLossPips: Stop-Distanz in Pips, umgerechnet in absolute Preiseinheiten (Standard: 30 Pips).
TakeProfitPips: Gewinnziel in Pips, umgerechnet in absolute Preiseinheiten (Standard: 20 Pips).
OrderVolume: festes Volumen für Marktaufträge (Standard: 0,01).
Implementierungshinweise
Verwendet SubscribeCandles(...).Bind(rsi, ProcessCandle), sodass Indikatorwerte ohne manuelle Pufferverwaltung direkt in die Verarbeitungsmethode einfließen.
CreateProtectionUnit stellt die Pip-Verarbeitung von MQL wieder her: Instrumente mit 3 oder 5 Dezimalstellen verwenden einen 10-fachen Multiplikator, um Pips Preisschritten zuzuordnen.
Alle Indikatorprüfungen werden für fertige Kerzen ausgeführt, um mehrere Orders auf demselben Balken zu vermeiden.
Bei der Konvertierung wird im Gegensatz zum Absicherungsmodus von MetaTrader ein Netting-Konto vorausgesetzt. Folglich schließen gegensätzliche Trades die aktuelle Position, anstatt mehrere Tickets zu erstellen.
Inline-Kommentare und Protokolle sind auf Englisch, um zukünftige Wartungsarbeiten zu erleichtern.
Nutzungstipps
Passen Sie CandleType an das Instrument und den Zeitrahmen an, mit dem Sie handeln möchten (z. B. wechseln Sie zu stündlichen Kerzen für Swing-Setups).
Passen Sie StopLossPips und TakeProfitPips so an, dass sie der Volatilität des Instruments entsprechen. Die Schutzabstände sind für die Risikokontrolle unerlässlich.
Kombinieren Sie die Strategie mit StockSharp Portfolio- oder Risikomodulen, wenn Sie ein erweitertes Geldmanagement benötigen, das über die Vorlagenlogik hinausgeht.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Basic RSI template: buys when RSI is oversold, sells when RSI is overbought.
/// </summary>
public class BasicRsiEaTemplateStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<decimal> _overboughtLevel;
private readonly StrategyParam<decimal> _oversoldLevel;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int RsiPeriod
{
get => _rsiPeriod.Value;
set => _rsiPeriod.Value = value;
}
public decimal OverboughtLevel
{
get => _overboughtLevel.Value;
set => _overboughtLevel.Value = value;
}
public decimal OversoldLevel
{
get => _oversoldLevel.Value;
set => _oversoldLevel.Value = value;
}
public BasicRsiEaTemplateStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI calculation period", "Indicators");
_overboughtLevel = Param(nameof(OverboughtLevel), 70m)
.SetDisplay("Overbought Level", "RSI overbought threshold", "Indicators");
_oversoldLevel = Param(nameof(OversoldLevel), 30m)
.SetDisplay("Oversold Level", "RSI oversold threshold", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
decimal? prevRsi = null;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(rsi, (candle, rsiValue) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (prevRsi.HasValue)
{
var crossBelowOversold = prevRsi.Value >= OversoldLevel && rsiValue < OversoldLevel;
var crossAboveOverbought = prevRsi.Value <= OverboughtLevel && rsiValue > OverboughtLevel;
if (crossBelowOversold && Position <= 0)
BuyMarket();
else if (crossAboveOverbought && Position >= 0)
SellMarket();
}
prevRsi = rsiValue;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, rsi);
DrawOwnTrades(area);
}
}
}
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 basic_rsi_ea_template_strategy(Strategy):
def __init__(self):
super(basic_rsi_ea_template_strategy, self).__init__()
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI calculation period", "Indicators")
self._overbought_level = self.Param("OverboughtLevel", 70.0) \
.SetDisplay("Overbought Level", "RSI overbought threshold", "Indicators")
self._oversold_level = self.Param("OversoldLevel", 30.0) \
.SetDisplay("Oversold Level", "RSI oversold threshold", "Indicators")
self._rsi = None
self._prev_rsi = None
@property
def rsi_period(self):
return self._rsi_period.Value
@property
def overbought_level(self):
return self._overbought_level.Value
@property
def oversold_level(self):
return self._oversold_level.Value
def OnReseted(self):
super(basic_rsi_ea_template_strategy, self).OnReseted()
self._rsi = None
self._prev_rsi = None
def OnStarted2(self, time):
super(basic_rsi_ea_template_strategy, self).OnStarted2(time)
self._rsi = RelativeStrengthIndex()
self._rsi.Length = self.rsi_period
subscription = self.SubscribeCandles(DataType.TimeFrame(TimeSpan.FromMinutes(30)))
subscription.Bind(self._rsi, self._process_candle)
subscription.Start()
def _process_candle(self, candle, rsi_value):
if candle.State != CandleStates.Finished:
return
if not self._rsi.IsFormed:
return
rsi = float(rsi_value)
if self._prev_rsi is not None:
cross_below_oversold = self._prev_rsi >= self.oversold_level and rsi < self.oversold_level
cross_above_overbought = self._prev_rsi <= self.overbought_level and rsi > self.overbought_level
if cross_below_oversold and self.Position <= 0:
self.BuyMarket()
elif cross_above_overbought and self.Position >= 0:
self.SellMarket()
self._prev_rsi = rsi
def CreateClone(self):
return basic_rsi_ea_template_strategy()