Die Five MA Multi-Timeframe Strategy repliziert den ursprünglichen MT4-Expertenberater „5matf“ unter Verwendung des High-Level-API von StockSharp. Die Strategie analysiert fünf einfache gleitende Durchschnitte über drei Zeitrahmen (primärer, höherer und langsamster) und kombiniert die Steigung jedes Durchschnitts mit dem Accelerator-Oszillator, um abgestufte Einstiegssignale zu erzeugen. Wenn in allen Zeitrahmen genügend bullische oder bärische Anzeichen vorliegen, eröffnet oder schließt die Strategie entsprechend Positionen.
Indikatoren und Daten
Einfache gleitende Durchschnitte (SMA): Perioden 5, 8, 13, 21 und 34 in allen drei Zeitrahmen.
Beschleunigeroszillator (AC): Wird auf den primären und tertiären Zeitrahmen angewendet, um die Impulsbeschleunigung zu bewerten.
Zeitrahmen: Standardmäßig auf 15 Minuten (Signal), 60 Minuten (Bestätigung) und 240 Minuten (Trendfilter) eingestellt. Alle Zeitrahmen können über Parameter angepasst werden.
Signallogik
Jede SMA vergleicht ihren aktuellen Wert mit der vorherigen Kerze, um einen Aufwärts- oder Abwärtstrend zu bestimmen.
Der Accelerator-Oszillator prüft anhand der letzten vier Werte, ob bullische oder bärische Sequenzen vorliegen.
Steigungszahlen und Oszillatorbeiträge werden für jeden Zeitrahmen in Prozentwerten zusammengefasst.
Wenn alle drei Zeitrahmen bullische Werte über 50 % aufweisen, wird ein KAUFEN-Signal generiert. Werte über 75 % verstärken das Signal.
Die gleichen Schwellenwerte, die in die entgegengesetzte Richtung angewendet werden, erzeugen VERKAUFS-Signale.
Positionen werden geschlossen, wenn ein Gegensignal den konfigurierten Schließpegel überschreitet. Neue Geschäfte werden nur eröffnet, wenn keine Position aktiv ist, was das ursprüngliche Verhalten des Expertenberaters widerspiegelt.
Parameter
Name
Standard
Beschreibung
CandleType
15-Minuten-Kerzen
Primärer Zeitrahmen für Handelssignale.
HigherTimeframe1
60-Minuten-Kerzen
Erster höherer Zeitrahmen für die Bestätigung.
HigherTimeframe2
240-Minuten-Kerzen
Zweiter höherer Zeitrahmen für langsamen Trendfilter.
FirstPeriod – FifthPeriod
5, 8, 13, 21, 34
Auf jeden Zeitrahmen werden SMA Längen angewendet.
OpenLevel
0
Mindestsignalgrad erforderlich, um eine neue Position zu eröffnen.
CloseLevel
1
Gegensignalgrad erforderlich, um eine bestehende Position zu schließen.
Alle Parameter können in der Strategie-Benutzeroberfläche von StockSharp optimiert oder verfeinert werden.
Nutzungshinweise
Die Strategie verwendet Marktaufträge und gibt keine gleichzeitigen Umkehrungen aus; Es wartet immer auf eine flache Position, bevor es in die entgegengesetzte Richtung öffnet.
Aktivieren Sie Verlaufsdaten-Feeds für alle ausgewählten Zeitrahmen, um synchronisierte Berechnungen sicherzustellen.
Erwägen Sie eine Optimierung der SMA-Längen oder der Oszillatornutzung, wenn Sie die Strategie auf verschiedene Märkte oder Volatilitätsregime anwenden.
Konvertierungshinweise
Diese Implementierung behält das Kernverhalten des MT4-Expertenberaters „5matf“ bei und nutzt gleichzeitig das Abonnement- und Indikatorbindungssystem von StockSharp. Die Beschleunigerlogik erfordert vier abgeschlossene Kerzen, bevor Signale aktiv werden, genau wie das ursprüngliche Skript.
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
public class FiveMaMultiTimeframeStrategy : 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 FiveMaMultiTimeframeStrategy()
{
_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;
}
}