Die 4-SMA-Strategie repliziert den MetaTrader-Expertenberater 4 SMA.mq4. Es arbeitet mit 30-Minuten-Kerzen, die mit Durchschnittspreisen berechnet werden, und vergleicht vier einfache gleitende Durchschnitte (5, 20, 40 und 60 Perioden), um Momentumausbrüche zu erkennen. Der StockSharp-Port behält das Einzelpositionsverhalten des ursprünglichen Codes bei und verwendet hochrangige API-Helfer für Markteintritte und Risikomanagement.
Handelslogik
Berechnen Sie den Medianpreis (high + low) / 2 für jede fertige Kerze und geben Sie ihn in die vier SMAs ein.
Long-Einstieg erfolgt, wenn der schnelle SMA über dem mittleren SMA liegt, der mittlere SMA über dem langsamen SMA liegt, der langsame SMA um mindestens eine Preisstufe über dem sehr langsamen SMA liegt und der vorherige langsame SMA unter oder gleich dem sehr langsamen SMA lag. Es kann jeweils nur eine Long-Position aktiv sein.
Kurzer Eintrag ist die Spiegelbedingung: Der schnelle SMA liegt unter dem mittleren SMA, der mittlere SMA liegt unter dem langsamen SMA, der sehr langsame SMA liegt um mindestens eine Preisstufe über dem langsamen SMA und der vorherige langsame SMA lag über oder gleich dem sehr langsamen SMA. Es kann jeweils nur eine Short-Position aktiv sein.
Positionsmanagement
Die Strategie schließt Long-Positionen, wenn der langsame SMA den sehr langsamen SMA unterschreitet, und schließt Short-Positionen, wenn der langsame SMA den sehr langsamen SMA überschreitet.
Die Schutzstufen werden nach jedem Eintrag vorberechnet. Stop-Loss- und Take-Profit-Distanzen folgen den ursprünglichen punktbasierten Einstellungen und stützen sich auf den Wertpapierpreisschritt.
Trailing-Stops werden aktiviert, sobald sich der Preis über die konfigurierte Trailing-Distanz hinaus bewegt. Der Stopp wird Kerze für Kerze nachgezogen und niemals gelöst.
Parameter
Name
Beschreibung
Standard
CandleType
Für Berechnungen verwendete Kerzenserie (standardmäßig 30 Minuten).
Zeitrahmen M30
TakeProfit
Take-Profit-Distanz in Punkten.
50
StopLoss
Stop-Loss-Distanz in Punkten.
50
TrailingStop
Trailing-Stop-Distanz in Punkten.
11
FastLength
Länge des Fastens SMA.
5
Mittlere Länge
Länge des Mediums SMA.
20
SlowLength
Länge des langsamen SMA.
40
VerySlowLength
Länge des sehr langsamen SMA.
60
Alle numerischen Parameter werden zur Optimierung über die Parameter-Benutzeroberfläche StockSharp verfügbar gemacht.
Unterschiede zur MQL-Version
Der ursprüngliche Trailing Stop manipulierte MT4-Aufträge direkt; Der Hafen berechnet die Ausstiegspreise neu und erteilt Marktaufträge, wenn die Niveaus überschritten werden.
Preisschrittorientierte Berechnungen ermöglichen die Anwendung der Strategie auf Instrumenten mit Nicht-Forex-Tick-Größen.
Die StockSharp-Implementierung basiert auf SubscribeCandles-Bindungen und Strategieparametern auf hoher Ebene und bleibt dabei den Best Practices des Frameworks treu.
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
public class FourSmaStrategy : Strategy
{
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<int> _cooldownCandles;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevFast;
private decimal _prevSlow;
private bool _hasPrev;
private int _cooldownRemaining;
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public int CooldownCandles { get => _cooldownCandles.Value; set => _cooldownCandles.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public FourSmaStrategy()
{
_fastPeriod = Param(nameof(FastPeriod), 20).SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 80).SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
_cooldownCandles = Param(nameof(CooldownCandles), 100).SetDisplay("Cooldown", "Candles between signals", "General");
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = default;
_prevSlow = default;
_hasPrev = default;
_cooldownRemaining = default;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevFast = 0;
_prevSlow = 0;
_hasPrev = false;
_cooldownRemaining = 0;
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fast, slow, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
{
if (candle.State != CandleStates.Finished) return;
if (!_hasPrev) { _prevFast = fast; _prevSlow = slow; _hasPrev = true; return; }
if (_cooldownRemaining > 0)
{
_cooldownRemaining--;
_prevFast = fast;
_prevSlow = slow;
return;
}
if (_prevFast <= _prevSlow && fast > slow && Position <= 0)
{
if (Position < 0) BuyMarket();
BuyMarket();
_cooldownRemaining = CooldownCandles;
}
else if (_prevFast >= _prevSlow && fast < slow && Position >= 0)
{
if (Position > 0) SellMarket();
SellMarket();
_cooldownRemaining = CooldownCandles;
}
_prevFast = fast;
_prevSlow = slow;
}
}