Trendlinien-Ausbruchsstrategie mit benutzerdefinierten Trendlinien. Die Strategie berechnet lineare Projektionen aus den Steigungsparametern und Achsenabschnitten für bullische und bärische Linien. Wenn der Schlusskurs die projizierte Kauflinie um einen Schwellenwert überschreitet, wird eine Long-Position eröffnet. Wenn der Kurs unter die Verkaufslinie minus dem Schwellenwert fällt, wird eine Short-Position eingegangen.
Positionen werden durch Take-Profit- und Stop-Loss-Werte in Ticks geschützt. Ein optionaler Trailing-Stop aktualisiert den Schutz-Stop, wenn sich der Preis in die gewünschte Richtung bewegt. Eine zusätzliche Option schließt den Trade, wenn der Ausbruch bei der nächsten Kerze scheitert.
Details
Einstiegskriterien:
Long: Close > BuyLine + EntryThreshold
Short: Close < SellLine - EntryThreshold
Long/Short: Beide
Ausstiegskriterien: Stop-Loss, Take-Profit, Trailing-Stop oder entgegengesetztes Signal
Stops:
Take-Profit in Ticks
Stop-Loss in Ticks
Optionaler Trailing-Stop in Ticks
Optionaler Schlusskurs bei Fehlausbruch an der nächsten Kerze
Standardwerte:
EntryThreshold = 15m
StopLossTicks = 50
TakeProfitTicks = 100
EnableTrailing = false
TrailingStepTicks = 5
FalseBreakClose = true
CandleType = TimeSpan.FromMinutes(5).TimeFrame()
BuyLineSlope = 0m
BuyLineIntercept = 0m
SellLineSlope = 0m
SellLineIntercept = 0m
Filter:
Kategorie: Trendlinienausbruch
Richtung: Beide
Indikatoren: Keine
Stops: Ja
Komplexität: Mittel
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>
/// Swing trader using EMA crossover.
/// </summary>
public class CoensioSwingTraderStrategy : Strategy
{
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevFast;
private decimal _prevSlow;
private bool _hasPrev;
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public CoensioSwingTraderStrategy()
{
_fastPeriod = Param(nameof(FastPeriod), 12)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "Fast EMA period", "Trading");
_slowPeriod = Param(nameof(SlowPeriod), 26)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "Slow EMA period", "Trading");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle type", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
=> [(Security, CandleType)];
protected override void OnReseted()
{
base.OnReseted();
_prevFast = 0;
_prevSlow = 0;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
SubscribeCandles(CandleType)
.Bind(fast, slow, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fastVal, decimal slowVal)
{
if (candle.State != CandleStates.Finished) return;
if (!_hasPrev)
{
_prevFast = fastVal;
_prevSlow = slowVal;
_hasPrev = true;
return;
}
var crossUp = _prevFast <= _prevSlow && fastVal > slowVal;
var crossDown = _prevFast >= _prevSlow && fastVal < slowVal;
if (crossUp && Position <= 0)
{
if (Position < 0) BuyMarket();
BuyMarket();
}
else if (crossDown && Position >= 0)
{
if (Position > 0) SellMarket();
SellMarket();
}
_prevFast = fastVal;
_prevSlow = slowVal;
}
}