Auf GitHub ansehen

Zone Recovery Hedge-Strategie

Die Zone Recovery Hedge Strategy ist eine StockSharp-Portierung des MetaTrader-Expertenberaters Zone Recovery Hedge V1. Der Algorithmus wechselt Kauf- und Verkaufspositionen um einen Ankerpreis herum, sodass immer dann eine neue Order platziert wird, wenn der Preis die konfigurierte Erholungszone überschreitet. Die Sequenz erweitert das Positionsvolumen nach einem Martingal-Plan, bis entweder das variable Gewinnziel oder der optionale Verlustschutz erreicht ist.

Strategielogik

  1. Einstiegsfilter – Wenn der Modus RSI Multi-Timeframe ausgewählt ist, prüft die Strategie eine konfigurierbare Liste von RSI-Messwerten (von M1 bis MN1) und erfordert, dass jeder aktivierte Zeitrahmen gleichzeitig einen überkauften/überverkauften Bereich verlässt. Der Übergang von überverkauft zu einem Kaufzyklus, während der Übergang von überkauft zu einem Verkaufszyklus führt. Im Manuellen Modus können die Hilfsmethoden StartManualMarketCycle und StartManualPendingCycle aufgerufen werden, um eine neue Sequenz ohne automatische Signale zu beginnen.
  2. Erster Handel – Der erste Handel verwendet entweder die feste Lotgröße oder eine risikobasierte Größe, die aus dem Portfolioeigenkapital und der geplanten Stop-Distanz abgeleitet wird. Wenn die ATR-Dimensionierung aktiv ist, werden die Stoppdistanz und die Zonenbreite aus dem täglichen ATR abgeleitet; andernfalls werden Brokerpunkte verwendet.
  3. Erholungsraster – Wenn sich der Preis um die Entfernung der Erholungszone entgegen der aktiven Richtung bewegt, öffnet die Strategie die entgegengesetzte Seite mit einem erhöhten Volumen (benutzerdefinierte Lot-Leiter, Multiplikator oder additive Stufe). Der Zyklus wechselt ständig die Richtung um den ursprünglichen Ankerpreis herum und baut Volumen auf, bis das Gewinnziel erreicht oder die maximale Anzahl an Trades erreicht ist.
  4. Gewinnkontrolle – Das Ziel wird in der Kontowährung bewertet, wobei entweder die Basis-Take-Profit-Distanz oder die dedizierte Recovery-Take-Profit-Distanz (mit optionalen ATR-Bruchteilen) verwendet wird. Provisionen können über den Parameter Test Commission simuliert werden. Wenn der variable Gewinn das Ziel plus Kosten übersteigt, ist der gesamte Zyklus geschlossen.
  5. Risikoschutz – Wenn MaxTrades ungleich Null ist und SetMaxLoss aktiviert ist, werden alle Positionen geschlossen und der Zyklus zurückgesetzt, wenn die maximale Handelsanzahl erreicht wird, während der variable PnL das MaxLoss-Limit überschreitet.

Hinweis: StockSharp-Strategien werden standardmäßig verrechnet. Der Port reproduziert die Wiederherstellungslogik, indem er die Nettoposition umkehrt, anstatt gleichzeitig abgesicherte Positionen zu halten. Dadurch bleibt die Gewinnberechnung mit StockSharp kompatibel, während die abwechselnden Wiederherstellungsschritte des ursprünglichen Beraters erhalten bleiben.

Parameter

