Auf GitHub ansehen

SilverTrend ColorJFatl Digit-Strategie

Übersicht

Die SilverTrend ColorJFatl Digit-Strategie verbindet zwei klassische MetaTrader-Systeme zu einer einheitlichen High-Level-StockSharp-Strategie. Der SilverTrend-Block identifiziert Richtungsausbrüche, indem er misst, wie weit der Preis innerhalb eines kurzen Donchian-artigen Kanals reist. Der ColorJFatl Digit-Block glättet den Preis mit einem Jurik Moving Average (JMA) und bewertet seine Steigung, nachdem die Ausgabe auf die konfigurierte Anzahl von Stellen gerundet wurde. Nur wenn beide Subsysteme über die Richtung einig sind, öffnet oder hält die Strategie eine Position. Wenn die Signale divergieren, verlässt die Strategie zur Flat.

Das Design behält den Geist des ursprünglichen Expertenberaters bei und nutzt gleichzeitig die High-Level-API von StockSharp: Kerzenabonnements, Indikatorbindungen, warteschlangenbasierte Signalverzögerungen und Diagrammzeichnungshilfen. Jeder Schritt ist ausführlich dokumentiert, um weitere Forschung und Optimierung einfach zu machen.

Strategielogik

1. SilverTrend-Ausbruchsdetektor

  • Verwendet Highest- und Lowest-Indikatoren mit SilverTrendLength + 1 Kerzen, um den aktuellen Preiskanal zu bilden.
  • Der Kanal wird durch den SilverTrendRisk-Parameter verengt: je höher der Risikowert, desto näher liegen die Ausbruchsschwellen an der Kanalmittellinie (ursprüngliche Formel 33 - risk).
  • Wenn der Schluss über die angepasste obere Schwelle bricht, meldet der SilverTrend-Block einen bullischen Trend (+1). Wenn er unter die untere Schwelle bricht, meldet der Block einen bärischen Trend (-1).
  • Eine konfigurierbare Verzögerung (SilverTrendSignalBar) wartet n vollständig geschlossene Kerzen, bevor das Signal als gültig gilt, und ahmt die MQL-SignalBar-Logik nach.

2. ColorJFatl Digit-Bestätigungsfilter

  • Ein JurikMovingAverage glättet den durch JmaPriceType ausgewählten angewandten Preis. Alle MetaTrader-angewandten-Preis-Varianten werden unterstützt (Schluss, Eröffnung, Median, typisch, gewichtet, einfach, Viertel, Trendfolge-Modi und Demark-Berechnung).
  • Die Jurik-Ausgabe wird auf JmaRoundDigits gerundet und reproduziert das diskretisierte "Digit"-Indikatorverhalten.
  • Das Steigungszeichen des gerundeten JMA wird zum Trendsignal. Wenn die Steigung positiv ist, gibt der Filter +1 aus; wenn negativ, -1. Flache Steigungen erben den vorherigen Zustand, um ruckartige Umschaltungen zu vermeiden.
  • Wie bei SilverTrend verzögert JmaSignalBar die Ausführung und erfordert, dass die Steigung für die angeforderte Anzahl geschlossener Kerzen anhält.

3. Trade-Ausführung

  • Einstieg:
    • Long gehen, wenn sowohl SilverTrend als auch ColorJFatl +1 melden und keine bestehende Long-Exposition vorhanden ist.
    • Short gehen, wenn beide Blöcke -1 melden und keine bestehende Short-Exposition vorhanden ist.
  • Ausstieg:
    • Die aktuelle Position sofort schließen, wenn die Signale divergieren (z.B. ein Block sagt +1, der andere -1 oder 0).
    • Umkehrungen schließen automatisch die gegenläufige Exposition, bevor die neue Position eröffnet wird, um Mittelwertbildung zu vermeiden.
  • Aktive Aufträge werden vor Umkehrungen storniert, um das Buch sauber zu halten.

Parameter

Name Beschreibung
SilverTrendCandleType Kerzenserie für die Berechnung des SilverTrend-Ausbruchskanals. Standardmäßig H4-Äquivalent.
SilverTrendLength Rückblicklänge für die Kanalberechnung (SSP-Parameter im ursprünglichen EA).
SilverTrendRisk Risikomodifikator, der die Ausbruchsschwellen verengt (33 - risk). Höhere Werte reagieren schneller, aber mit mehr Fehlsignalen.
SilverTrendSignalBar Anzahl vollständig geschlossener Kerzen zum Warten, bevor eine SilverTrend-Farbänderung akzeptiert wird.
ColorJfatlCandleType Kerzenserie für den Jurik-Filter. Kann sich vom SilverTrend-Zeitrahmen unterscheiden.
JmaLength Länge des Jurik Moving Average.
JmaSignalBar Verzögerung (in Balken) vor dem Handeln bei Jurik-Steigungswechseln.
JmaPriceType Angewandter Preismodus für den Jurik-Eingang (Schluss, Eröffnung, Median, Trendfolge-Varianten, Demark usw.).
JmaRoundDigits Anzahl der Dezimalstellen beim Runden der Jurik-Ausgabe, emuliert den digitalisierten Indikator.

