Auf GitHub ansehen

TPSL Insert-Strategie

Diese Strategie ist eine StockSharp-Übersetzung des MetaTrader 4-Skripts TPSL-Insert.mq4. Sie generiert keine Ein- oder Ausstiegssignale. Ihr einziger Zweck ist es, Take-Profit- und Stop-Loss-Aufträge an bestehende Positionen anzuhängen.

Funktionsweise

  1. Beim Start liest die Strategie die Parameter TakeProfitPips und StopLossPips.
  2. Die Werte werden von Pips in Preis umgerechnet, mithilfe des PriceStep des Wertpapiers.
  3. StartProtection wird aufgerufen, um Schutzaufträge zu platzieren.
    • Wenn bereits eine Position vorhanden ist, werden Schutzaufträge sofort gesendet.
    • Zukünftige von der Strategie eröffnete Positionen werden automatisch geschützt.

Dieses Verhalten ist nützlich, wenn Positionen manuell oder durch externe Systeme geöffnet werden und Sie schnell Risikolimits einfügen müssen.

Parameter

Name Beschreibung Standard
TakeProfitPips Take-Profit-Abstand in Pips. 35
StopLossPips Stop-Loss-Abstand in Pips. 100

Hinweise

  • Die Strategie abonniert keine Marktdaten und enthält keine Handelslogik.
  • StartProtection übernimmt die Erstellung und Stornierung von Schutzaufträgen.
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>
/// EMA crossover strategy with take-profit and stop-loss protection.
/// </summary>
public class TpslInsertStrategy : Strategy
{
	private readonly StrategyParam<int> _fastLength;
	private readonly StrategyParam<int> _slowLength;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevDiff;

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

	public TpslInsertStrategy()
	{
		_fastLength = Param(nameof(FastLength), 8)
			.SetGreaterThanZero()
			.SetDisplay("Fast EMA", "Fast EMA period", "General");

		_slowLength = Param(nameof(SlowLength), 21)
			.SetGreaterThanZero()
			.SetDisplay("Slow EMA", "Slow EMA period", "General");

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

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

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevDiff = 0;
	}

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

		var emaFast = new ExponentialMovingAverage { Length = FastLength };
		var emaSlow = new ExponentialMovingAverage { Length = SlowLength };

		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(emaFast, emaSlow, ProcessCandle).Start();

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

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

		var diff = fast - slow;
		var crossUp = _prevDiff <= 0 && diff > 0;
		var crossDown = _prevDiff >= 0 && diff < 0;
		_prevDiff = diff;

		if (crossUp && Position <= 0)
			BuyMarket();
		else if (crossDown && Position >= 0)
			SellMarket();
	}
}