Auf GitHub ansehen

Bw WiseMan-1 Ausbruchsstrategie

Diese Strategie ist ein StockSharp-Port des MetaTrader-Expert-Advisors Exp_BW-wiseMan-1. Sie automatisiert Bill Williams' WiseMan-1-Ausbruchslogik, die auf dem Alligator-Indikator aufgebaut ist. Signale werden erzeugt, wenn eine abgeschlossene Kerze aus den Kiefern des Alligators ausbricht und gleichzeitig die jüngsten Swing-Extreme bricht. Ein optionaler Gegentrendmodus tauscht die Signale aus, sodass die Strategie dieselben Ausbrüche verblassen lassen kann.

Kernidee

  • Berechnen Sie den Bill Williams Alligator mit geglätteten gleitenden Durchschnitten des Medianpreises (hoch + tief) / 2.
  • Verschieben Sie die Kiefer-, Zahn- und Lippenlinien nach vorne durch konfigurierbare Versätze, um die Visualisierung des ursprünglichen Indikators zu entsprechen.
  • Bestätigen Sie einen Ausbruch nur, wenn die aktuelle Kerze über die Hochs oder Tiefs der letzten N Balken hinausgeht und sicherstellen, dass die Bewegung stärker als das jüngste Rauschen ist.
  • Verzögern Sie die Ausführung um die ausgewählte Anzahl abgeschlossener Kerzen, damit der Trader bei Bedarf auf ältere Signale reagieren kann.

Handelsregeln

Long-Richtung

  1. Der Balken muss unterhalb aller drei Alligator-Linien enden (Hochpreis kleiner als Kiefer, Zähne und Lippen).
  2. Der Schlusskurs muss sich in der oberen Hälfte der Kerze befinden, d.h. über dem Median der Kerze.
  3. Das Tief der Kerze muss strikt niedriger sein als die Tiefs der vorherigen Back-Balken.
  4. Wenn das Signal nach der SignalBar-Verzögerung aktiv wird:
    • Schließen Sie jeden offenen Short, wenn Close Short aktiviert ist.
    • Eröffnen Sie eine neue Long-Position, wenn Enable Long aktiviert ist und derzeit keine Position offen ist.

Short-Richtung

  1. Der Balken muss oberhalb aller drei Alligator-Linien enden (Tiefpreis größer als Kiefer, Zähne und Lippen).
  2. Der Schlusskurs muss sich in der unteren Hälfte der Kerze befinden, d.h. unter dem Median der Kerze.
  3. Das Hoch der Kerze muss größer sein als die Hochs der vorherigen Back-Balken.
  4. Wenn das Signal aktiv wird:
    • Schließen Sie jeden bestehenden Long, wenn Close Long aktiviert ist.
    • Eröffnen Sie eine neue Short-Position, wenn Enable Short aktiviert ist und keine aktuelle Position vorhanden ist.

Gegentrendmodus

Das Setzen von Counter-Trend Mode auf true tauscht die Kauf- und Verkaufssignale aus, sodass die Strategie Trades gegen die Alligator-Ausbruchsrichtung eingeht.

Parameter

  • Candle Type – Zeitrahmen zur Erstellung von Kerzen und Berechnung aller Indikatorwerte (Standard: 1 Stunde).
  • Counter-Trend Mode – Ausbruchslogik umkehren, um gegen den primären Trend zu handeln (Standard: aktiviert, entsprechend dem ursprünglichen EA).
  • Breakout Depth (Back) – Anzahl der vorherigen Balken, die mit dem aktuellen Hoch/Tief bei der Ausbruchsvalidierung verglichen werden (Standard: 2).
  • Jaw Length / Shift – geglättete MA-Länge und Vorwärtsverschiebung für die Kieferlinie (Standards: 13 / 8).
  • Teeth Length / Shift – geglättete MA-Länge und Vorwärtsverschiebung für die Zahnlinie (Standards: 8 / 5).
  • Lips Length / Shift – geglättete MA-Länge und Vorwärtsverschiebung für die Lippenlinie (Standards: 5 / 3).
  • Signal Bar – Anzahl bereits abgeschlossener Kerzen, die vor der Ausführung eines erkannten Signals gewartet werden sollen (Standard: 1).
  • Enable Long / Enable Short – Schalter zum Öffnen neuer Long- oder Short-Positionen.
  • Close Long / Close Short – Schalter zum Schließen entgegengesetzter Positionen, wenn das Signal ausgelöst wird.

