Diese Strategie lernt aus historischen binären Preismustern und schätzt die Wahrscheinlichkeit einer zukünftigen Aufwärts- oder Abwärtsbewegung. Wenn die Wahrscheinlichkeit einen benutzerdefinierten Schwellenwert überschreitet, eröffnet die Strategie eine Marktposition in dieser Richtung. Die gesammelten Statistiken zerfallen im Laufe der Zeit über einen Vergesslichkeitsfaktor, um dem jüngsten Verhalten mehr Gewicht zu geben. Das System kann optional Stop-Niveaus verschieben, wenn neue Signale erscheinen, und unterstützt einen Trailing-Stop basierend auf Preisschritten.
Details
Einstiegskriterien:
Long: Wahrscheinlichkeit einer Aufwärtsbewegung ≥ ProbabilityThreshold.
Short: Wahrscheinlichkeit einer Abwärtsbewegung ≥ ProbabilityThreshold.
Stops: Optionaler Trailing-Stop mit symmetrischem Stop-Loss und Take-Profit.
Standardwerte:
PatternSize = 10
ProbabilityThreshold = 0.8
ForgetRate = 1.05
Trailing = 0 (deaktiviert)
Filter:
Kategorie: Mustererkennung
Richtung: Beide
Indikatoren: Keine
Stops: Optional
Komplexität: Hoch
Zeitrahmen: Beliebig
Saisonalität: Nein
Neuronale Netze: Nein
Divergenz: Nein
Risikolevel: Hoch
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>
/// Pattern-based strategy using EMA crossover.
/// </summary>
public class SelfLearningExpertsStrategy : 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 SelfLearningExpertsStrategy()
{
_fastPeriod = Param(nameof(FastPeriod), 12)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "Fast EMA period", "Parameters");
_slowPeriod = Param(nameof(SlowPeriod), 26)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "Slow EMA 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();
_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;
}
}