Strategie, die Ausbrüche aus der Range des Vortages handelt.
Kauft, wenn der Preis das Tageshoch des Vortages überschreitet, und verkauft, wenn der Preis unter das Tagestief des Vortages fällt.
Verwendet einen Trailing-Stop und einen festen Take-Profit mit optionalem Positionsgrößenmanagement basierend auf dem Kontostand.
Der Handel ist vor einer konfigurierten Montags-Startstunde und nach einer Freitags-Schlusszeit deaktiviert.
Details
Einstiegskriterien:
Long: Preis > Vorheriges Hoch
Short: Preis < Vorheriges Tief
Long/Short: Beide
Ausstiegskriterien: Trailing-Stop oder Take-Profit
Stops: Trailing und fester Stop-Loss
Standardwerte:
MondayHour = 18
FridayHour = 14
TrailingStop = 21
TakeProfit = 550
StopLoss = 124
UseMoneyManagement = false
PercentMM = 8m
Volume = 0.1m
Filter:
Kategorie: Ausbruch
Richtung: Beide
Indikatoren: Keine
Stops: Ja
Komplexität: Grundlegend
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>
/// Breakout strategy using Highest/Lowest channels.
/// </summary>
public class Breakout04Strategy : Strategy
{
private readonly StrategyParam<int> _lookback;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevHigh;
private decimal _prevLow;
private bool _hasPrev;
public int Lookback { get => _lookback.Value; set => _lookback.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public Breakout04Strategy()
{
_lookback = Param(nameof(Lookback), 30)
.SetDisplay("Lookback", "Channel lookback period", "General");
_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 = Lookback };
var lowest = new Lowest { Length = Lookback };
SubscribeCandles(CandleType).Bind(highest, lowest, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal highest, decimal lowest)
{
if (candle.State != CandleStates.Finished) return;
if (!_hasPrev)
{
_prevHigh = highest;
_prevLow = lowest;
_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 = highest;
_prevLow = lowest;
}
}