Auf GitHub ansehen

Exp CandlesticksBW Tm-Strategie

Diese Strategie reproduziert den MetaTrader-Experten Exp_CandlesticksBW_Tm auf der StockSharp High-Level-API. Sie basiert auf Bill Williams' Candlesticks BW-Indikator, der Kerzenfarben durch Kombination des Awesome Oscillators (AO) und des Accelerator Oscillators (AC) bemalt. Momentum-Beschleunigung und -Verlangsamung werden durch Farbübergänge der Kerzen erkannt, während ein optionaler Handelssitzungsfilter Einstiege auf bestimmte Intraday-Stunden beschränkt.

Funktionsweise

  1. Abonniert den konfigurierten Zeitrahmen (Standard H4) und fügt jede abgeschlossene Kerze in einen Awesome Oscillator (5/34) ein. Die AO-Serie wird mit einem einfachen gleitenden Durchschnitt von 5 Perioden geglättet, um die Accelerator-Komponente zu erzeugen.
  2. Jede Kerze wird in einen von sechs Farbzuständen klassifiziert: zwei bullische Momentum-Farben (AO und AC steigend), zwei bärische Momentum-Farben (AO und AC fallend) und zwei neutrale Farben (gemischte AO/AC-Richtung). Die Richtung des Kerzenkörpers entscheidet zwischen dem dunkleren oder helleren Ton in jedem Paar.
  3. Ein Ringpuffer speichert die letzten Farbindizes zusammen mit ihren Öffnungszeiten. Der Parameter SignalBar wählt aus, welche historische Bar ausgewertet werden soll (Standard = vorherige Kerze, d.h. Offset 1). Eine Bar weiter zurück wird als Kontext verwendet.
  4. Long-Einstiege werden aktiviert, wenn die ältere Bar zu einer bullischen Momentum-Zone gehörte und die Signalbar diese Zone verlässt. Short-Einstiege spiegeln die Logik mit bärischen Zonen. Ausstiegssignale verwenden dieselben Momentum-Filter, um die entgegengesetzte Richtung zu schließen.
  5. Der optionale Sitzungsfilter (UseTimeFilter) hält ein Handelsprotokoll zwischen StartHour:StartMinute und EndHour:EndMinute. Das Verlassen des Fensters liquidiert offene Positionen sofort und verhindert Übernacht-Exposure.
  6. Stop-Loss- und Take-Profit-Schutzmaßnahmen werden über StartProtection registriert, wobei punktbasierte Abstände in Instrumentenpreisschritte umgerechnet werden.

Handelsregeln

  • Long öffnen: vorheriger Farbindex < 2 (AO und AC nach oben beschleunigend) und der Signalbar-Farbindex > 1. Long-Einstiege werden übersprungen, wenn bereits long oder wenn Longs deaktiviert sind.
  • Short öffnen: vorheriger Farbindex > 3 (AO und AC nach unten beschleunigend) und der Signalbar-Farbindex < 4.
  • Long schließen: ausgelöst, wenn der ältere Farbindex > 3 (bärische Beschleunigung) und Long-Ausstiege aktiviert sind.
  • Short schließen: ausgelöst, wenn der ältere Farbindex < 2 (bullische Beschleunigung) und Short-Ausstiege aktiviert sind.
  • Wenn der Zeitfilter aktiv ist, werden Positionen außerhalb der erlaubten Sitzung zwangsweise geschlossen, auch ohne farbbasierte Ausstiegssignale.

Parameter

Name Beschreibung Standard
CandleType Zeitrahmen für AO/AC-Berechnungen. TimeSpan.FromHours(4).TimeFrame()
Volume Ordergröße für neue Einstiege. 1m
SignalBar Anzahl abgeschlossener Kerzen, die vor der Signalauswertung übersprungen werden (1 = vorherige Kerze). 1
StopLossPoints Schutzstop-Abstand in Instrumentenpunkten. Setzen Sie 0 zum Deaktivieren. 1000m
TakeProfitPoints Gewinnziel-Abstand in Instrumentenpunkten. Setzen Sie 0 zum Deaktivieren. 2000m
EnableLongEntries, EnableShortEntries Eröffnung von Trades in der jeweiligen Richtung erlauben. true
EnableLongExits, EnableShortExits Schließen von Trades in der jeweiligen Richtung erlauben. true
UseTimeFilter Handelssitzungsbeschränkungen aktivieren. true
StartHour, StartMinute, EndHour, EndMinute Sitzungsgrenzen (inklusive Beginn, exklusive Ende bei identischen Stunden). 0/0/23/59

Hinweise

  • Die Strategie synchronisiert automatisch die Stop-Loss- und Take-Profit-Abstände mit dem Instrumentenpreisschritt.
  • Signale werden mit der Schlusszeit der ausgewerteten Bar zeitgestempelt, sodass wiederholte Trades innerhalb derselben Bar unterdrückt werden.
  • Es wird keine Python-Version bereitgestellt, entsprechend der Struktur des MQL-Quellpakets.
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>
/// Bill Williams Candlesticks BW strategy (simplified).
/// Uses candle body direction with SMA trend filter.
/// </summary>
public class ExpCandlesticksBwTimeStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _smaLength;

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

	public int SmaLength
	{
		get => _smaLength.Value;
		set => _smaLength.Value = value;
	}

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

		_smaLength = Param(nameof(SmaLength), 34)
			.SetGreaterThanZero()
			.SetDisplay("SMA Length", "Bill Williams median line proxy", "Indicators");
	}

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

		var sma = new SimpleMovingAverage { Length = SmaLength };

		int bullCount = 0, bearCount = 0;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(sma, (ICandleMessage candle, decimal smaValue) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var isBullish = candle.ClosePrice > candle.OpenPrice;
				var isBearish = candle.ClosePrice < candle.OpenPrice;

				if (isBullish)
				{
					bullCount++;
					bearCount = 0;
				}
				else if (isBearish)
				{
					bearCount++;
					bullCount = 0;
				}

				// 3 consecutive bullish candles above SMA
				if (bullCount >= 3 && candle.ClosePrice > smaValue && Position <= 0)
				{
					BuyMarket();
					bullCount = 0;
				}
				// 3 consecutive bearish candles below SMA
				else if (bearCount >= 3 && candle.ClosePrice < smaValue && Position >= 0)
				{
					SellMarket();
					bearCount = 0;
				}
			})
			.Start();

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