Start
/
Strategie-Beispiele
Auf GitHub ansehen
MLTrendE-Strategie
Diese Strategie handelt in Richtung eines gewichteten gleitenden Durchschnitts (WMA) und baut Positionen optional aus, wenn sich der Preis günstig entwickelt.
Logik
Berechnung eines WMA der ausgewählten Kerzen-Reihe.
Wenn keine Position offen ist:
Handelstyp 0 : Long-Position eröffnen, wenn der Schlusskurs über dem WMA liegt, oder Short-Position, wenn er darunter liegt.
Handelstyp 1 : immer eine Long-Position eröffnen.
Handelstyp 2 : immer eine Short-Position eröffnen.
Wenn eine Position offen ist und das festgelegte Gewinnziel erreicht, wird ein weiterer Trade mit skaliertem Volumen hinzugefügt.
Sobald die maximale Anzahl an Trades erreicht ist, wird die gesamte Position beim nächsten Gewinnziel geschlossen.
Parameter
Volume – Basis-Handelsvolumen.
Multiplier1 – Volumenmultiplikator für den zweiten Trade.
Multiplier2 – Volumenmultiplikator für den dritten Trade.
TakeProfit – Gewinn in Preiseinheiten zum Skalieren oder Schließen.
Map – Periode des gewichteten gleitenden Durchschnitts.
MaxTrades – maximale Anzahl aufeinanderfolgender Trades.
TradeType – 0 Trendfolge, 1 erzwinge Long, 2 erzwinge Short.
CandleType – Zeitrahmen der analysierten Kerzen.
Hinweise
Die Strategie verwendet nur abgeschlossene Kerzen und Marktorders. Sie verwaltet weder Stops noch Risiko; nutzen Sie bei Bedarf Kontoschutz.
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>
/// Weighted moving average trend strategy.
/// Buys when close crosses above WMA, sells when below.
/// </summary>
public class MLTrendEStrategy : Strategy
{
private readonly StrategyParam<int> _wmaPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevClose;
private decimal _prevWma;
private bool _hasPrev;
public int WmaPeriod { get => _wmaPeriod.Value; set => _wmaPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public MLTrendEStrategy()
{
_wmaPeriod = Param(nameof(WmaPeriod), 34)
.SetGreaterThanZero()
.SetDisplay("WMA Length", "Weighted moving average period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Timeframe for analysis", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
=> [(Security, CandleType)];
protected override void OnReseted()
{
base.OnReseted();
_prevClose = 0;
_prevWma = 0;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var wma = new WeightedMovingAverage { Length = WmaPeriod };
SubscribeCandles(CandleType).Bind(wma, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal wmaValue)
{
if (candle.State != CandleStates.Finished) return;
var close = candle.ClosePrice;
if (!_hasPrev)
{
_prevClose = close;
_prevWma = wmaValue;
_hasPrev = true;
return;
}
// Cross above WMA
if (_prevClose <= _prevWma && close > wmaValue && Position <= 0)
{
if (Position < 0) BuyMarket();
BuyMarket();
}
// Cross below WMA
else if (_prevClose >= _prevWma && close < wmaValue && Position >= 0)
{
if (Position > 0) SellMarket();
SellMarket();
}
_prevClose = close;
_prevWma = wmaValue;
}
}
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 WeightedMovingAverage
from StockSharp.Algo.Strategies import Strategy
class ml_trend_e_strategy(Strategy):
def __init__(self):
super(ml_trend_e_strategy, self).__init__()
self._wma_period = self.Param("WmaPeriod", 34) \
.SetDisplay("WMA Length", "Weighted moving average period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Timeframe for analysis", "General")
self._prev_close = 0.0
self._prev_wma = 0.0
self._has_prev = False
@property
def wma_period(self):
return self._wma_period.Value
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(ml_trend_e_strategy, self).OnReseted()
self._prev_close = 0.0
self._prev_wma = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(ml_trend_e_strategy, self).OnStarted2(time)
wma = WeightedMovingAverage()
wma.Length = self.wma_period
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(wma, self.on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawOwnTrades(area)
def on_process(self, candle, wma_value):
if candle.State != CandleStates.Finished:
return
close = candle.ClosePrice
if not self._has_prev:
self._prev_close = close
self._prev_wma = wma_value
self._has_prev = True
return
# Cross above WMA
if self._prev_close <= self._prev_wma and close > wma_value and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
# Cross below WMA
elif self._prev_close >= self._prev_wma and close < wma_value and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._prev_close = close
self._prev_wma = wma_value
def CreateClone(self):
return ml_trend_e_strategy()