Auf GitHub ansehen

Drei Soldaten Stochastic Strategie

Diese Strategie reproduziert den MetaTrader-Experten Expert_ABC_WS_Stoch.mq5, der klassische Drei-Kerzen-Umkehrmuster mit einer Stochastic-Oszillatorbestätigung kombiniert. Ein Long-Signal erfordert die bullische „Three White Soldiers“-Formation zusammen mit einer überverkauften Stochastic-Signallinie, während ein Short-Signal auf der bärischen „Three Black Crows“-Formation basiert, die durch eine überkaufte Stochastic bestätigt wird. Die Ausgangslogik überwacht Überkreuzungen der Signalleitung über konfigurierbare Bänder bis hin zu Schließpositionen.

Handelslogik

  1. Mustererkennung
    • Verfolgen Sie die letzten drei abgeschlossenen Kerzen.
    • Identifizieren Sie drei weiße Soldaten, wenn alle drei Kerzen bullisch sind und jeder Schlusskurs höher ist als der vorherige.
    • Identifizieren Sie Three Black Crows, wenn alle drei Kerzen bärisch sind und jeder Schlusskurs niedriger ist als der vorherige.
  2. Oszillatorbestätigung
    • Berechnen Sie einen Stochastic-Oszillator mit %K-, %D- und Slowing-Perioden, die mit denen des ursprünglichen Experten identisch sind (standardmäßig 47, 9, 13).
    • Verwenden Sie die Signalleitung (%D) als Bestätigung:
      • Geben Sie „long“ ein, wenn der Wert der vorherigen Signallinie unter dem Überverkaufsschwellenwert liegt (Standard: 30).
      • Geben Sie Short ein, wenn der vorherige Signallinienwert über dem Überkauft-Schwellenwert liegt (Standard: 70).
  3. Ausstiegsbedingungen
    • Schließen Sie einen Long-Trade, wenn die Signallinie die untere oder obere Ausstiegsschwelle überschreitet (Standard: 20 und 80).
    • Schließen Sie einen Short-Trade, wenn die Signallinie wieder unter diese Schwellenwerte fällt.
    • Beide Ausgangsprüfungen stützen sich auf die vorherigen und vorherigen Signalleitungswerte, um echte Überkreuzungen zu erkennen.

Parameter

Name Standard Beschreibung
CandleType 1h Zeitrahmen Zeitrahmen für das Kerzenabonnement.
StochKPeriod 47 Lookback-Zeitraum für %K.
StochDPeriod 9 Gleitende durchschnittliche Länge der Signalleitung.
StochSlowing 13 Zusätzliche Glättung wurde auf %K angewendet.
OversoldLevel 30 Signalleitungspegel zur Bestätigung einer langen Eingabe erforderlich.
OverboughtLevel 70 Signalleitungspegel zur Bestätigung einer kurzen Eingabe erforderlich.
ExitLowerLevel 20 Untere Grenze, die für lange Ausgangs-Crossovers verwendet wird.
ExitUpperLevel 80 Obergrenze für kurze Ausgangskreuzungen.

Alle numerischen Parameter unterstützen Optimierungsbereiche, die der Vorlage MetaTrader entsprechen, sodass das Verhalten über den Strategie-Designer fein abgestimmt werden kann.

Orderverwaltung

  • Die Strategie kehrt die Positionen um, wenn ein entgegengesetztes Signal auftritt, indem die absolute Größe der aktuellen Position zum konfigurierten Volume addiert wird.
  • StartProtection() ist für die Integration in die Risikokontrollen der Plattform aktiviert, obwohl standardmäßig keine expliziten Stop-Loss- oder Take-Profit-Werte erzwungen werden.

Visualisierung

Bei der Ausführung im Strategie-Designer zeichnet sich die Strategie durch Folgendes aus:

  • Preiskerzen für das ausgewählte Symbol und den ausgewählten Zeitrahmen.
  • Der konfigurierte Stochastic-Oszillator.
  • Handelsmarkierungen zur Markierung von Ein- und Ausgängen.

Nutzungshinweise

  • Stellen Sie sicher, dass das Instrument genügend Historie liefert, damit sich der Stochastic-Oszillator aufwärmen kann, bevor Signale erwartet werden.
  • Erwägen Sie, die Strategie bei der Live-Bereitstellung mit zusätzlichen Risikofiltern (Volatilität, Sitzungsfilter usw.) zu kombinieren.
  • Die Schwellenwerte werden als Parameter bereitgestellt und ermöglichen ein schnelles Experimentieren mit verschiedenen Bestätigungsbändern, ohne Code bearbeiten zu müssen.
namespace StockSharp.Samples.Strategies;

using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;

/// <summary>
/// Three Soldiers Stochastic strategy: detects three consecutive bullish/bearish candles
/// confirmed by RSI levels.
/// </summary>
public class ThreeSoldiersStochasticStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<int> _signalCooldownCandles;

	private int _bullCount;
	private int _bearCount;
	private int _candlesSinceTrade;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
	public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }

	public ThreeSoldiersStochasticStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_rsiPeriod = Param(nameof(RsiPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI Period", "RSI period for confirmation", "Indicators");
		_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 6)
			.SetGreaterThanZero()
			.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_bullCount = 0;
		_bearCount = 0;
		_candlesSinceTrade = SignalCooldownCandles;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_bullCount = 0;
		_bearCount = 0;
		_candlesSinceTrade = SignalCooldownCandles;
		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(rsi, ProcessCandle).Start();
	}

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

		if (_candlesSinceTrade < SignalCooldownCandles)
			_candlesSinceTrade++;

		if (candle.ClosePrice > candle.OpenPrice)
		{
			_bullCount++;
			_bearCount = 0;
		}
		else if (candle.ClosePrice < candle.OpenPrice)
		{
			_bearCount++;
			_bullCount = 0;
		}
		else
		{
			_bullCount = 0;
			_bearCount = 0;
		}

		if (_bullCount >= 3 && rsi < 65 && Position <= 0 && _candlesSinceTrade >= SignalCooldownCandles)
		{
			BuyMarket();
			_bullCount = 0;
			_candlesSinceTrade = 0;
		}
		else if (_bearCount >= 3 && rsi > 35 && Position >= 0 && _candlesSinceTrade >= SignalCooldownCandles)
		{
			SellMarket();
			_bearCount = 0;
			_candlesSinceTrade = 0;
		}
	}
}