Auf GitHub ansehen

AMkA Signal-Strategie

Überblick

Diese Strategie verwendet die Ableitung des Kaufman Adaptive Moving Average (KAMA) kombiniert mit einem Volatilitätsfilter auf Basis der Standardabweichung. Eine Long-Position wird eröffnet, wenn die Änderungsrate von KAMA einen dynamischen Schwellenwert überschreitet; eine Short-Position wird eröffnet, wenn sie unter den negativen Schwellenwert fällt. Der Schwellenwert wird berechnet, indem die Standardabweichung der KAMA-Änderungen mit einem benutzerdefinierten Faktor multipliziert wird.

Parameter

  • KAMA Length – Rückschauperiode für den KAMA-Indikator.
  • Fast Period – schnelle EMA-Periode für die KAMA-Glättung.
  • Slow Period – langsame EMA-Periode für die KAMA-Glättung.
  • Deviation Multiplier – Multiplikator für die Standardabweichung zur Bildung des Signalschwellenwerts.
  • Take Profit – Prozentsatz zur automatischen Gewinnfixierung.
  • Stop Loss – Prozentsatz für den Schutzstop.
  • Candle Type – Kerzen-Zeitrahmen für Berechnungen.

Handelslogik

  1. Kerzen des ausgewählten Zeitrahmens abonnieren.
  2. KAMA für jede Kerze berechnen und die Änderung gegenüber dem Vorwert ermitteln.
  3. Den Standardabweichungsindikator mit den Änderungswerten aktualisieren.
  4. Wenn die Änderung Deviation Multiplier * StdDev überschreitet, Positionen öffnen oder schließen:
    • Änderung größer als der Schwellenwert: Short-Positionen schließen und Long öffnen.
    • Änderung kleiner als der negative Schwellenwert: Long-Positionen schließen und Short öffnen.
  5. Schutzaufträge für Take-Profit und Stop-Loss werden automatisch über StartProtection verwaltet.

Hinweise

Die Strategie arbeitet nur mit abgeschlossenen Kerzen und verwendet Tabulatoren zur Einrückung im Quellcode. Alle Kommentare sind auf Englisch verfasst.

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>
/// AMkA based strategy using KAMA derivative and standard deviation filter.
/// Buys when KAMA rises above volatility threshold and sells when it falls below.
/// </summary>
public class AmkaSignalStrategy : Strategy
{
	private readonly StrategyParam<int> _length;
	private readonly StrategyParam<decimal> _deviationMultiplier;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevKama;
	private bool _hasPrev;

	public int Length { get => _length.Value; set => _length.Value = value; }
	public decimal DeviationMultiplier { get => _deviationMultiplier.Value; set => _deviationMultiplier.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public AmkaSignalStrategy()
	{
		_length = Param(nameof(Length), 10)
			.SetGreaterThanZero()
			.SetDisplay("KAMA Length", "Lookback period for the adaptive moving average", "Indicator");

		_deviationMultiplier = Param(nameof(DeviationMultiplier), 1.0m)
			.SetGreaterThanZero()
			.SetDisplay("Deviation Multiplier", "Multiplier for standard deviation filter", "Indicator");

		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe for indicator calculation", "General");
	}

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

	protected override void OnReseted()
	{
		base.OnReseted();
		_prevKama = 0;
		_hasPrev = false;
	}

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

		var kama = new KaufmanAdaptiveMovingAverage { Length = Length };
		var stdev = new StandardDeviation { Length = Length };

		SubscribeCandles(CandleType).Bind(kama, stdev, ProcessCandle).Start();
	}

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

		if (!_hasPrev)
		{
			_prevKama = kamaValue;
			_hasPrev = true;
			return;
		}

		var delta = kamaValue - _prevKama;
		_prevKama = kamaValue;

		if (stdevValue <= 0) return;

		var threshold = stdevValue * DeviationMultiplier;

		if (delta > threshold && Position <= 0)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
		}
		else if (delta < -threshold && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
		}
	}
}