Implementierungshinweise

  • Signalverzögerungen werden mit kleinen FIFO-Warteschlangen statt großen historischen Arrays implementiert, um sicherzustellen, dass die Strategie speichereffizient und dem ursprünglichen Expert Advisor treu bleibt.
  • Der Code fragt Indikatorbuffer nie direkt ab. Stattdessen bindet er Indikatoren über die High-Level-SubscribeCandles().Bind(...)-API, gemäß den Richtlinien in AGENTS.md.
  • Englische Inline-Kommentare erklären jede Entscheidung: wann Schwellen neu berechnet werden, wie Steigungen berechnet werden, warum Aufträge storniert werden und wie Konsens durchgesetzt wird.
  • Diagrammunterstützung ist enthalten: wenn ein Diagramm verfügbar ist, zeichnet die Strategie Preiskerzen, SilverTrend-Kanalllinien und eigene Trades, um Live-Entscheidungen zu visualisieren.

Verwendungstipps

  1. Märkte und Zeitrahmen: Das ursprüngliche System wurde für H4-Forex-Charts entwickelt. Krypto- und Rohstoff-Futures mit klarem Swing-Verhalten funktionieren ebenfalls gut. Für schnellere Märkte SilverTrendLength und JmaLength vorsichtig reduzieren.
  2. Optimierung: Sowohl die Ausbruchlänge (SilverTrendLength) als auch die Bestätigungslänge (JmaLength) gemeinsam optimieren — das Kürzen nur eines Beins erzeugt meist widersprüchliche Signale.
  3. Angewandter-Preis-Experimente: Die Trendfolge-Preismodi ausprobieren, wenn mit Heikin-Ashi- oder Renko-Feeds gearbeitet wird; sie glätten Rauschen oft besser als reine Schlusspreise.
  4. Risikokontrolle: Die eingebauten Ausstiege mit portfolio-weiten Stops kombinieren. Da beide Module leicht verzögern, können Volatilitätsspitzen immer noch über den Kanal hinaus reichen, bevor der Filter wechselt.
  5. Positionsgröße: Die Strategie überlässt die Volumenverwaltung der Basis-Strategy.Volume-Eigenschaft. Es anpassen oder StockSharp-Geldverwaltungserweiterungen integrieren, wenn Pyramidisierung oder Skalierung erforderlich ist.

Weitere Forschungsideen

  • ATR-basierte Stop-Loss- und Take-Profit-Schutzmaßnahmen durch StartProtection hinzufügen, sobald Tests die bevorzugten Schwellen bestätigen.
  • Kerzen eines höheren Zeitrahmens (z.B. Täglich) in die Jurik-Bestätigung einspeisen, während SilverTrend auf H4 bleibt, um einen Trendfilter einzuführen.
  • Mit volumenbasierten Filtern (On-Balance Volume, VWAP-Divergenz) für zusätzliche Bestätigung vor Einstiegen kombinieren.
using System;
using System.Collections.Generic;

using Ecng.Common;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// SilverTrend ColorJFatl Digit strategy (simplified). Uses Highest/Lowest channel
/// breakout combined with EMA slope for trend confirmation.
/// </summary>
public class SilverTrendColorJFatlDigitStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _channelLength;
	private readonly StrategyParam<int> _emaLength;
	private readonly StrategyParam<int> _riskLevel;

	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	public int ChannelLength
	{
		get => _channelLength.Value;
		set => _channelLength.Value = value;
	}

	public int EmaLength
	{
		get => _emaLength.Value;
		set => _emaLength.Value = value;
	}

	public int RiskLevel
	{
		get => _riskLevel.Value;
		set => _riskLevel.Value = value;
	}

	public SilverTrendColorJFatlDigitStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Candles", "General");

		_channelLength = Param(nameof(ChannelLength), 21)
			.SetGreaterThanZero()
			.SetDisplay("Channel Length", "Highest/Lowest lookback", "Indicators");

		_emaLength = Param(nameof(EmaLength), 10)
			.SetGreaterThanZero()
			.SetDisplay("EMA Length", "EMA period for trend confirmation", "Indicators");

		_riskLevel = Param(nameof(RiskLevel), 3)
			.SetDisplay("Risk Level", "Channel threshold tightness", "Logic");
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var highest = new Highest { Length = ChannelLength + 1 };
		var lowest = new Lowest { Length = ChannelLength + 1 };

		var lastTrend = 0;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(highest, lowest, (ICandleMessage candle, decimal highVal, decimal lowVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var range = highVal - lowVal;
				if (range <= 0)
					return;

				var riskModifier = 33m - RiskLevel;
				if (riskModifier < 0m) riskModifier = 0m;
				if (riskModifier > 33m) riskModifier = 33m;

				var thresholdPercent = riskModifier / 100m;
				var lowerThreshold = lowVal + range * thresholdPercent;
				var upperThreshold = highVal - range * thresholdPercent;

				var close = candle.ClosePrice;

				// SilverTrend breakout logic
				if (close < lowerThreshold)
					lastTrend = -1;
				else if (close > upperThreshold)
					lastTrend = 1;

				// Simple EMA slope confirmation using close vs channel midpoint
				var midpoint = (highVal + lowVal) / 2m;
				var emaConfirmUp = close > midpoint;
				var emaConfirmDown = close < midpoint;

				if (lastTrend > 0 && emaConfirmUp && Position <= 0)
					BuyMarket();
				else if (lastTrend < 0 && emaConfirmDown && Position >= 0)
					SellMarket();
			})
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, highest);
			DrawIndicator(area, lowest);
			DrawOwnTrades(area);
		}
	}
}