Start
/
Strategie-Beispiele
Auf GitHub ansehen
MTF RSI SAR-Strategie
Diese Strategie kombiniert Relative Strength Index (RSI) -Werte über vier Zeitrahmen, Parabolic SAR und Bollinger Bänder , um Trendfortsetzungen nach kurzen Rücksetzern zu erfassen. Signale werden auf 5‑Minuten-Kerzen generiert, während höhere Zeitrahmen als Bestätigungsfilter dienen.
Konzept
RSI-Filter – RSI-Werte auf 5, 15, 30 und 60 Minuten müssen alle über 50 für Long-Einstiege oder unter 50 für Short-Einstiege liegen. Diese Multi-Timeframe-Bestätigung zielt darauf ab, Trades mit dem übergeordneten Trend auszurichten.
Parabolic SAR-Filter – Parabolic SAR-Werte auf 5, 15 und 30 Minuten müssen für Longs unter der aktuellen Kerze liegen oder für Shorts darüber. Dies stellt sicher, dass der Preis in die gewünschte Richtung tendiert.
Bollinger Band-Trigger – Im 5-Minuten-Chart muss das Kerzenschluss das obere Band für Longs oder das untere Band für Shorts durchbrechen. Bollinger Bänder liefern einen Überkauft-/Überverkauft-Trigger.
Ein- und Ausstieg – Eine Long-Position wird eröffnet, wenn alle aktiven Filter nach oben zeigen. Eine Short-Position wird eröffnet, wenn alle aktiven Filter nach unten zeigen. Das entgegengesetzte Signal schließt eine offene Position.
Jeder der drei Filter kann über Parameter einzeln deaktiviert werden, sodass die Strategie nur mit RSI, nur mit Bollinger Bändern, nur mit SAR oder einer beliebigen Kombination betrieben werden kann.
Parameter
UseRsi – RSI-Filter aktivieren (Standard: true).
UseBollinger – Bollinger Band-Trigger aktivieren (Standard: true).
UseSar – Parabolic SAR-Filter aktivieren (Standard: true).
RsiPeriod – RSI-Berechnungsperiode (Standard: 14).
BollingerPeriod – Anzahl der Balken für Bollinger Bänder (Standard: 20).
BollingerWidth – Breite (Standardabweichungsmultiplikator) für Bollinger Bänder (Standard: 2).
SarStep – Beschleunigungsfaktor für Parabolic SAR (Standard: 0.02).
SarMax – Maximaler Beschleunigungsfaktor für Parabolic SAR (Standard: 0.2).
CandleType – Basis-Kerzen-Zeitrahmen, standardmäßig 5 Minuten.
Handelsregeln
Long : Alle aktivierten Filter liefern bullische Signale.
Short : Alle aktivierten Filter liefern bärische Signale.
Ausstieg : Das entgegengesetzte Signal schließt die Position.
Hinweise
Die Strategie operiert auf einem Wertpapier mit vier Kerzen-Abonnements: 5, 15, 30 und 60 Minuten Zeitrahmen.
Konzipiert als Lehrbeispiel für Multi-Timeframe-Bestätigung mit der High-Level-API von StockSharp.
Es gibt keine festen Stop-Loss- oder Gewinnziele; Risikomanagement sollte bei Bedarf extern hinzugefügt 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>
/// RSI and Parabolic SAR strategy.
/// Buys when RSI below oversold and SAR below price; sells on opposite.
/// </summary>
public class MtfRsiSarStrategy : Strategy
{
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<decimal> _rsiOversold;
private readonly StrategyParam<decimal> _rsiOverbought;
private readonly StrategyParam<DataType> _candleType;
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public decimal RsiOversold { get => _rsiOversold.Value; set => _rsiOversold.Value = value; }
public decimal RsiOverbought { get => _rsiOverbought.Value; set => _rsiOverbought.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public MtfRsiSarStrategy()
{
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI period", "Indicators");
_rsiOversold = Param(nameof(RsiOversold), 35m)
.SetDisplay("RSI Oversold", "RSI oversold level", "Indicators");
_rsiOverbought = Param(nameof(RsiOverbought), 65m)
.SetDisplay("RSI Overbought", "RSI overbought level", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Type of candles", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
=> [(Security, CandleType)];
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var sar = new ParabolicSar();
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(rsi, sar, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsi, decimal sar)
{
if (candle.State != CandleStates.Finished)
return;
var close = candle.ClosePrice;
// Buy: RSI oversold + SAR below price
if (rsi < RsiOversold && sar < close)
{
if (Position < 0)
BuyMarket();
if (Position <= 0)
BuyMarket();
}
// Sell: RSI overbought + SAR above price
else if (rsi > RsiOverbought && sar > close)
{
if (Position > 0)
SellMarket();
if (Position >= 0)
SellMarket();
}
// Exit long when RSI overbought
else if (Position > 0 && rsi > RsiOverbought)
{
SellMarket();
}
// Exit short when RSI oversold
else if (Position < 0 && rsi < RsiOversold)
{
BuyMarket();
}
}
}
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 ParabolicSar, RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class mtf_rsi_sar_strategy(Strategy):
def __init__(self):
super(mtf_rsi_sar_strategy, self).__init__()
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI period", "Indicators")
self._rsi_oversold = self.Param("RsiOversold", 35.0) \
.SetDisplay("RSI Oversold", "RSI oversold level", "Indicators")
self._rsi_overbought = self.Param("RsiOverbought", 65.0) \
.SetDisplay("RSI Overbought", "RSI overbought level", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Type of candles", "General")
@property
def rsi_period(self):
return self._rsi_period.Value
@property
def rsi_oversold(self):
return self._rsi_oversold.Value
@property
def rsi_overbought(self):
return self._rsi_overbought.Value
@property
def candle_type(self):
return self._candle_type.Value
def OnStarted2(self, time):
super(mtf_rsi_sar_strategy, self).OnStarted2(time)
rsi = RelativeStrengthIndex()
rsi.Length = self.rsi_period
sar = ParabolicSar()
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(rsi, sar, self.on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawOwnTrades(area)
def on_process(self, candle, rsi, sar):
if candle.State != CandleStates.Finished:
return
close = candle.ClosePrice
# Buy: RSI oversold + SAR below price
if rsi < self.rsi_oversold and sar < close:
if self.Position < 0:
self.BuyMarket()
if self.Position <= 0:
self.BuyMarket()
# Sell: RSI overbought + SAR above price
elif rsi > self.rsi_overbought and sar > close:
if self.Position > 0:
self.SellMarket()
if self.Position >= 0:
self.SellMarket()
# Exit long when RSI overbought
elif self.Position > 0 and rsi > self.rsi_overbought:
self.SellMarket()
# Exit short when RSI oversold
elif self.Position < 0 and rsi < self.rsi_oversold:
self.BuyMarket()
def CreateClone(self):
return mtf_rsi_sar_strategy()