Die Slow Stochastic Mode-Strategie ist eine Konvertierung des MetaTrader-Expert-Advisors Exp_Slow-Stoch.mq5 in die StockSharp-High-Level-API. Das System handelt auf dem Schlusskurs abgeschlossener Kerzen und verwendet einen geglätteten stochastischen Oszillator zur Erkennung von Regimewechseln. Es stehen drei verschiedene Signalmodi zur Verfügung, sodass der Trader entscheiden kann, ob er auf Levelbrüche, Momentum-Umschwünge oder Linienkreuzungen reagiert.
Kernidee
Die Strategie beobachtet die %K- und %D-Linien eines langsamen stochastischen Oszillators, der durch den Slowing-Parameter zusätzlich geglättet wird. Abhängig vom ausgewählten Signalmodus wertet der Algorithmus den Oszillator eine oder mehrere Bars zurück aus (gesteuert durch SignalBar) und öffnet entweder eine neue Position oder schließt die Gegenseite, wenn ein qualifizierendes Ereignis erscheint. Aufträge werden immer als Marktausführungen platziert.
Signalmodi
Breakdown – sucht nach einem Durchbruch von %K durch das 50-Niveau. Ein Kreuz von unten nach oben durch 50 erzeugt einen Long-Einstieg und schließt Short-Positionen. Ein Kreuz von oben nach unten durch 50 erzeugt einen Short-Einstieg und schließt Long-Positionen.
Twist – erkennt eine Richtungsänderung von %K. Wenn der Oszillator vor zwei Bars fiel und sich auf der ausgewerteten Bar nach oben dreht, öffnet oder dreht die Strategie in einen Long-Trade. Die umgekehrte Situation löst Shorts aus.
CloudTwist – verfolgt den Farbwechsel der stochastischen "Cloud" durch Beobachtung eines %K vs %D-Kreuzes. Ein bullisches Kreuz (%K über %D) öffnet oder schützt Longs, während ein bärisches Kreuz (%K unter %D) das Gegenteil bewirkt.
Alle Modi respektieren die vier Berechtigungsschalter: Long/Short-Einstiege und Long/Short-Ausstiege können unabhängig aktiviert oder deaktiviert werden.
Parameter
Parameter
Standard
Beschreibung
CandleType
H4-Zeitrahmen
Kerzentyp für Indikatorberechnungen.
KPeriod
5
Rückblickperiode für die %K-Linie.
DPeriod
3
Gleitende-Durchschnitt-Länge für %D.
Slowing
3
Zusätzliche Glättung auf %K vor Vergleichen.
SignalBar
1
Anzahl der geschlossenen Bars zurück zur Signalauswertung.
StopLossPoints
1000
Stop-Loss-Abstand in Instrument-Schritten (0 zum Deaktivieren).
TakeProfitPoints
2000
Take-Profit-Abstand in Instrument-Schritten (0 zum Deaktivieren).
EnableLongEntries
true
Erlaubt der Strategie, Long-Positionen zu öffnen.
EnableShortEntries
true
Erlaubt der Strategie, Short-Positionen zu öffnen.
EnableLongExits
true
Erlaubt das Schließen von Long-Positionen bei einem Umkehrsignal.
EnableShortExits
true
Erlaubt das Schließen von Short-Positionen bei einem Umkehrsignal.
Mode
Twist
Ausgewählter Signalmodus.
Die Strategie verwendet den integrierten StockSharp-StochasticOscillator-Indikator und speist ihn mit den konfigurierten Längen. Der SignalBar-Parameter ermöglicht die Reproduktion des MetaTrader-Verhaltens der Referenzierung der vorherigen Kerze (Standard = 1) oder des Handelns auf der zuletzt abgeschlossenen Bar bei Einstellung auf 0.
Handelsverwaltung
Aufträge werden mit BuyMarket- und SellMarket-Aufrufen übermittelt. Positionswechsel werden automatisch durch Addition des absoluten Wertes der aktuellen Position zum Basis-Ordervolumen behandelt.
Optionaler Stop-Loss- und Take-Profit-Schutz wird über StartProtection aktiviert. Abstände werden als Ticks/Schritte interpretiert, daher multipliziert StockSharp sie intern mit der Instrumentenschrittgröße.
Kein Trailing Stop ist angehängt; der Schutz bleibt statisch bis zur Ausführung oder bis die Strategie manuell aussteigt.
Ausstiegslogik
Im Breakdown-Modus schließt derselbe Schwellenbruch, der eine Seite öffnet, die andere.
Im Twist-Modus schließt das Erkennen einer Momentum-Umkehr die entgegengesetzte Position, bevor die neue eröffnet wird.
Im CloudTwist-Modus löst das Kreuzen von %K und %D sowohl den Einstieg aus als auch liquidiert gleichzeitig die entgegengesetzte Seite.
Wenn Einstiegsberechtigungen deaktiviert sind, bleibt nur die entsprechende Ausstiegslogik aktiv, was Benutzern ermöglicht, die Strategie im "Bestehende Exposition verwalten"-Modus zu betreiben.
Implementierungshinweise
Die Oszillatorhistorie wird in kleinen In-Memory-Puffern verfolgt, damit die Strategie die vom ursprünglichen Expert-Advisor benötigten Bar-Offsets inspizieren kann.
Alle Entscheidungen werden nur auf abgeschlossenen Kerzen ausgewertet (candle.State == Finished).
Das Chart-Rendering zeichnet die zugrunde liegenden Kerzen und den stochastischen Oszillator, wenn Chart-Dienste verfügbar sind.
Diese Konvertierung behält die Absicht des ursprünglichen MQL5-Systems bei und nutzt gleichzeitig die Indikator-Bindings, Parameter-Metadaten und integrierten Risikokontrollen von StockSharp.
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Slow Stochastic Mode strategy. Uses EMA crossover for trend following.
/// </summary>
public class SlowStochasticModeStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private decimal? _prevFast;
private decimal? _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 SlowStochasticModeStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
.SetDisplay("Candle Type", "Timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 5)
.SetGreaterThanZero()
.SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(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 fastVal, decimal slowVal)
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
{
_prevFast = fastVal;
_prevSlow = slowVal;
return;
}
if (_prevFast == null || _prevSlow == null)
{
_prevFast = fastVal;
_prevSlow = slowVal;
return;
}
var prevAbove = _prevFast.Value > _prevSlow.Value;
var currAbove = fastVal > slowVal;
_prevFast = fastVal;
_prevSlow = slowVal;
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 slow_stochastic_mode_strategy(Strategy):
def __init__(self):
super(slow_stochastic_mode_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", 5) \
.SetDisplay("Fast EMA", "Fast EMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 14) \
.SetDisplay("Slow EMA", "Slow EMA 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(slow_stochastic_mode_strategy, self).OnReseted()
self._prev_fast = None
self._prev_slow = None
def OnStarted2(self, time):
super(slow_stochastic_mode_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 slow_stochastic_mode_strategy()