Auf GitHub ansehen

KWAN CCC-Strategie

Übersicht

Die KWAN CCC-Strategie reproduziert den MetaTrader-Experten Exp_KWAN_CCC.mq5 mithilfe der High-Level-API von StockSharp. Das System leitet Handelssignale aus einem benutzerdefinierten Oszillator ab, der wie folgt aufgebaut ist:

  1. Berechnung des Chaikin-Oszillators (Differenz zwischen schnellem und langsamem gleitendem Durchschnitt der Akkumulations-/Distributions-Linie).
  2. Multiplikation des Chaikin-Werts mit dem Commodity Channel Index (CCI).
  3. Division des Ergebnisses durch den Momentum-Indikatorwert. Wenn Momentum gleich null ist, ersetzt das Skript einen konstanten Wert von 100, um eine Division durch null zu vermeiden – genau wie der Originalcode.
  4. Glättung der resultierenden Reihe mit der vom Benutzer gewählten XMA-Methode.
  5. Erkennung der Steigung der geglätteten Reihe. Steigende Balken werden mit 0 gefärbt, fallende Balken mit 2, andernfalls 1.

Wenn sich die Farbe von 0 zu etwas anderem ändert, schließt die Strategie Shorts und eröffnet eine Long-Position. Wenn sich die Farbe von 2 zu etwas anderem ändert, schließt sie Longs und eröffnet einen Short. Dies spiegelt die im MQL-Experten implementierte Logik wider, einschließlich der optionalen Signalverschiebung (SignalBar).

Handelsregeln

  • Long-Einstieg: Farbe auf dem Balken bei SignalBar + 1 ist gleich 0 und der Balken bei SignalBar unterscheidet sich von 0.
  • Short-Einstieg: Farbe auf dem Balken bei SignalBar + 1 ist gleich 2 und der Balken bei SignalBar unterscheidet sich von 2.
  • Long-Ausstieg: aktiviert, wenn EnableLongExits = true und die Short-Einstiegsbedingung ausgelöst wird.
  • Short-Ausstieg: aktiviert, wenn EnableShortExits = true und die Long-Einstiegsbedingung ausgelöst wird.
  • Schutz-Stop- und Zielorders werden über StartProtection mit absoluten Preisoffsets erstellt, die aus StopLossPoints und TakeProfitPoints multipliziert mit dem PriceStep des Instruments abgeleitet werden.

Parameter

Parameter Beschreibung
OrderVolume Basis-Ordergröße beim Eröffnen einer neuen Position.
CandleType Zeitrahmen für alle Indikatorberechnungen. Standard ist 1 Stunde.
FastPeriod / SlowPeriod Längen der gleitenden Durchschnitte im Chaikin-Oszillator.
ChaikinMethod Typ des gleitenden Durchschnitts (einfach, exponentiell, geglättet, gewichtet) für die Akkumulations-/Distributions-Linie.
CciPeriod Periode des Commodity Channel Index.
MomentumPeriod Periode des Momentum-Indikators.
SmoothingMethod XMA-Glättungsmethode, gemappt aus den Originaloptionen. JurX, Parabolic und T3 fallen auf Jurik MA zurück; Vidya verwendet eine adaptiv geglättete Methode basierend auf dem Chande-Momentum-Oszillator; Adaptive verwendet Kaufman AMA.
SmoothingLength Anzahl der Balken, die vom gewählten Glättungsfilter verwendet werden.
SmoothingPhase Zusätzlicher Parameter für bestimmte Methoden (z. B. VIDYA CMO-Länge, AMA-Langsamperiode).
SignalBar Offset (in abgeschlossenen Balken) zur Auswertung der Farbübergänge. 1 reproduziert den MetaTrader-Standard.
EnableLongEntries / EnableShortEntries Eröffnung neuer Positionen in der entsprechenden Richtung erlauben oder blockieren.
EnableLongExits / EnableShortExits Indikatorbetriebenes Positionsschließen erlauben oder blockieren.
StopLossPoints / TakeProfitPoints Schutz-Stop/Ziel gemessen in Preisschritten (auf null setzen zum Deaktivieren).

Implementierungshinweise

  • Die Strategie agiert nur auf abgeschlossenen Kerzen und verwendet StockSharp's Bind-Helfer, um Kerzendaten in die Indikatoren zu streamen.
  • Die Liste der Glättungsmethoden spiegelt die XMA-Implementierung aus der Originalbibliothek wider. Methoden, die in StockSharp nicht verfügbar sind, werden der nächsten Alternative zugeordnet, wie in der Parametertabelle angegeben.
  • MetaTraders VolumeType-Eingabe wird weggelassen, da StockSharp-Kerzen bereits die gesamten Volumeninformationen enthalten, die von der Akkumulations-/Distributions-Linie benötigt werden.
  • Das Geldmanagement im Original-Experten basierte auf benutzerdefinierten Lot-Sizing-Helfern. Die Konvertierung geht von einem festen Volumen aus, das durch OrderVolume angegeben wird.

Verwendungshinweise

  • Stellen Sie sicher, dass das Instrument aussagekräftige Volumendaten liefert, wenn das Verhalten des Chaikin-Oszillators wichtig ist. Bei illiquiden Instrumenten sollten Sie MomentumPeriod erhöhen, um Rauschen zu reduzieren.
  • Kombinieren Sie beim Optimieren der Glättungsparameter SmoothingLength und SmoothingPhase sorgfältig: Extreme Kombinationen können Signale erheblich verzögern.
  • Die Standard-Schutzwerte (StopLossPoints = 1000, TakeProfitPoints = 2000) entsprechen großen Offsets. Passen Sie sie an die Tick-Größe des Instruments an.
namespace StockSharp.Samples.Strategies;

using System;

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

/// <summary>
/// Strategy converted from the KWAN_CCC expert advisor.
/// Uses CCI and Momentum to detect trend transitions.
/// Enters long when CCI turns up while momentum is positive,
/// enters short when CCI turns down while momentum is negative.
/// </summary>
public class KwanCccStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _cciPeriod;

	private decimal _prevCci;
	private decimal _prevClose;
	private bool _initialized;

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

	public int CciPeriod
	{
		get => _cciPeriod.Value;
		set => _cciPeriod.Value = value;
	}

	public KwanCccStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe for calculations", "General");

		_cciPeriod = Param(nameof(CciPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("CCI Period", "CCI length", "Indicators");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevCci = 0m;
		_prevClose = 0m;
		_initialized = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		_prevCci = 0m;
		_prevClose = 0m;
		_initialized = false;

		var cci = new CommodityChannelIndex { Length = CciPeriod };

		var subscription = SubscribeCandles(CandleType);

		subscription
			.Bind(cci, (ICandleMessage candle, decimal cciValue) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (!_initialized)
				{
					_prevCci = cciValue;
					_prevClose = candle.ClosePrice;
					_initialized = true;
					return;
				}

				var closeUp = candle.ClosePrice > _prevClose;
				var closeDown = candle.ClosePrice < _prevClose;

				// Buy when CCI crosses into positive territory and price confirms the move.
				if (_prevCci <= 0m && cciValue > 0m && closeUp && Position <= 0)
				{
					BuyMarket();
				}
				// Sell when CCI crosses into negative territory and price confirms the move.
				else if (_prevCci >= 0m && cciValue < 0m && closeDown && Position >= 0)
				{
					SellMarket();
				}

				_prevCci = cciValue;
				_prevClose = candle.ClosePrice;
			})
			.Start();

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