
Die Multi-Indikator-Break-and-Return-Handelsstrategie ist eine quantitative Handelsmethode, die die technische Analyse von Indikatoren und Preisverhaltens kombiniert, um die beiden wichtigsten Handelschancen in einem Markt zu erfassen: Preisrevers und Trend-Break. Die Strategie integriert geschickt verschiedene technische Indikatoren wie beispielsweise Moving Averages, Relativ Strong Indices (RSI), Average True Range (ATR) und Volumen-Wage Average Price (VWAP) und führt zur Erhöhung der Zuverlässigkeit von Einstiegssignalen durch einen Aufschlag zwischen den Börsen (ORB). Die Strategie ist mit einem doppelten Ziel-Stopp-Design ausgestattet und verfügt über ein Risikomanagement, das automatisch die Stop-Loss-Anpassung bis zum Ausgleichspunkt anpasst.
Das Kernprinzip der Strategie besteht darin, drei Arten von potenziell profitablen Handelsmöglichkeiten durch Filterung und Bestätigung durch mehrere Indikatoren zu identifizieren:
Umkehrung des Handelssignals:
Trendschlagsignale:
Öffnen der Bandbrechung (ORB):
Die Strategie berechnet die dynamische Stop-Loss-Position mit dem ATR-Indikator und setzt sie durch Rückführung des Mindest-/Höchstpreises für eine bestimmte Periode (default 7) und der Multiplikation des ATR-Wertes (default 0.5) nach dem Einstieg. Nach dem Einstieg setzt die Strategie zwei Stop-Loss-Ziele:
Wenn das erste Stop-Loss-Ziel erreicht wird, wird die Strategie automatisch auf den Einstiegspreis (Stop-Loss-Balance-Punkt) umgestellt, um die erzielten Gewinne zu schützen.
Diversifizierte EintrittssignaleDurch die Integration von drei unterschiedlichen Einstiegssignalen, die Reversal, Breakout und Breakout in der Open-Bereichsphase umfassen, ist die Strategie in der Lage, sich an verschiedene Marktumgebungen anzupassen und die Handelschancen effektiv zu erhöhen, während die Signalqualität hoch bleibt.
Gutes RisikomanagementDie Strategie nutzt einen Stufenstop-Mechanismus, der es erlaubt, einen Teil des Gewinns zu erzielen, während die potenziell größeren Gewinne beibehalten werden. Wenn das erste Stop-Goal erreicht wird, wird der Stop-Loss automatisch auf den Gewinn-Verlust-Gleichgewichtspunkt angepasst, um das Kapital zu schützen und gleichzeitig die Gewinne laufen zu lassen.
Dynamische Stop-Loss-BerechnungDie Verwendung des ATR-Indikators zur Berechnung der Stop-Location ermöglicht die Anpassung des Stop-Loss-Niveaus an die dynamische Volatilität des Marktes, um die aktuelle Marktlage genauer zu reflektieren und zu enge oder zu lockere Stop-Loss-Sätze zu vermeiden.
Bestätigung des TransaktionsvolumensEs wurde ein Mechanismus zur Bestätigung der Transaktionsmenge speziell in ORB-Signalen eingeführt, der vorschreibt, dass die Transaktionsmenge zum Zeitpunkt des Durchbruchs ein bestimmtes Vielfaches der durchschnittlichen Transaktionsmenge in der Laufzeit übersteigen muss, um qualitativ minderwertige Durchbrüche zu filtern.
TrendfilterDie langfristige Trendrichtung wird anhand des 200-Perioden-SMA (SMA200) ermittelt, um sicherzustellen, dass die Richtung des Handels mit den wichtigsten Trends übereinstimmt, und die Erfolgsrate des Handels erhöht.
Integration der FinanzverwaltungStrategie: Ein integriertes Kapitalmanagement-System, das den Kapitalanteil pro Transaktion begrenzt (Standardkapital von 50%), eine diversifizierte Verteilung der Mittel gewährleistet und die Risikobereitschaft für einzelne Transaktionen verringert.
Lösung: Erwägen Sie die Erhöhung von Zukunftsindikatoren wie die Identifizierung von Preisverhaltensmustern oder die Verkürzung der Parameter für längerperiodische gleitende Durchschnitte, um die Sensibilität für Marktveränderungen zu erhöhen.
Lösung: Vermeiden Sie übermäßige Optimierung durch geeignete Parameteroptimierungsmethoden wie Forward-Verification und Monte Carlo-Simulationen; oder verwenden Sie feste Parameter und konzentrieren Sie sich auf eine robustere Regelgestaltung.
Die Lösung: Ein strengeres Signal-Priorität-System oder zusätzliche Bestätigungsmechanismen, die sicherstellen, dass Transaktionen nur bei hoher Wahrscheinlichkeit ausgeführt werden.
Lösungen: Erwägen Sie die Verwendung einer Options-Hedging-Strategie oder die Erhöhung der Stop-Loss-Distanz unter sehr volatilen Marktbedingungen oder sogar die vorübergehende Verringerung der Positionsgröße.
Lösungen: Implementierung von globalen Risikokontrollen, Einschränkung der Gesamtpositionsgröße oder Differenzierung der Transaktionen zwischen den verschiedenen Assetklassen, um das Relevanzrisiko zu verringern.
Gründe für die Optimierung: Herkömmliche, festgewichtigte Kombinationen von Indikatoren sind schwierig für verschiedene Marktphasen, während Maschinelles Lernen automatisch aus historischen Daten die optimale Kombinationsmuster lernt.
Optimierungsgründe: Marktemotionen haben einen erheblichen Einfluss auf kurzfristige Preisentwicklungen. Die Integration solcher Indikatoren ermöglicht es, Marktwendepunkte im Voraus zu erfassen und die Ein- und Ausstiegsmomente zu optimieren.
Optimierungsgründe: Die Fixed-Risk-Return-Ratio kann in unterschiedlichen Marktumgebungen nicht flexibel genug sein. Dynamische Anpassungen ermöglichen es, in hoch-volatilen Märkten weiter ausgerichtete Ziele zu setzen und in niedrig-volatilen Märkten eher konservative Ziele.
Optimierungsgrund: Die Marktaktivität zeigt deutliche Unterschiede zwischen den verschiedenen Tageszeiten, und die Zeitfilterung kann helfen, die Strategie auf die am meisten vorteilhaften Handelszeiten zu konzentrieren.
Gründe für die Optimierung: Risiken stehen in direktem Zusammenhang mit der Volatilität des Marktes. Durch dynamische Positionsmanagement kann ein einheitlicheres Risikoniveau beibehalten und das langfristige, risikoadjustierte Ergebnis verbessert werden.
Die Multi-Indicator-Break-and-Reverse-Trading-Strategie ist ein umfassendes Quantitative-Trading-System, das mehrere technische Analysemethoden kombiniert. Es kombiniert Reversal-, Trend- und Open-Break-Break-Signale mit einem ausgefeilten Risikomanagement und einem Geldmanagementmechanismus, um Handelschancen in verschiedenen Marktumgebungen zu erfassen. Die Kernvorteile der Strategie liegen in der Signalvielfalt, der ausgefeilten Risikokontrolle und der starken Parameter-Anpassbarkeit, die besonders für den Handel mit kurzen Perioden geeignet sind.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-03-31 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Reversal & Breakout Strategy with ORB", overlay=true, pyramiding=2, initial_capital=50000)
// --- Inputs ---
ema9Length = input.int(9, "9 EMA Length", minval=1)
ema20Length = input.int(20, "20 EMA Length", minval=1)
sma50Length = input.int(50, "50 SMA Length", minval=1)
sma200Length = input.int(200, "200 SMA Length", minval=1)
rsiLength = input.int(14, "RSI Length", minval=1)
rsiOverbought = input.int(70, "RSI Overbought", minval=0, maxval=100)
rsiOversold = input.int(30, "RSI Oversold", minval=0, maxval=100)
atrLength = input.int(14, "ATR Length", minval=1)
stopMulti = input.float(0.5, "Stop Loss ATR Multiplier", minval=0.1, step=0.1)
stopLookback = input.int(7, "Stop Loss Lookback", minval=1)
rr1 = input.float(0.5, "Risk:Reward Target 1", minval=0.1, step=0.1)
rr2 = input.float(1.1, "Risk:Reward Target 2", minval=0.1, step=0.1)
target1Percent = input.float(25, "Profit % Target 1", minval=0, maxval=100)
orbBars = input.int(15, "Opening Range Bars", minval=1, tooltip="Number of bars to define the opening range (e.g., 15 bars = 30 min on 2-min chart)")
volThreshold = input.float(1.5, "Volume Threshold Multiplier", minval=1.0, step=0.1, tooltip="Volume must be this multiple of the opening range average")
// --- Indicators ---
// Moving Averages
ema9 = ta.ema(close, ema9Length)
ema20 = ta.ema(close, ema20Length)
sma50 = ta.sma(close, sma50Length)
sma200 = ta.sma(close, sma200Length)
// VWAP
vwapValue = ta.vwap(close)
// RSI
rsi = ta.rsi(close, rsiLength)
// ATR
atr = ta.atr(atrLength)
// --- Opening Range Breakout ---
var float openingRangeHigh = na
var float openingRangeLow = na
var float openingRangeAvgVol = na
if bar_index < orbBars
openingRangeHigh := na
openingRangeLow := na
openingRangeAvgVol := na
else if bar_index == orbBars
openingRangeHigh := ta.highest(high, orbBars)
openingRangeLow := ta.lowest(low, orbBars)
openingRangeAvgVol := ta.sma(volume, orbBars)
orbLong = not na(openingRangeHigh) and ta.crossover(close, openingRangeHigh) and volume > openingRangeAvgVol * volThreshold
orbShort = not na(openingRangeLow) and ta.crossunder(close, openingRangeLow) and volume > openingRangeAvgVol * volThreshold
// --- Trend Detection ---
trendUp = close > sma200
trendDown = close < sma200
// --- Reversal Conditions ---
reversalLong = ta.crossover(close, sma50) and rsi < rsiOversold and close < vwapValue and trendUp
reversalShort = ta.crossunder(close, sma50) and rsi > rsiOverbought and close > vwapValue and trendDown
// --- Range Breakout Conditions ---
breakoutLong = ta.crossover(ema9, ema20) and close > vwapValue and trendUp
breakoutShort = ta.crossunder(ema9, ema20) and close < vwapValue and trendDown
// Combine conditions
longCondition = (reversalLong or breakoutLong or orbLong)
shortCondition = (reversalShort or breakoutShort or orbShort)
// --- Calculate Position Size ---
equityPerPosition = 25000.0 // $50,000 / 2 positions
positionSizeLong = math.floor(equityPerPosition / close)
positionSizeShort = math.floor(equityPerPosition / close)
// --- Stop Loss Calculation ---
longStop = ta.lowest(low, stopLookback) - (atr * stopMulti)
shortStop = ta.highest(high, stopLookback) + (atr * stopMulti)
// --- Variables to Store Trade Levels ---
var float tradeStop = na
var float tradeTarget1 = na
var float tradeTarget2 = na
var float initialPositionSize = na
var bool breakEvenSet = false // Track if stop has been moved to break-even
var float stopLevel = na // Dedicated variable for stop loss in exits
var float target1Level = na // Dedicated variable for first take profit
var float target2Level = na // Dedicated variable for second take profit
var float qtyTotal = na // Track total quantity
// --- Reset Levels Before New Trade ---
var bool newTrade = false
if longCondition or shortCondition
newTrade := true
else
newTrade := false
if strategy.position_size == 0 and newTrade
tradeStop := na
tradeTarget1 := na
tradeTarget2 := na
stopLevel := na
target1Level := na
target2Level := na
initialPositionSize := na
qtyTotal := na
breakEvenSet := false
// --- Strategy Entries ---
if longCondition and strategy.position_size == 0
strategy.entry("Long", strategy.long, qty=positionSizeLong * 2)
tradeStop := longStop
stopLevel := longStop
stopDistance = close - tradeStop
tradeTarget1 := close + (stopDistance * rr1)
tradeTarget2 := close + (stopDistance * rr2)
target1Level := tradeTarget1
target2Level := tradeTarget2
initialPositionSize := positionSizeLong * 2
qtyTotal := positionSizeLong * 2
breakEvenSet := false // Reset break-even flag
if shortCondition and strategy.position_size == 0
strategy.entry("Short", strategy.short, qty=positionSizeShort * 2)
tradeStop := shortStop
stopLevel := shortStop
stopDistance = tradeStop - close
tradeTarget1 := close - (stopDistance * rr1)
tradeTarget2 := close - (stopDistance * rr2)
target1Level := tradeTarget1
target2Level := tradeTarget2
initialPositionSize := positionSizeShort * 2
qtyTotal := positionSizeShort * 2
breakEvenSet := false // Reset break-even flag
// --- Trade Exits ---
if strategy.position_size > 0
qty_tp1 = qtyTotal * (target1Percent / 100)
qty_tp2 = qtyTotal * ((100 - target1Percent) / 100)
strategy.exit("Long Exit 1", "Long", qty=qty_tp1, stop=stopLevel, limit=target1Level)
strategy.exit("Long Exit 2", "Long", qty=qty_tp2, stop=stopLevel, limit=target2Level)
if strategy.position_size < 0
qty_tp1 = qtyTotal * (target1Percent / 100)
qty_tp2 = qtyTotal * ((100 - target1Percent) / 100)
strategy.exit("Short Exit 1", "Short", qty=qty_tp1, stop=stopLevel, limit=target1Level)
strategy.exit("Short Exit 2", "Short", qty=qty_tp2, stop=stopLevel, limit=target2Level)
// --- Move Stop to Break-even ---
if strategy.position_size != 0 and not na(initialPositionSize) and not breakEvenSet
if math.abs(strategy.position_size) < math.abs(initialPositionSize)
tradeStop := strategy.position_avg_price
stopLevel := strategy.position_avg_price
tradeTarget1 := na // Clear first target for plotting
breakEvenSet := true // Mark break-even as set
// --- Manual Close Fallback ---
if strategy.position_size > 0
if close >= target2Level or close <= stopLevel
strategy.close("Long", qty=qtyTotal, comment="Manual Close")
if strategy.position_size < 0
if close <= target2Level or close >= stopLevel
strategy.close("Short", qty=qtyTotal, comment="Manual Close")
// --- Reset Levels When No Position ---
if strategy.position_size == 0 and not newTrade
tradeStop := na
tradeTarget1 := na
tradeTarget2 := na
stopLevel := na
target1Level := na
target2Level := na
initialPositionSize := na
qtyTotal := na
breakEvenSet := false
// --- Plotting ---
plot(tradeStop, title="Stop Loss", color=color.red, linewidth=1, style=plot.style_linebr)
plot(tradeTarget1, title="Take Profit 1", color=color.green, linewidth=1, style=plot.style_linebr)
plot(tradeTarget2, title="Take Profit 2", color=color.blue, linewidth=1, style=plot.style_linebr)