Hinweise

  • Die Strategie verlässt sich ausschließlich auf Market Orders und setzt keine harten Stop-Loss- oder Take-Profit-Niveaus. Jeder Ausstieg wird durch das entgegengesetzte Signal oder durch Deaktivierung des entsprechenden Schließ-Schalters gesteuert.
  • Alle Berechnungen werden auf fertigen Kerzen durchgeführt; partielle Intrabar-Daten werden ignoriert, um mit dem ursprünglichen MetaTrader-Experten konsistent zu bleiben.
  • Das Volumen wird von den StockSharp-Strategieeinstellungen geerbt. Passen Sie das Basisvolumen in der Plattformkonfiguration an, wenn Sie eine andere Positionsgröße benötigen.
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>
/// Bill Williams Wiseman 1 strategy using Alligator-style triple EMA crossover.
/// </summary>
public class BwWiseman1Strategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _jawPeriod;
	private readonly StrategyParam<int> _teethPeriod;
	private readonly StrategyParam<int> _lipsPeriod;

	private decimal? _prevLips;
	private decimal? _prevTeeth;

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

	public int JawPeriod
	{
		get => _jawPeriod.Value;
		set => _jawPeriod.Value = value;
	}

	public int TeethPeriod
	{
		get => _teethPeriod.Value;
		set => _teethPeriod.Value = value;
	}

	public int LipsPeriod
	{
		get => _lipsPeriod.Value;
		set => _lipsPeriod.Value = value;
	}

	public BwWiseman1Strategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe", "General");

		_jawPeriod = Param(nameof(JawPeriod), 34)
			.SetGreaterThanZero()
			.SetDisplay("Jaw Period", "Slow EMA (Jaw)", "Indicators");

		_teethPeriod = Param(nameof(TeethPeriod), 13)
			.SetGreaterThanZero()
			.SetDisplay("Teeth Period", "Medium EMA (Teeth)", "Indicators");

		_lipsPeriod = Param(nameof(LipsPeriod), 5)
			.SetGreaterThanZero()
			.SetDisplay("Lips Period", "Fast EMA (Lips)", "Indicators");
	}

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

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

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

		_prevLips = null;
		_prevTeeth = null;

		var jaw = new SmoothedMovingAverage { Length = JawPeriod };
		var teeth = new SmoothedMovingAverage { Length = TeethPeriod };
		var lips = new SmoothedMovingAverage { Length = LipsPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(jaw, teeth, lips, ProcessCandle)
			.Start();

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

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

		if (!IsFormedAndOnlineAndAllowTrading())
		{
			_prevLips = lipsVal;
			_prevTeeth = teethVal;
			return;
		}

		if (_prevLips == null || _prevTeeth == null)
		{
			_prevLips = lipsVal;
			_prevTeeth = teethVal;
			return;
		}

		// Lips crosses above teeth → buy
		if (_prevLips.Value <= _prevTeeth.Value && lipsVal > teethVal)
		{
			if (Position < 0)
				BuyMarket();
			if (Position <= 0)
				BuyMarket();
		}
		// Lips crosses below teeth → sell
		else if (_prevLips.Value >= _prevTeeth.Value && lipsVal < teethVal)
		{
			if (Position > 0)
				SellMarket();
			if (Position >= 0)
				SellMarket();
		}

		_prevLips = lipsVal;
		_prevTeeth = teethVal;
	}
}