Gruppe Parameter Beschreibung
Allgemein CandleType Primärer Zeitrahmen, der die Eingabelogik steuert.
Allgemein Mode Manual deaktiviert Signale, RsiMultiTimeframe aktiviert den RSI-Filter.
Signale RsiPeriod, OverboughtLevel, OversoldLevel RSI Berechnungszeitraum und Schwellenwerte.
Signale UseM1TimeframeUseMonthlyTimeframe Aktivieren/deaktivieren Sie die RSI Bestätigungen für den entsprechenden Zeitraum.
Signale TradeOnBarOpen Verwenden Sie die vorherige Leiste als Bestätigungsleiste (ursprüngliches EA-Verhalten).
Erholung RecoveryZoneSize, TakeProfitPoints Zonenbreite und Basis-Take-Profit, wenn ATR deaktiviert ist.
Erholung UseAtr, AtrPeriod, AtrZoneFraction, AtrTakeProfitFraction, AtrRecoveryFraction, AtrCandleType ATR-basierte Größeneinstellungen.
Erholung UseRecoveryTakeProfit, RecoveryTakeProfitPoints Spezielle Take-Profit-Distanz, wenn sich der Zyklus bereits in der Erholungsphase befindet.
Risiko MaxTrades, SetMaxLoss, MaxLoss Begrenzen Sie die Anzahl der Trades und definieren Sie einen geldbasierten Verlustschutz.
Risiko TestCommission Geschätzte Provision (in Geld), die pro Handelsvolumen bei der Bewertung des Gewinnziels angewendet wird.
Geldmanagement RiskPercent, InitialLotSize, LotMultiplier, LotAddition, CustomLotSize1CustomLotSize10 Steuert, wie Volumen für jeden Schritt im Zyklus generiert werden.
Timer UseTimer, StartHour, StartMinute, EndHour, EndMinute, UseLocalTime Beschränken Sie den Handel auf ein tägliches Zeitfenster.
Handbuch PendingPrice Von StartManualPendingCycle verwendeter Referenzpreis.

Anwendungstipps

  • Hängen Sie die Strategie an eine Datenquelle an, die den höchsten Zeitrahmen bietet, den Sie für RSI Bestätigungen verwenden möchten. Aus dem Basiszeitrahmen können durch den internen Aggregator höhere Zeitrahmen erstellt werden.
  • Wenn der Modus Manuell aktiv ist, rufen Sie StartManualMarketCycle(true) oder StartManualMarketCycle(false) auf, um einen Kauf- oder Verkaufszyklus zum aktuellen Preis zu öffnen, oder StartManualPendingCycle, um den Zyklus auf einem benutzerdefinierten Preisniveau zu verankern.
  • Die saldobasierte Positionsgrößenbestimmung begrenzt den Risikoprozentsatz auf 10 %, genau wie beim Original EA.
  • Die Wiederherstellungslogik geht davon aus, dass Security.PriceStep und Security.StepPrice vom Connector gefüllt werden. Ohne sie kann das Gewinnziel nicht berechnet werden.

Unterschiede zur MetaTrader-Version

  • Der Port StockSharp funktioniert mit Nettopositionen statt mit abgesicherten Long/Short-Körben. Die Erholungssequenz wechselt immer noch die Handelsrichtungen, aber die Positionen werden beim Richtungswechsel umgekehrt.
  • Grafische Elemente (Schaltflächen, Linien, Kommentare) aus dem MT4-Panel werden nicht wiedergegeben. Timer- und manuelle Befehle werden durch Strategieparameter und Hilfsmethoden verfügbar gemacht.
  • Auf eine Spread-basierte Kostenmodellierung wird verzichtet; nur der Wert TestCommission wird vom Gewinnziel abgezogen.
namespace StockSharp.Samples.Strategies;

using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;

/// <summary>
/// Zone Recovery Hedge strategy: RSI mean reversion with trend filter.
/// Buys when RSI crosses above oversold with close above SMA, sells on overbought cross below SMA.
/// </summary>
public class ZoneRecoveryHedgeStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<int> _smaPeriod;

	private decimal _prevRsi;
	private bool _hasPrev;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
	public int SmaPeriod { get => _smaPeriod.Value; set => _smaPeriod.Value = value; }

	public ZoneRecoveryHedgeStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_rsiPeriod = Param(nameof(RsiPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI Period", "RSI period", "Indicators");
		_smaPeriod = Param(nameof(SmaPeriod), 50)
			.SetGreaterThanZero()
			.SetDisplay("SMA Period", "SMA trend filter period", "Indicators");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevRsi = 0;
		_hasPrev = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_hasPrev = false;
		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var sma = new SimpleMovingAverage { Length = SmaPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(rsi, sma, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal rsiValue, decimal smaValue)
	{
		if (candle.State != CandleStates.Finished) return;

		if (_hasPrev)
		{
			if (_prevRsi < 30 && rsiValue >= 30 && candle.ClosePrice > smaValue && Position <= 0)
				BuyMarket();
			else if (_prevRsi > 70 && rsiValue <= 70 && candle.ClosePrice < smaValue && Position >= 0)
				SellMarket();
		}

		_prevRsi = rsiValue;
		_hasPrev = true;
	}
}