Ein mehrstufiges Bollinger Bands- und RSI-System, konvertiert vom MT5-Experten "FullDump". Die Strategie wartet auf Impulserschöpfung, bestätigt eine Mean-Reversion-Ausrichtung mit Bollinger Bands und handelt nur, wenn der Kurs sich wieder mit der Mittellinie ausrichtet. Das Trade-Management spiegelt den Original-EA mit festen Stop-Loss-/Zielversätzen und einer Break-Even-Anpassung wider, wenn der Kurs zum gegenüberliegenden Band zurückkehrt.
Übersicht
Märkte: Jedes liquide Instrument, das Bollinger Bands und RSI unterstützt.
Ordertyp: Marktaufträge mit vordefinierten Schutzniveaus.
Konzept: Ausblenden kurzfristiger Extreme innerhalb der Bollinger-Hülle, während der Kurs zur Mittellinie zurückkehrt.
Handelslogik
RSI-Scan (Schritt 1)
Long-Bedingung erfordert mindestens einen RSI-Wert unter 30 innerhalb des jüngsten Fensters.
Short-Bedingung erfordert mindestens einen RSI-Wert über 70 im gleichen Lookback.
Band-Verletzung (Schritt 2)
Long: Der aktuelle Schlusskurs muss unter oder gleich einem der jüngsten unteren Bandwerte liegen.
Short: Der aktuelle Schlusskurs muss über oder gleich einem der jüngsten oberen Bandwerte liegen.
Mittelband-Ausrichtung (Schritt 3)
Long-Trades werden erst ausgelöst, wenn der Kurs wieder über die Bollinger-Mittellinie schließt.
Short-Trades erfordern, dass der Schlusskurs unter der Mittellinie liegt.
Einstiegsausführung
Wenn alle Bedingungen übereinstimmen und keine Position in diese Richtung offen ist, wird eine Marktorder für das konfigurierte Volumen gesendet.
Risikomanagement
Stop-Loss: Unter (Long) oder über (Short) dem extremen Tief/Hoch des Lookback-Fensters minus/plus dem konfigurierten Einzugsversatz platziert.
Take-Profit: Am aktuellen gegenüberliegenden Bollinger-Band plus demselben Einzugsversatz platziert.
Break-Even-Regel: Sobald der Kurs das gegenüberliegende Band berührt, wird der Stop-Loss auf den Einstiegspreis verschoben, um die Position zu sichern.
Positionsausstieg: Positionen schließen, wenn der Kurs die Stop-Loss- oder Take-Profit-Niveaus durchbricht; entgegengesetzte Signale flatten die aktuelle Position vor dem Richtungswechsel.
Parameter
Name
Beschreibung
Standard
Hinweise
BandsPeriod
Länge der Bollinger Bands-Berechnung.
20
Optimierbar (10 → 40 Schritt 1).
RsiPeriod
Durchschnittslänge für den RSI.
14
Optimierbar (7 → 21 Schritt 1).
Depth
Anzahl der für Bedingungen untersuchten jüngsten Kerzen.
6
Optimierbar (3 → 12 Schritt 1).
IndentInPoints
Versatz in Kursschritten zum Stop-Loss und Take-Profit hinzugefügt.
Komplexität: Mittel (Multi-Konditions-Logik mit statusbehafteter Verwaltung).
Automatisierungsgrad: Vollautomatische Einstiege und Ausstiege.
Bester Einsatz: Seitwärtsphasen, in denen Bollinger-Extreme häufig zum Median zurückkehren.
Hinweise
Der Einzugsversatz wird durch den Kursschritt des Instruments skaliert, um der pip-basierten Logik des Original-EAs zu entsprechen.
Der Algorithmus hält Warteschlangen der jüngsten Indikatorwerte, um die MT5-Tiefenprüfungen exakt zu replizieren.
Sicherstellen, dass das Instrument genügend historische Kerzen bereitstellt, um sowohl RSI als auch Bollinger Bands vor dem Live-Trading zu initialisieren.
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>
/// FullDump BB RSI strategy (simplified). Uses RSI oversold/overbought
/// with EMA trend filter for mean reversion entries.
/// </summary>
public class FullDumpBbRsiStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<int> _emaPeriod;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int RsiPeriod
{
get => _rsiPeriod.Value;
set => _rsiPeriod.Value = value;
}
public int EmaPeriod
{
get => _emaPeriod.Value;
set => _emaPeriod.Value = value;
}
public FullDumpBbRsiStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI averaging period", "Indicators");
_emaPeriod = Param(nameof(EmaPeriod), 20)
.SetGreaterThanZero()
.SetDisplay("EMA Period", "Trend filter EMA", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(rsi, ema, (ICandleMessage candle, decimal rsiValue, decimal emaValue) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
var close = candle.ClosePrice;
// RSI oversold => buy
if (rsiValue < 25m && Position <= 0)
BuyMarket();
// RSI overbought => sell
else if (rsiValue > 75m && Position >= 0)
SellMarket();
// Trend following on EMA cross
else if (close > emaValue && rsiValue > 60m && rsiValue < 70m && Position <= 0)
BuyMarket();
else if (close < emaValue && rsiValue < 40m && rsiValue > 30m && Position >= 0)
SellMarket();
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, ema);
DrawOwnTrades(area);
}
}
}
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 RelativeStrengthIndex, ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class full_dump_bb_rsi_strategy(Strategy):
def __init__(self):
super(full_dump_bb_rsi_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candles", "General")
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI averaging period", "Indicators")
self._ema_period = self.Param("EmaPeriod", 20) \
.SetDisplay("EMA Period", "Trend filter EMA", "Indicators")
@property
def CandleType(self):
return self._candle_type.Value
@property
def RsiPeriod(self):
return self._rsi_period.Value
@property
def EmaPeriod(self):
return self._ema_period.Value
def OnStarted2(self, time):
super(full_dump_bb_rsi_strategy, self).OnStarted2(time)
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiPeriod
ema = ExponentialMovingAverage()
ema.Length = self.EmaPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(rsi, ema, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, ema)
self.DrawOwnTrades(area)
def _on_process(self, candle, rsi_value, ema_value):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
rv = float(rsi_value)
ev = float(ema_value)
if rv < 25 and self.Position <= 0:
self.BuyMarket()
elif rv > 75 and self.Position >= 0:
self.SellMarket()
elif close > ev and rv > 60 and rv < 70 and self.Position <= 0:
self.BuyMarket()
elif close < ev and rv < 40 and rv > 30 and self.Position >= 0:
self.SellMarket()
def CreateClone(self):
return full_dump_bb_rsi_strategy()