Auf GitHub ansehen

Para Retracement-Strategie

Übersicht

Die Para Retracement-Strategie ist eine C#-Konvertierung des ursprünglichen MetaTrader 4-Experten-Advisors Para_Retrace.mq4. Sie reproduziert die Idee, den Parabolic-SAR-Indikator als dynamischen Anker zu verwenden und auf Kursrückläufe zu diesem Niveau zu warten, bevor man in den Markt eintritt. Die Konvertierung nutzt die StockSharp-High-Level-API zur Verwaltung von Marktdatenabonnements, Indikatoraktualisierungen und Orderausführung.

Handelslogik

  1. Den Parabolic-SAR-Wert auf jeder abgeschlossenen Kerze mit dem konfigurierten Beschleunigungsschritt und der maximalen Beschleunigung berechnen.
  2. Den vorherrschenden Trend bestimmen, indem geprüft wird, ob die gesamte Kerze unter oder über dem SAR-Wert liegt:
    • Bärischer Kontext: wenn sowohl das Kerzenhoch als auch das Kerzentief unter dem SAR-Wert liegen.
    • Bullischer Kontext: andernfalls (der Kurs berührt oder liegt über dem SAR-Niveau).
  3. Einen Auslösepreis ableiten, indem der SAR-Wert um eine benutzerdefinierte Anzahl von Pips versetzt wird:
    • In einem bärischen Kontext subtrahiert die Strategie den Versatz und wartet auf einen Rücklauf nach oben.
    • In einem bullischen Kontext addiert die Strategie den Versatz und wartet auf einen Rückzug nach unten.
  4. Sobald der Kurs den Auslöser berührt (Kerzenhoch kreuzt nach oben für Shorts, Kerzentief kreuzt nach unten für Longs), eröffnet die Strategie eine Marktorder in Trendrichtung.
  5. Schützende Stop-Loss- und Take-Profit-Orders werden automatisch über die StartProtection-Funktion von StockSharp angehängt und entsprechen den Abständen des ursprünglichen Skripts.

Im Gegensatz zum ursprünglichen Experten-Advisor handelt die StockSharp-Version nach dem Öffnen einer Position weiter; es ist nicht notwendig, den Versatzwert manuell zurückzusetzen. Alle Aktionen werden nur auf abgeschlossenen Kerzen durchgeführt, um Intrabar-Neuzeichnungsprobleme zu vermeiden.

Indikatoren

  • Parabolic SAR – treibt sowohl die Trenderkennung als auch die Einstiegsniveaus an.

Parameter

Parameter Beschreibung Standard
SarStep Anfangsbeschleunigungsfaktor für den Parabolic SAR. 0.01
SarMax Maximaler Beschleunigungsfaktor für den Parabolic SAR. 0.2
RetraceOffsetPips Abstand (in Pips) zwischen dem SAR-Wert und dem Einstiegsauslöser. 30
StopLossPips Stop-Loss-Abstand in Pips (in absoluten Preis umgerechnet). Auf 0 setzen, um zu deaktivieren. 30
TakeProfitPips Take-Profit-Abstand in Pips (in absoluten Preis umgerechnet). Auf 0 setzen, um zu deaktivieren. 30
CandleType Zeitrahmen für Kerzen und Indikatorberechnungen. 5 Minute

Hinweis: Die Strategie schätzt die Pip-Größe aus den Sicherheitsmetadaten. Wenn das Instrument fünf Dezimalstellen verwendet (typisch für Forex), entspricht ein Pip zehn minimalen Preisschritten.

Order-Management

  • Orders werden zu Marktpreisen platziert, sobald die Rücklaufbedingung erfüllt ist.
  • Die Standard-Handelsgröße beträgt ein Lot (Volume = 1), kann aber über die Basis-Eigenschaft Strategy.Volume vor dem Start der Strategie angepasst werden.
  • StartProtection verwaltet automatisch Stop-Loss- und Take-Profit-Platzierungen unter Verwendung absoluter Preisversätze, die aus den Pip-Einstellungen abgeleitet werden.

Verwendungstipps

  • Passen Sie den Pip-Versatz, Stop und Ziel an die Volatilität des gehandelten Instruments an.
  • Erwägen Sie, die Strategie mit zusätzlichen Filtern (Tageszeit, Volatilität usw.) zu kombinieren, wenn Sie sie in ein breiteres Handelsframework integrieren.
  • Führen Sie immer einen Backtest durch, bevor Sie live einsetzen, da die Profitabilität stark von den Marktbedingungen und der Brokerausführung abhängt.

Unterschiede zum Original-Skript

  • Kontinuierlicher Handel ohne manuelle globale Variablen.
  • Verwendet abgeschlossene Kerzen anstelle von Tick-für-Tick-Überprüfungen, was deterministisches Verhalten für Backtests bietet.
  • Integriertes Risikomanagement durch StockSharp's Protective-Order-Modul.

Haftungsausschluss

Diese Strategie wird zu Bildungszwecken bereitgestellt. Testen Sie gründlich mit historischen Daten und Demo-Daten, bevor Sie echtes Kapital einsetzen.

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>
/// Para Retrace strategy. Uses WMA crossover (7/21).
/// </summary>
public class ParaRetraceStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private decimal? _prevFast;
	private decimal? _prevSlow;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
	public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }

	public ParaRetraceStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
		_fastPeriod = Param(nameof(FastPeriod), 7).SetGreaterThanZero().SetDisplay("Fast WMA", "Fast WMA period", "Indicators");
		_slowPeriod = Param(nameof(SlowPeriod), 21).SetGreaterThanZero().SetDisplay("Slow WMA", "Slow WMA period", "Indicators");
	}

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

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

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevFast = null; _prevSlow = null;
		var fast = new WeightedMovingAverage { Length = FastPeriod };
		var slow = new WeightedMovingAverage { Length = SlowPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fast, slow, ProcessCandle).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
	}

	private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!IsFormedAndOnlineAndAllowTrading()) { _prevFast = fast; _prevSlow = slow; return; }
		if (_prevFast == null || _prevSlow == null) { _prevFast = fast; _prevSlow = slow; return; }
		var prevAbove = _prevFast.Value > _prevSlow.Value;
		var currAbove = fast > slow;
		_prevFast = fast; _prevSlow = slow;
		if (!prevAbove && currAbove && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
		else if (prevAbove && !currAbove && Position >= 0) { if (Position > 0) SellMarket(); SellMarket(); }
	}
}