Die BreakThrough-Strategie führt Trades aus, wenn der Preis benutzerdefinierte Trendlinienlevel kreuzt.
Zwei Hauptlevel werden verwendet:
Buy Line – Preisniveau zum Auslösen einer Long-Position.
Sell Line – Preisniveau zum Auslösen einer Short-Position.
Sobald eine Linie von der gegenüberliegenden Seite gekreuzt wird, tritt die Strategie in dieser Richtung in den Markt ein.
Optionale zusätzliche Linien ermöglichen das Schließen einer Position, wenn der Preis ein bestimmtes Niveau berührt.
Schutz-Stop-Loss, Take-Profit und Trailing-Stop-Abstände werden in Pips vom Einstiegspreis gemessen.
Details
Einstiegskriterien:
Long: Der Preis kreuzt die Buy Line je nach Ausgangsposition nach oben oder unten.
Short: Der Preis kreuzt die Sell Line je nach Ausgangsposition nach oben oder unten.
Long/Short: Beide Seiten.
Ausstiegskriterien:
Preis trifft eine optionale Take-Profit- oder Stop-Loss-Linie.
Preis erreicht die Take-Profit- oder Stop-Loss-Distanz in Pips.
Trailing Stop wird ausgelöst.
Stops: Ja, mittels StopLossPips, TakeProfitPips und TrailingStopPips.
Standardwerte:
BuyLinePrice = 0 (deaktiviert)
SellLinePrice = 0 (deaktiviert)
TakeProfitPips = 100
StopLossPips = 30
TrailingStopPips = 20
Filter:
Kategorie: Ausbruch
Richtung: Beide
Indikatoren: Keine
Stops: Ja
Komplexität: Einfach
Zeitrahmen: Beliebig (Standard 1 Minute)
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>
/// Breakout strategy using Highest/Lowest channel.
/// </summary>
public class BreakThroughStrategy : Strategy
{
private readonly StrategyParam<int> _period;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevHigh;
private decimal _prevLow;
private bool _hasPrev;
public int Period { get => _period.Value; set => _period.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public BreakThroughStrategy()
{
_period = Param(nameof(Period), 20)
.SetGreaterThanZero()
.SetDisplay("Period", "Channel lookback period", "Parameters");
_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();
_prevHigh = 0;
_prevLow = 0;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var highest = new Highest { Length = Period };
var lowest = new Lowest { Length = Period };
SubscribeCandles(CandleType)
.Bind(highest, lowest, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal high, decimal low)
{
if (candle.State != CandleStates.Finished) return;
if (!_hasPrev)
{
_prevHigh = high;
_prevLow = low;
_hasPrev = true;
return;
}
var close = candle.ClosePrice;
if (close > _prevHigh && Position <= 0)
{
if (Position < 0) BuyMarket();
BuyMarket();
}
else if (close < _prevLow && Position >= 0)
{
if (Position > 0) SellMarket();
SellMarket();
}
_prevHigh = high;
_prevLow = low;
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import Highest, Lowest
from StockSharp.Algo.Strategies import Strategy
class break_through_strategy(Strategy):
def __init__(self):
super(break_through_strategy, self).__init__()
self._period = self.Param("Period", 20) .SetDisplay("Period", "Channel lookback period", "General")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) .SetDisplay("Candle Type", "Candle type", "General")
self._prev_high = 0.0
self._prev_low = 0.0
self._has_prev = False
@property
def period(self):
return self._period.Value
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(break_through_strategy, self).OnReseted()
self._prev_high = 0.0
self._prev_low = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(break_through_strategy, self).OnStarted2(time)
highest = Highest()
highest.Length = self.period
lowest = Lowest()
lowest.Length = self.period
self.SubscribeCandles(self.candle_type).Bind(highest, lowest, self.process_candle).Start()
def process_candle(self, candle, high, low):
if candle.State != CandleStates.Finished:
return
hv = float(high)
lv = float(low)
if not self._has_prev:
self._prev_high = hv
self._prev_low = lv
self._has_prev = True
return
close = float(candle.ClosePrice)
if close > self._prev_high and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
elif close < self._prev_low and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._prev_high = hv
self._prev_low = lv
def CreateClone(self):
return break_through_strategy()