Auf GitHub ansehen

Bulls Bears Eyes-Strategie

Überblick

Diese Strategie bewertet das Gleichgewicht zwischen bullischem und bärischem Druck mithilfe der Indikatoren Bulls Power und Bears Power. Die beiden Indikatoren werden zu einem einzigen Oszillator zusammengefasst, der von 0 bis 100 skaliert ist. Hohe Werte zeigen die Dominanz der Käufer an, während niedrige Werte auf die Stärke der Verkäufer hinweisen.

Handelsentscheidungen basieren auf Schwellenwerten ähnlich dem ursprünglichen Experten BullsBearsEyes. Wenn der Oszillator den Überkauft-Pegel überschreitet, nachdem er darunter war, wird eine Long-Position eröffnet und jede Short-Position geschlossen. Umgekehrt löst ein Unterschreiten des Überverkauft-Niveaus einen Short-Einstieg aus und schließt bestehende Longs. Neutrale Werte zwischen den Schwellen halten die aktuelle Position, schließen aber gegensätzliche Trades.

Parameter

  • Period – Mittelungszeitraum für Bulls/Bears Power (Standard: 13).
  • High Level – Überkauft-Schwelle, die Long-Signale generiert (Standard: 75).
  • Middle Level – Referenz-Mittelniveau für die Trendinterpretation (Standard: 50).
  • Low Level – Überverkauft-Schwelle, die Short-Signale generiert (Standard: 25).
  • Candle Type – Zeitrahmen der von der Strategie verarbeiteten Kerzen (Standard: 4‑Stunden-Kerzen).

Ein- und Ausstiegsregeln

  1. Bulls Power und Bears Power für jede Kerze berechnen und den Oszillatorwert zwischen 0 und 100 ableiten.
  2. Long-Einstieg: Oszillator kreuzt High Level von unten nach oben. Jede Short-Position wird vor dem Long-Einstieg geschlossen.
  3. Short-Einstieg: Oszillator kreuzt Low Level von oben nach unten. Jede bestehende Long-Position wird vor dem Short-Einstieg geschlossen.
  4. Positionsausstieg: Wenn der Oszillator die Seiten wechselt (ober-/unterhalb der mittleren Zone), wird die entgegengesetzte Position geschlossen.

Der Oszillator wird auch zusammen mit den Kerzen für die visuelle Analyse dargestellt.

Hinweise

  • Die Strategie verwendet die High-Level-API SubscribeCandles und Bind für die Indikatorverarbeitung.
  • Schutzmechanismen werden beim Start über StartProtection() aktiviert.
  • Nur abgeschlossene Kerzen werden ausgewertet, um vorzeitige Signale zu vermeiden.
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>
/// EMA crossover strategy.
/// </summary>
public class BullsBearsEyesStrategy : Strategy
{
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevFast;
	private decimal _prevSlow;
	private bool _hasPrev;

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

	public BullsBearsEyesStrategy()
	{
		_fastPeriod = Param(nameof(FastPeriod), 13)
			.SetGreaterThanZero()
			.SetDisplay("Fast Period", "Fast EMA period", "Parameters");
		_slowPeriod = Param(nameof(SlowPeriod), 26)
			.SetGreaterThanZero()
			.SetDisplay("Slow Period", "Slow EMA period", "Parameters");
		_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();
		_prevFast = 0;
		_prevSlow = 0;
		_hasPrev = false;
	}

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

		var fast = new ExponentialMovingAverage { Length = FastPeriod };
		var slow = new ExponentialMovingAverage { Length = SlowPeriod };

		SubscribeCandles(CandleType)
			.Bind(fast, slow, ProcessCandle)
			.Start();
	}

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

		if (!_hasPrev)
		{
			_prevFast = fastVal;
			_prevSlow = slowVal;
			_hasPrev = true;
			return;
		}

		var crossUp = _prevFast <= _prevSlow && fastVal > slowVal;
		var crossDown = _prevFast >= _prevSlow && fastVal < slowVal;

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

		_prevFast = fastVal;
		_prevSlow = slowVal;
	}
}