Auf GitHub ansehen

Brake Parabolic-Strategie

Die Strategie implementiert den Brake Parabolic-Indikator, der eine parabolische Barriere ober- oder unterhalb des Preises projiziert. Wenn die Barriere durchbrochen wird, kehrt sich der Trend um und eine neue Position in Richtung des Ausbruchs wird eröffnet. Der Algorithmus verfolgt den Extrempreis mit einer Kurve, die durch die Parameter A, B und Shift definiert ist.

Tests zeigen eine durchschnittliche Jahresrendite von etwa 48%. Am besten funktioniert die Strategie in Trendmärkten auf höheren Zeitrahmen.

Das System wartet darauf, dass die Barriere die Seite wechselt. Ein bullischer Flip schließt alle Short-Positionen und eröffnet eine neue Long-Position. Ein bärischer Flip schließt alle Long-Positionen und eröffnet eine Short-Position. Während eines Trends werden entgegengesetzte Positionen geschlossen, wenn der Indikator die Richtung bestätigt.

Details

  • Einstiegskriterien:
    • Long: Barriere wechselt von oberhalb des Preises zu unterhalb des Preises.
    • Short: Barriere wechselt von unterhalb des Preises zu oberhalb des Preises.
  • Long/Short: Beide Richtungen.
  • Ausstiegskriterien: Entgegengesetztes Signal oder Indikator bestätigt Gegentrend.
  • Stops: Keine festen Stops; Ausstiege basieren auf Barriereumkehr.
  • Standardwerte:
    • A = 1.5
    • B = 1.0
    • BeginShift = 10
    • CandleType = 4-Stunden-Zeitrahmen
  • Filter:
    • Kategorie: Trend
    • Richtung: Beide
    • Indikatoren: Benutzerdefiniert
    • Stops: Nein
    • Komplexität: Moderat
    • Zeitrahmen: Swing
    • Saisonalität: Nein
    • Neuronale Netze: Nein
    • Divergenz: Nein
    • Risikolevel: Mittel
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>
/// Parabolic SAR crossover strategy.
/// </summary>
public class BrakeParabolicStrategy : Strategy
{
	private readonly StrategyParam<decimal> _sarStep;
	private readonly StrategyParam<decimal> _sarMax;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevClose;
	private decimal _prevSar;
	private bool _hasPrev;

	public decimal SarStep { get => _sarStep.Value; set => _sarStep.Value = value; }
	public decimal SarMax { get => _sarMax.Value; set => _sarMax.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public BrakeParabolicStrategy()
	{
		_sarStep = Param(nameof(SarStep), 0.02m)
			.SetDisplay("SAR Step", "Acceleration step", "Indicators");
		_sarMax = Param(nameof(SarMax), 0.2m)
			.SetDisplay("SAR Max", "Maximum acceleration", "Indicators");
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Candle type", "General");
	}

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

	protected override void OnReseted()
	{
		base.OnReseted();
		_prevClose = 0;
		_prevSar = 0;
		_hasPrev = false;
	}

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

		var sar = new ParabolicSar { AccelerationStep = SarStep, AccelerationMax = SarMax };

		SubscribeCandles(CandleType)
			.Bind(sar, ProcessCandle)
			.Start();
	}

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

		var close = candle.ClosePrice;

		if (!_hasPrev)
		{
			_prevClose = close;
			_prevSar = sarVal;
			_hasPrev = true;
			return;
		}

		var crossUp = _prevClose <= _prevSar && close > sarVal;
		var crossDown = _prevClose >= _prevSar && close < sarVal;

		if (crossUp && Position <= 0)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
		}
		else if (crossDown && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
		}

		_prevClose = close;
		_prevSar = sarVal;
	}
}