Auf GitHub ansehen

Range-Breakout-Strategie

Die Strategie misst die höchsten und niedrigsten Preise innerhalb der letzten RangePeriod Kerzen. Wenn die Kerze außerhalb dieser Spanne schließt und die Gesamtbreite der Spanne kleiner als MaxRangePoints ist, geht die Strategie in die Ausbruchsrichtung über.

Teilnahmebedingungen

  • Long: Kerzenschluss >= höchstes Hoch des Lookback-Bereichs UND Bereich in Punkten <= MaxRangePoints UND keine offene Position.
  • Short: Kerzenschluss <= niedrigstes Tief des Lookback-Bereichs UND Bereich in Punkten <= MaxRangePoints UND keine offene Position.

Ausgangsregeln

  • Schützender Stop-Loss und Take-Profit werden sofort nach Eröffnung der Position angewendet.
  • Es werden keine zusätzlichen Ausstiegsregeln verwendet; Die Position bleibt geöffnet, bis der Schutz sie schließt.

Parameter

  • RangePeriod – Anzahl der Kerzen für die Höchst-/Tiefstberechnung.
  • MaxRangePoints – maximale Breite des Bereichs in Punkten, um den Handel zu ermöglichen.
  • CandleType – Zeitrahmen der Kerzen, die für Analyse und Handel verwendet werden.
  • Volume – Market-Order-Volumen.
  • StopLossPoints – Stop-Loss-Distanz in Punkten.
  • TakeProfitPoints – Take-Profit-Distanz in Punkten.

Indikatoren

  • Höchste
  • Am niedrigsten
using System;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Range Breakout strategy: Highest/Lowest channel breakout.
/// Buys when close >= highest. Sells when close <= lowest.
/// </summary>
public class RangeBreakoutStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _channelPeriod;

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

	public int ChannelPeriod
	{
		get => _channelPeriod.Value;
		set => _channelPeriod.Value = value;
	}

	public RangeBreakoutStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");

		_channelPeriod = Param(nameof(ChannelPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("Channel Period", "Lookback period", "Indicators");
	}

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

		var high = new Highest { Length = ChannelPeriod };
		var low = new Lowest { Length = ChannelPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(high, low, ProcessCandle)
			.Start();

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

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

		if (!IsFormedAndOnlineAndAllowTrading())
			return;

		if (candle.ClosePrice >= high && Position <= 0)
			BuyMarket();
		else if (candle.ClosePrice <= low && Position >= 0)
			SellMarket();
	}
}