Die Strategie repliziert den MetaTrader-Expertenberater "Exp_SSL_NRTR_Tm_Plus" unter Verwendung der StockSharp-High-Level-Infrastruktur. Sie
abonniert einen einzigen Zeitrahmen, berechnet den SSL NRTR-Kanal mit einer konfigurierbaren Glättungsmethode und reagiert auf die Farb-
wechsel des Indikators. Long-Einstiege werden ausgelöst, wenn der Kanal bullisch wird, während Short-Einstiege bei
bärischen Übergängen auftreten. Die Implementierung bewahrt die ursprünglichen Risikokontrollen, optionale Handelsfilter und den timer-basierten Ausstieg.
Parameter
Gruppe
Parameter
Beschreibung
Trading
Money Management
Anteil des Portfolios (oder direkte Lots bei negativem Wert/Lot-Modus) zur Ordergrößenberechnung.
Trading
Margin Mode
Modus zur Umrechnung des Money-Management-Werts in eine Positionsgröße. Modi außer Lot werden mit portfoliobasierten Berechnungen approximiert.
Trading
Allow Long/Short Entries
Eröffnung von Positionen in der jeweiligen Richtung aktivieren oder deaktivieren.
Trading
Allow Long/Short Exits
Der Strategie erlauben, Positionen bei Indikatorumkehrungen in der jeweiligen Richtung zu schließen.
Risk
Stop Loss
Schutz-Stop-Abstand in Preisschritten. Die Strategie überwacht die Niveaus, anstatt native Stop-Orders zu platzieren.
Risk
Take Profit
Take-Profit-Abstand in Preisschritten.
Risk
Slippage
Informationsparameter aus dem Original-EA.
Risk
Use Time Exit
Den Timer aktivieren, der nach dem konfigurierten Haltezeitraum eine Flat-Position erzwingt.
Risk
Exit Minutes
Haltezeitraum in Minuten für den zeitbasierten Ausstieg.
Data
Candle Type
Arbeits-Zeitrahmen für Handel und Indikatorberechnungen.
Indicator
Smoothing Method
Gleitender Durchschnittstyp für den SSL NRTR-Kanal. Nicht unterstützte benutzerdefinierte Typen fallen auf EMA zurück.
Indicator
Length
Basisperiode des Glättungsalgorithmus.
Indicator
Phase
Hilfsparameter für adaptive Durchschnitte (T3, VIDYA, AMA).
Indicator
Signal Bar
Anzahl geschlossener Bars zum Zurückschauen bei der Auswertung von SSL-Farben.
Handelslogik
Den konfigurierten Zeitrahmen abonnieren und nur abgeschlossene Kerzen verarbeiten.
Die SSL NRTR gleitenden Durchschnitte berechnen und die Kanalfarbe ableiten (auf, ab oder neutral).
Wenn die Farbe auf bullisch wechselt (0), Short-Positionen optional schließen und, wenn aktiviert, eine Long-Position eröffnen.
Wenn die Farbe auf bärisch wechselt (2), Long-Positionen optional schließen und, wenn aktiviert, eine Short-Position eröffnen.
Stop-Loss/Take-Profit-Niveaus mit dem Einstiegspreis verfolgen und die Position schließen, wenn ein Niveau erreicht wird.
Positionen optional schließen, sobald die Haltezeit den Exit Minutes-Parameter überschreitet.
Wiederholte Einstiege innerhalb derselben Bar durch Drosselung mit der ursprünglichen MT5-"Zeitlevel"-Logik verhindern.
Money Management
Der Lot-Modus behandelt den Money-Management-Wert als direktes Volumen in Lots/Kontrakten.
FreeMargin und Balance approximieren den angeforderten Kapitalanteil durch Division durch den letzten Schlusskurs.
LossFreeMargin und LossBalance schätzen das handelbare Volumen aus dem erlaubten Verlust pro Trade mit dem konfigurierten Stop-Loss-Abstand.
Negative Money-Management-Werte werden immer einer absoluten Lotgröße zugeordnet.
Hinweise
Nur die in StockSharp verfügbaren Glättungsmethoden werden direkt implementiert. Jurx und Parma fallen auf den exponentiellen gleitenden Durchschnitt zurück, und dieses Verhalten ist in Code-Kommentaren dokumentiert.
Die Strategie hält Stop-Loss- und Take-Profit-Logik innerhalb der Strategieschleife, anstatt native Schutzaufträge zu senden, um plattformunabhängig zu bleiben.
Slippage ist eine informationsbasierte Einstellung für Vollständigkeit; Aufträge werden als einfache Marktaufträge gesendet.
Die Implementierung zeichnet standardmäßig Kerzen und eigene Trades im Chartbereich.
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
public class ExpSslNrtrTmPlusStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private decimal? _prevFast, _prevSlow;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public ExpSslNrtrTmPlusStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 10).SetGreaterThanZero().SetDisplay("Fast EMA", "Fast period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 30).SetGreaterThanZero().SetDisplay("Slow EMA", "Slow period", "Indicators");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = null;
_prevSlow = null;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevFast = null; _prevSlow = null;
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fast, slow, ProcessCandle).Start();
var area = CreateChartArea();
if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
{
if (candle.State != CandleStates.Finished) return;
if (!IsFormedAndOnlineAndAllowTrading()) { _prevFast = fast; _prevSlow = slow; return; }
if (_prevFast == null || _prevSlow == null) { _prevFast = fast; _prevSlow = slow; return; }
var prevAbove = _prevFast.Value > _prevSlow.Value;
var currAbove = fast > slow;
_prevFast = fast; _prevSlow = slow;
if (!prevAbove && currAbove && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
else if (prevAbove && !currAbove && Position >= 0) { if (Position > 0) SellMarket(); SellMarket(); }
}
}
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 ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class exp_ssl_nrtr_tm_plus_strategy(Strategy):
def __init__(self):
super(exp_ssl_nrtr_tm_plus_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Timeframe", "General")
self._fast_period = self.Param("FastPeriod", 10) \
.SetDisplay("Fast EMA", "Fast period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 30) \
.SetDisplay("Slow EMA", "Slow period", "Indicators")
self._prev_fast = None
self._prev_slow = None
@property
def CandleType(self):
return self._candle_type.Value
@property
def FastPeriod(self):
return self._fast_period.Value
@property
def SlowPeriod(self):
return self._slow_period.Value
def OnReseted(self):
super(exp_ssl_nrtr_tm_plus_strategy, self).OnReseted()
self._prev_fast = None
self._prev_slow = None
def OnStarted2(self, time):
super(exp_ssl_nrtr_tm_plus_strategy, self).OnStarted2(time)
self._prev_fast = None
self._prev_slow = None
fast = ExponentialMovingAverage()
fast.Length = self.FastPeriod
slow = ExponentialMovingAverage()
slow.Length = self.SlowPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(fast, slow, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def _on_process(self, candle, fast_value, slow_value):
if candle.State != CandleStates.Finished:
return
fv = float(fast_value)
sv = float(slow_value)
if self._prev_fast is None or self._prev_slow is None:
self._prev_fast = fv
self._prev_slow = sv
return
prev_above = self._prev_fast > self._prev_slow
curr_above = fv > sv
self._prev_fast = fv
self._prev_slow = sv
if not prev_above and curr_above and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
elif prev_above and not curr_above and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
def CreateClone(self):
return exp_ssl_nrtr_tm_plus_strategy()