Auf GitHub ansehen

Strategie zur schrittweisen Positionsaufstockung und -reduzierung

Diese Strategie baut eine Position schrittweise auf, indem sie auf jeder Kerze einen festen Prozentsatz des verfügbaren Kapitals investiert. Wenn der Positionswert ein konfigurierbares Gewinnniveau erreicht, wird ein Teil der Position verkauft und optional ein Teil des realisierten Gewinns zurückgelegt.

Details

  • Einstiegskriterien: Immer kaufen, wenn Kapital verfügbar ist.
  • Ausstiegskriterien: Verkaufen, wenn der Gewinnprozentsatz den Schwellenwert überschreitet.
  • Long/Short: Nur Long.
  • Standardwerte:
    • Buy Scaling Size % = 2
    • Take Profit Level % = 50
    • Take Profit Size % = 1
    • Retain Profit Portion % = 50
    • Minimum Position Value = 200000
    • Minimum Buy Value = 100
  • Filter:
    • Kategorie: Sonstige
    • Richtung: Long
    • Indikatoren: Keine
    • Stops: Nein
    • Komplexität: Moderat
    • Zeitrahmen: Beliebig
    • 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>
/// Scale in scale out strategy using EMA crossover.
/// </summary>
public class ScaleInScaleOutStrategy : 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 ScaleInScaleOutStrategy()
	{
		_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); }
	}
}