Die Strategie repliziert den ursprünglichen MetaTrader „GLAM Trader“-Expertenberater, indem sie Informationen aus drei Zeitrahmen kombiniert:
Ein schneller EMA(3) auf dem 15-Minuten-Chart erfasst kurzfristige Trendverzerrungen.
Ein Laguerre-Filter mit Gamma 0,7, angewendet auf 5-Minuten-Kerzen, misst, ob der Preis über oder unter seinem geglätteten Pfad handelt.
Der Awesome Oscillator auf stündlichen Kerzen liefert einen Momentum-Check, der der Definition von Bill Williams entspricht.
Erst wenn alle drei Komponenten übereinstimmen, eröffnet die Strategie einen Handel mit dem Ziel, Störungen herauszufiltern, die auftreten würden, wenn ein einzelner Zeitrahmen isoliert bewertet würde.
Handelslogik
Datenvorbereitung
15-Minuten-Kerzen füttern ein ExponentialMovingAverage mit der Länge EmaPeriod (Standard 3).
5-Minuten-Kerzen speisen ein LaguerreFilter mit glättendem LaguerreGamma.
60-Minuten-Kerzen speisen einen AwesomeOscillator.
Für jeden Zeitrahmen wird der letzte abgeschlossene Kerzenschluss gespeichert, um den ursprünglichen Indikator-Preis-Vergleich zu reproduzieren.
Eintrittsbedingungen
Long: Der EMA liegt über dem aktuellen 15-Minuten-Schluss, Laguerre liegt über dem letzten 5-Minuten-Schluss und Awesome Oscillator liegt über dem letzten Stunden-Schluss.
Short: Jeder der drei Indikatoren muss unter seinem entsprechenden Schlusskurs liegen.
Risikomanagement
Separate Stop-Loss- und Take-Profit-Abstände (ausgedrückt in Instrumentenpunkten) für Long- und Short-Trades.
Trailing-Stops werden aktiviert, sobald der Preis mindestens die angegebene Trailing-Distanz über den Einstiegspreis hinausgeht. Der Stopp wird in Trendrichtung gesetzt, ohne nachzugeben.
Alle Schutzmaßnahmen (Take-Profit, Stop-Loss, Trailing Stop) schließen die gesamte Position mit Marktaufträgen und spiegeln die MQL-Implementierung wider.
Parameter
Name
Beschreibung
Standard
TradeVolume
Auftragsgröße für neue Positionen.
0,1
PrimaryCandleType
Zeitrahmen, der für das EMA und das Hauptsignal verwendet wird.
15-Minuten-Kerzen
LaguerreCandleType
Mit dem Laguerre-Filter analysierter Zeitrahmen.
5-Minuten-Kerzen
AwesomeCandleType
Vom Awesome Oscillator analysierter Zeitrahmen.
60-Minuten-Kerzen
EmaPeriod
EMA Länge im primären Zeitrahmen.
3
LaguerreGamma
Gamma-Parameter für den Laguerre-Filter.
0,7
LongStopLossPoints
Stop-Loss-Distanz für Long-Trades, in Punkten.
20
ShortStopLossPoints
Stop-Loss-Distanz für Short-Trades, in Punkten.
20
LongTakeProfitPoints
Take-Profit-Distanz für Long-Trades, in Punkten.
50
ShortTakeProfitPoints
Take-Profit-Distanz für Short-Trades, in Punkten.
50
LongTrailingPoints
Nachlaufdistanz für Long-Trades, in Punkten.
15
ShortTrailingPoints
Nachlaufdistanz für Short-Trades, in Punkten.
15
Notizen
Die Strategie abonniert drei unabhängige Kerzenströme und behält nur die aktuellsten Endwerte bei, wodurch manuelle Verlaufspuffer vermieden werden.
Alle Kommentare und Protokollmeldungen bleiben aus Gründen der Übersichtlichkeit und entsprechend den Projektkonventionen auf Englisch.
Passen Sie die punktbasierten Risikoparameter entsprechend dem PriceStep des Instruments an, sodass die Schutzniveaus die Tick-Größe des Brokers widerspiegeln.
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>
/// Glam Trader strategy - EMA crossover with momentum confirmation.
/// Buys when fast EMA crosses above slow EMA and momentum is positive.
/// Sells when fast EMA crosses below slow EMA and momentum is negative.
/// </summary>
public class GlamTraderSimpleStrategy : Strategy
{
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<int> _momentumPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevFast;
private decimal _prevSlow;
private bool _hasPrev;
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public int MomentumPeriod { get => _momentumPeriod.Value; set => _momentumPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public GlamTraderSimpleStrategy()
{
_fastPeriod = Param(nameof(FastPeriod), 8)
.SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 21)
.SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
_momentumPeriod = Param(nameof(MomentumPeriod), 14)
.SetDisplay("Momentum Period", "Momentum lookback", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
protected override void OnReseted() { base.OnReseted(); _prevFast = 0m; _prevSlow = 0m; _hasPrev = false; }
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
var mom = new Momentum { Length = MomentumPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(fast, slow, mom, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow, decimal mom)
{
if (candle.State != CandleStates.Finished)
return;
if (!_hasPrev)
{
_prevFast = fast;
_prevSlow = slow;
_hasPrev = true;
return;
}
// Fast crosses above slow + positive momentum = buy
if (_prevFast <= _prevSlow && fast > slow && mom > 0 && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// Fast crosses below slow + negative momentum = sell
else if (_prevFast >= _prevSlow && fast < slow && mom < 0 && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevFast = fast;
_prevSlow = slow;
}
}