Auf GitHub ansehen

TrendGuard-Flag-Finder-Strategie

TrendGuard Flag Finder erkennt bullische und bärische Flaggenmuster, die durch SuperTrend bestätigt werden. Kauft, wenn der Preis über eine bullische Flagge ausbricht, und verkauft, wenn er unter eine bärische Flagge fällt.

Details

  • Einstiegskriterien: Flaggenausbruch mit SuperTrend-Bestätigung
  • Long/Short: Konfigurierbar
  • Ausstiegskriterien: Entgegengesetzter Flaggenausbruch
  • Stops: Nein
  • Standardwerte:
    • TradingDirection = Both
    • SuperTrend Length = 10
    • SuperTrend Factor = 4
    • MaxFlagDepth = 5
    • MinFlagLength = 3
    • MaxFlagLength = 7
    • MaxFlagRally = 5
    • MinBearFlagLength = 3
    • MaxBearFlagLength = 7
    • PoleMin = 3
    • PoleLength = 7
    • PoleMinBear = 3
    • PoleLengthBear = 7
  • Filter:
    • Kategorie: Muster
    • Richtung: Konfigurierbar
    • Indikatoren: SuperTrend, Lowest, Highest
    • Stops: Nein
    • Komplexität: Fortgeschritten
    • Zeitrahmen: Intraday
    • Saisonalität: Nein
    • Neuronale Netze: Nein
    • Divergenz: Nein
    • Risikolevel: Mittel
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>
/// TrendGuard Flag Finder strategy using EMA crossover.
/// </summary>
public class TrendGuardFlagFinderStrategy : Strategy
{
	private readonly StrategyParam<int> _slowLength;
	private readonly StrategyParam<DataType> _candleType;

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

	public TrendGuardFlagFinderStrategy()
	{
		_slowLength = Param(nameof(SlowLength), 40)
			.SetGreaterThanZero()
			.SetDisplay("Slow Length", "Slow EMA period", "General");

		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candle type", "General");
	}

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

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		var fast = new ExponentialMovingAverage { Length = 14 };
		var slow = new ExponentialMovingAverage { Length = SlowLength };
		var prevF = 0m; var prevS = 0m; var init = false;
		var lastSignal = DateTimeOffset.MinValue;
		var cooldown = TimeSpan.FromMinutes(360);
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fast, slow, (candle, f, s) =>
		{
			if (candle.State != CandleStates.Finished) return;
			if (!fast.IsFormed || !slow.IsFormed) return;
			if (!init) { prevF = f; prevS = s; init = true; return; }
			if (candle.OpenTime - lastSignal >= cooldown)
			{
				if (prevF <= prevS && f > s && Position <= 0) { BuyMarket(); lastSignal = candle.OpenTime; }
				else if (prevF >= prevS && f < s && Position >= 0) { SellMarket(); lastSignal = candle.OpenTime; }
			}
			prevF = f; prevS = s;
		}).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
	}
}