Auf GitHub ansehen

Strategie My Line Order

Diese Strategie löst Marktorders aus, wenn der Preis vordefinierte horizontale Niveaus kreuzt. Der Benutzer legt separate Niveaus für Long- und Short-Einstiege sowie Risikoparameter in Pips fest. Nach dem Öffnen einer Position verfolgt die Strategie Stop-Loss, Take-Profit und einen optionalen Trailing Stop.

Das System eignet sich für diskretionäre Setups, bei denen die Einstiegsniveaus im Voraus bekannt sind. Es funktioniert mit jedem Instrument und Zeitrahmen, da es nur auf Preisniveaus basiert.

Details

  • Einstiegskriterien:
    • Long: Schlusskurs kreuzt über BuyPrice.
    • Short: Schlusskurs kreuzt unter SellPrice.
  • Long/Short: Beide Seiten.
  • Ausstiegskriterien:
    • Stop-Loss bei StopLossPips.
    • Take-Profit bei TakeProfitPips.
    • Trailing Stop wenn TrailingStopPips > 0.
  • Stops: Ja, in Pips.
  • Standardwerte:
    • BuyPrice = 0 (deaktiviert)
    • SellPrice = 0 (deaktiviert)
    • TakeProfitPips = 30
    • StopLossPips = 20
    • TrailingStopPips = 0
    • CandleType = TimeSpan.FromMinutes(1)
  • Filter:
    • Kategorie: Manuell
    • Richtung: Beide
    • Indikatoren: Keine
    • Stops: Ja
    • Komplexität: Grundlegend
    • 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>
/// Line order strategy using SMA as dynamic support/resistance levels.
/// </summary>
public class MyLineOrderStrategy : Strategy
{
	private readonly StrategyParam<int> _smaLength;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevClose;
	private decimal _prevSma;
	private bool _hasPrev;

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

	public MyLineOrderStrategy()
	{
		_smaLength = Param(nameof(SmaLength), 14)
			.SetGreaterThanZero()
			.SetDisplay("SMA", "SMA period", "Indicators");

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

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

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

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

		var sma = new SimpleMovingAverage { Length = SmaLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(sma, ProcessCandle)
			.Start();
	}

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

		var close = candle.ClosePrice;

		if (!_hasPrev)
		{
			_prevClose = close;
			_prevSma = sma;
			_hasPrev = true;
			return;
		}

		// Cross above SMA
		if (_prevClose <= _prevSma && close > sma)
		{
			if (Position < 0) BuyMarket();
			if (Position <= 0) BuyMarket();
		}
		// Cross below SMA
		else if (_prevClose >= _prevSma && close < sma)
		{
			if (Position > 0) SellMarket();
			if (Position >= 0) SellMarket();
		}

		_prevClose = close;
		_prevSma = sma;
	}
}