Diese Strategie handelt auf Basis des BrakeExp-Indikators. Der Indikator zeichnet einen adaptiven Unterstützungs- und Widerstandskanal, der aus einer Exponentialkurve aufgebaut ist. Ein Wechsel des Kanals von der unteren zur oberen Linie erzeugt ein Verkaufssignal, und ein Wechsel von der oberen zur unteren Linie erzeugt ein Kaufsignal.
Funktionsweise
Wenn der Indikator ein Aufwärtssignal meldet, schließt die Strategie Short-Positionen und eröffnet eine neue Long-Position.
Wenn ein Abwärtssignal erscheint, werden bestehende Long-Positionen geschlossen und eine Short-Position eröffnet.
Wenn nur ein Aufwärtstrend erkannt wird, schließt die Strategie Short-Positionen.
Wenn nur ein Abwärtstrend erkannt wird, schließt die Strategie Long-Positionen.
Signale werden nur auf abgeschlossenen Kerzen verarbeitet.
Parameter
A – Kurvenbeschleunigungsfaktor des BrakeExp-Indikators.
B – Preisschritt für die Kanalbreite.
CandleType – Kerzenserie für die Indikatorberechnung.
Volume – Ordervolumen beim Markteintritt.
Hinweise
Die Strategie nutzt die High-Level-API von StockSharp und kann in Designer, Shell oder jedem anderen StockSharp-Produkt ausgeführt werden.
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 trend following strategy.
/// </summary>
public class BrakeExpStrategy : 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 BrakeExpStrategy()
{
_fastPeriod = Param(nameof(FastPeriod), 12)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 26)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "Slow EMA period", "Indicators");
_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;
}
}