Auf GitHub ansehen

Rollback System Strategie

Diese Strategie ist eine C#-Konvertierung des MetaTrader 5-Expertenberaters "Rollback system". Sie bewahrt die ursprüngliche Idee, ganz am Anfang eines neuen Handelstages zu handeln, indem die letzten 24 Stundenkerzen ausgewertet werden, um zu erkennen, ob der Markt einen ausgedehnten Zug geliefert hat, der wahrscheinlich zurücklaufen wird.

Handelslogik

  1. Die Strategie arbeitet auf einem stündlichen Zeitrahmen (CandleType, Standard 1 Stunde).
  2. Signale werden nur einmal täglich ausgewertet, wenn der neue Tag beginnt (00:0000:03). Der Filter überspringt Montag- und Freitagssitzungen genau wie die MQL-Version.
  3. Vor dem Eröffnen einer Position stellt der Algorithmus sicher, dass keine anderen Trades aktiv sind.
  4. Für jeden Handelstag werden die folgenden Werte aus den letzten 24 geschlossenen Kerzen berechnet:
    • Open_24_minus_Close_1 – Abstand zwischen dem Eröffnungspreis vor 24 Bars und dem letzten Schlusskurs.
    • Close_1_minus_Open_24 – umgekehrter Abstand, der die Nettotagsveränderung zeigt.
    • Close_1_minus_Lowest – wie weit der Schlusskurs vom tiefsten Tief des Tages entfernt ist.
    • Highest_minus_Close_1 – wie weit der Schlusskurs vom höchsten Hoch des Tages entfernt ist.
  5. Einstiegsregeln (in Preiseinheiten ausgedrückt, aus Pip-Parametern umgerechnet):
    • Long #1 – Vortag fiel (Open_24_minus_Close_1 über dem Schwellenwert ChannelOpenClosePips) und der Schlusskurs ist immer noch nahe dem extremen Tief (Close_1_minus_Lowest unter RollbackPips - ChannelRollbackPips).
    • Long #2 – Vortag stieg (Close_1_minus_Open_24 über dem Kanalschwellenwert), aber der Markt schloss weit unter dem Tageshoch (Highest_minus_Close_1 größer als RollbackPips + ChannelRollbackPips).
    • Short #1 – Vortag stieg und der Schlusskurs endete nahe dem Tageshoch (Highest_minus_Close_1 unter RollbackPips - ChannelRollbackPips).
    • Short #2 – Vortag fiel und der Schlusskurs erholte sich weit über das Tagestief (Close_1_minus_Lowest über RollbackPips + ChannelRollbackPips).
  6. Aufträge werden mit BuyMarket/SellMarket mit dem konfigurierten Handelsvolumen ausgeführt. Stop-Loss- und Take-Profit-Niveaus werden aus StopLossPips und TakeProfitPips abgeleitet (beide null deaktivieren den jeweiligen Schutz).
  7. Schutzniveaus werden auf jeder abgeschlossenen Kerze überwacht. Wenn der Preis intrabar ein Niveau verletzt, schließt die Strategie die Position mit einer Marktorder, was das Verhalten des originalen MQL-Expertenberaters repliziert, der harte Stops sendete.

Pip-Parameterkonvertierung

MetaTrader 5 multipliziert Pip-Werte bei 3- und 5-stelligen Symbolen mit 10. Die Konvertierungslogik wird beibehalten: Die Strategie nimmt den PriceStep des Instruments und wendet einen zehnfachen Multiplikator an, wenn die erkannte Anzahl der Dezimalstellen 3 oder 5 beträgt. Dies hält die Einstiegsschwellen, Stop-Loss- und Take-Profit-Abstände konsistent mit der MQL-Implementierung über typische FX-Symbole.

Parameter

Parameter Beschreibung
TradeVolume Handelsgröße für Marktorders.
StopLossPips Stop-Loss-Abstand in Pips. Auf null setzen, um zu deaktivieren.
TakeProfitPips Take-Profit-Abstand in Pips. Auf null setzen, um zu deaktivieren.
RollbackPips Basis-Rollback-Anforderung für alle Signale.
ChannelOpenClosePips Mindestdifferenz zwischen Eröffnung und Schluss des Vortages.
ChannelRollbackPips Toleranz, die zur Rollback-Prüfung addiert/subtrahiert wird.
CandleType Arbeits-Kerzentyp, standardmäßig Stundenkerzen.

Hinweise

  • Die MQL-Version zeichnete Rechtecke im Chart zur visuellen Referenz. Der StockSharp-Port behält nur die Handelslogik.
  • Risikomanagement wird mit strategie-interner Überwachung statt serverseitiger Schutzorders implementiert, da die High-Level-API Positionen direkt verwaltet.
  • Passen Sie bei der Optimierung die Pip-Schwellenwerte und das Volumen an das Zielinstrument und die Tick-Größe des Brokers an.
using System;
using System.Collections.Generic;

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

namespace StockSharp.Samples.Strategies;

public class RollbackSystemStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private decimal? _prevRsi;

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

	public RollbackSystemStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
		_rsiPeriod = Param(nameof(RsiPeriod), 14).SetGreaterThanZero().SetDisplay("RSI Period", "RSI lookback", "Indicators");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];

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

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevRsi = null;
		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(rsi, ProcessCandle).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawOwnTrades(area); }
	}

	private void ProcessCandle(ICandleMessage candle, decimal rsiVal)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!IsFormedAndOnlineAndAllowTrading()) { _prevRsi = rsiVal; return; }
		if (_prevRsi == null) { _prevRsi = rsiVal; return; }
		if (_prevRsi.Value < 30m && rsiVal >= 30m && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
		else if (_prevRsi.Value > 70m && rsiVal <= 70m && Position >= 0) { if (Position > 0) SellMarket(); SellMarket(); }
		_prevRsi = rsiVal;
	}
}