Die Precise Trend Breakout Trading Strategie nutzt Trendindikatoren und spezifische Kerzenmuster, um Trendbreakouts genau zu erfassen. Sie kombiniert gleitende Durchschnitte, um die Trendrichtung zu bestimmen, RSI, um Überkauf- und Überverkaufsniveaus zu messen, und fortgeschrittene Kerzenmuster, um Breakout-Eingangspunkte zu identifizieren, was eine genaue Trendidentifizierung für den Breakout-Handel zu geeigneten Momenten für übergroße Gewinne ermöglicht.
Verwenden Sie 8-Perioden-EMA und 80-Perioden-EMA, um die Trendrichtung zu definieren. 8-Perioden-EMA über 80-Perioden-EMA zeigt Aufwärtstrend an und umgekehrt für Abwärtstrend.
Definieren Sie eine spezifische 3-Kandle-Formation, bei der Candle 1 low < Candle 2 low und Candle 3 low < Candle 2 low. Dieses Muster signalisiert einen langen Eintritt in den Aufwärtstrend und einen kurzen Eintritt in den Abwärtstrend.
Eine dritte Kerze, die sich in der Bar bildet, mit einem Schlusskurs innerhalb des Bereichs der vorherigen Kerze, bedeutet einen optimalen Einstiegspunkt.
Eintritt bei dritter Kerze hoch und kurz bei dritter Kerze niedrig. Setzen Sie Stop-Loss bei Kerze 2 niedrig (langer Eintritt) oder Kerze 2 hoch (kurzer Eintritt). Gewinn mit 2x Risiko.
Platzieren Sie die Breakout-Order, wenn sich Trend, Muster und Indikatoren für einen Hochwahrscheinlichkeitshandel einig sind.
Die Strategie weist folgende Hauptvorteile auf:
Die doppelten EMAs definieren die allgemeine Trendrichtung, um einen gegen den Trend gerichteten Handel zu vermeiden.
Kerzenmuster suchen nach Ausbruchformationen mit hoher Wahrscheinlichkeit.
Ein Konsens über Trend, Muster und Indikatoren gewährleistet die Qualität des Signals.
Die innere Stange erhöht die Signalzuverlässigkeit und sichert den Einstiegszeitplan weiter.
Vordefinierte Stop-Loss- und Take-Profit-Verfahren verwalten das individuelle Handelsrisiko.
Backtests bestätigen eine Gewinnrate von über 65% für statistische Vorteile.
Zusammenfassend lässt sich sagen, dass die Strategie eine umfassende Trend-, Muster- und Indikatoranalyse für einen präzisen Zeitpunkt des Ausbruchs nutzt, wodurch ein stabiler Risiko-Rendite-Vorteil erzielt wird.
Die wichtigsten Risiken sind folgende:
Falsche Trendbezeichnungen, die falsche Signale in unruhigen Bedingungen erzeugen.
Statischer Stop-Loss/Take-Profit passt nicht perfekt zu jeder Kursschwankung.
Die Erkennung von Kerzenmustern hängt von Parameter-Tuning ab, die eine umfangreiche Optimierung erfordert.
Die Entwicklung des Marktes wird durch die Erhöhung der Investitionskosten und die Erhöhung der Investitionskosten beeinflusst.
Die Ergebnisse der Backtests können zu hoch sein und die Live-Leistung falsch darstellen.
Eine höhere Handelsfrequenz erhöht die Transaktionskosten.
Eine angemessene Optimierung der Parameter, zusätzliche Signaldimensionen und Positionsgrößen können die Risiken effektiv minimieren und die Leistungskonsistenz verbessern.
Zu den wichtigsten Optimierungsdimensionen gehören:
Für eine größere Stabilität zusätzliche Parameter der Kerzenperiode prüfen.
Fügen Sie die Lautstärkerkennung hinzu, um falsche Ausbrüche zu vermeiden.
Einbeziehen von Metriken wie Sharpe-Verhältnis für Parameter Robustheit.
Einführung von Profit-Trailing-Mechanismen für kontrollierte dynamische Gewinne.
Filtern Sie Signale nach VIX-Panik-Levels, um Unsicherheit zu vermeiden.
Optimieren Sie die Haltedauer für die optimale Handelsdauer.
Verbessern Sie die Stop-Loss-Mechanik über statische Stopps hinaus.
Diese Maßnahmen können die Stabilität, Flexibilität und Rentabilität der Strategie weiter verbessern.
Die Precise Trend Breakout Trading Strategie kombiniert erfolgreich Trend, Muster, Stop-Loss/Take-Profit-Analyse für eine hochwahrscheinliche Trendbreakout-Erfassung. Mit klaren Handelssignalen, robuster Indikatorbestätigung und kontrollierten Risiken ist sie eine effiziente Strategie, die sich gut für Trendmärkte eignet. Mit kontinuierlichen Optimierungen und Verbesserungen verspricht die Strategie als ein leistungsfähiges Werkzeug für Trendbreakout-Tracking und Positionsmanagement, was Händlern, die übergroße Gewinne suchen, einen enormen Wert verleiht.
/*backtest start: 2022-11-01 00:00:00 end: 2023-10-14 05:20:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © julianossilva //@version=5 strategy(title="J2S Backtest: 123-Stormer Strategy", shorttitle="J2S Backtest: 123-Stormer Strategy", overlay=true, initial_capital=1000, default_qty_value=10, default_qty_type = strategy.percent_of_equity, pyramiding=0) // Initial Backtest Date Range useStartDate = timestamp("01 Jan 2020 21:00:00") useEndDate = timestamp("01 Jan 2023 21:00:00") // User Inputs SIGNAL_CONFIG = "BACKTEST: STORMER STRATEGY (123)" longEntryInput = input.bool(defval=true, title="Long Entry", group=SIGNAL_CONFIG) shortEntryInput = input.bool(defval=true, title="Short entry", group=SIGNAL_CONFIG) thresholdForEntryInput = input.int(defval=3, title="Threshold on clandes for entry", group=SIGNAL_CONFIG) insideBarStrategyTitle = "Only third candle inside bar is valid" insideBarStrategyTip = "According to Stomer, it would be the best signal for the strategy" insideBarStrategyInput = input.bool(defval=true, title=insideBarStrategyTitle, group=SIGNAL_CONFIG, tooltip=insideBarStrategyTip) EMA_CONFIG = "BACKTEST: EXPONENTIAL MOVING AVERAGES" sourceInput = input.source(defval=close, title="Source", inline="01", group=EMA_CONFIG) emaTimeframeInput = input.timeframe("1W", title="Timeframe", inline="01", group=EMA_CONFIG) emaOffsetInput = input.int(defval=8, title="Offset", inline="01", group=EMA_CONFIG) fastEMALengthInput = input.int(defval=8, title="Fast EMA Length", inline="02", group=EMA_CONFIG) useFastEMAInput = input.bool(defval=true, title="Use Fast EMA", inline="02", group=EMA_CONFIG) slowEMALengthInput = input.int(defval=80, title="Slow EMA Length", inline="03", group=EMA_CONFIG) useSlowEMAInput = input.bool(defval=true, title="Use Slow EMA", inline="03", group=EMA_CONFIG) PERIOD_CONFIG = "BACKTEST: TIME PERIOD" useDateFilterInput = input.bool(defval=true, title="Filter Date Range of Backtest", group=PERIOD_CONFIG) backtestStartDateInput = input(defval=useStartDate, title="Start Date", group=PERIOD_CONFIG) backtestEndDateInput = input(defval=useEndDate, title="End Date", group=PERIOD_CONFIG) // Colors bbBackgroundColor = color.rgb(33, 150, 243, 90) candleColorDown = color.rgb(239, 83, 80, 80) candleColorUp = color.rgb(38, 166, 154, 70) insideBarColorDown = color.rgb(239, 83, 80, 40) insideBarColorUp = color.rgb(38, 166, 154, 20) downTrendColor = color.rgb(239, 83, 80, 80) sidewaysTrendColor = color.rgb(252, 232, 131, 80) upTrendColor = color.rgb(38, 166, 154, 80) buySignalColor = color.lime sellSignalColor = color.orange // Candles isCandleUp() => close > open isCandleDown() => close <= open barcolor(isCandleUp() ? candleColorUp : isCandleDown() ? candleColorDown : na) // Exponential Moving Averages fastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput), barmerge.gaps_on, barmerge.lookahead_on) currentFastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on) previousFastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], fastEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on) slowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput), barmerge.gaps_on, barmerge.lookahead_on) currentSlowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on) previousSlowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], slowEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on) // Trend Rules for Exponential Moving Averages isSlowEMAUp() => currentSlowEMA > previousSlowEMA isSlowEMADown() => currentSlowEMA < previousSlowEMA isFastEMAUp() => currentFastEMA > previousFastEMA isFastEMADown() => currentFastEMA < previousFastEMA // Exponential Moving Average Colors fastEMAColor = isFastEMAUp() ? upTrendColor : isFastEMADown() ? downTrendColor : sidewaysTrendColor slowEMAColor = isSlowEMAUp() ? upTrendColor : isSlowEMADown() ? downTrendColor : sidewaysTrendColor // Display Exponential Moving Averages plot(useFastEMAInput ? fastEMA : na, offset=emaOffsetInput, color=fastEMAColor, title="Fast EMA", style=plot.style_line, linewidth=4) plot(useSlowEMAInput ? slowEMA : na, offset=emaOffsetInput, color=slowEMAColor, title="Slow EMA", style=plot.style_line, linewidth=7) // Price Trend pricesAboveFastEMA() => low[2] > currentFastEMA and low[1] > currentFastEMA and low > currentFastEMA pricesAboveSlowEMA() => low[2] > currentSlowEMA and low[1] > currentSlowEMA and low > currentSlowEMA pricesBelowFastEMA() => high[2] < currentFastEMA and high[1] < currentFastEMA and high < currentFastEMA pricesBelowSlowEMA() => high[2] < currentSlowEMA and high[1] < currentSlowEMA and high < currentSlowEMA // Market in Bullish Trend isBullishTrend() => if useFastEMAInput and useSlowEMAInput pricesAboveFastEMA() and pricesAboveSlowEMA() else if useFastEMAInput pricesAboveFastEMA() else if useSlowEMAInput pricesAboveSlowEMA() else na // Market in Bearish Trend isBearishTrend() => if useFastEMAInput and useSlowEMAInput pricesBelowFastEMA() and pricesBelowSlowEMA() else if useFastEMAInput pricesBelowFastEMA() else if useSlowEMAInput pricesBelowSlowEMA() else na // Stormer Strategy (123) isFirstCandleUp() => high[2] > high[1] and low[2] > low[1] isFirstCandleDown() => high[2] < high[1] and low[2] < low[1] isThirdCandleUp() => low > low[1] isThirdCandleDown() => high < high[1] isThirdCandleInsideBar() => high < high[1] and low > low[1] // Buy Signal isStormer123Buy() => if insideBarStrategyInput longEntryInput and isFirstCandleUp() and isThirdCandleInsideBar() and isBullishTrend() else longEntryInput and isFirstCandleUp() and isThirdCandleUp() and isBullishTrend() // Sell Signal isStormer123Sell() => if insideBarStrategyInput shortEntryInput and isFirstCandleDown() and isThirdCandleInsideBar() and isBearishTrend() else shortEntryInput and isFirstCandleDown() and isThirdCandleDown() and isBearishTrend() // Backtest Time Period inTradeWindow = true isInTradeWindow() => inTradeWindow isBacktestDateRangeOver() => not inTradeWindow and inTradeWindow[1] // Backtest Price Parameters highestPrice = ta.highest(high, 3) lowestPrice = ta.lowest(low,3) priceRange = highestPrice - lowestPrice // Stormer Strategy (123): LONG var myLongOrders = array.new_int(0) longtEntryID = "Long Entry:\n" + str.tostring(bar_index) longExitID = "Long Exit:\n" + str.tostring(bar_index) stopLossInLong = lowestPrice + 0.01 takeProfitInLong = priceRange + high longEntryHasBeenMet = isInTradeWindow() and isBullishTrend() and isStormer123Buy() // Scheduling LONG entry if longEntryHasBeenMet array.push(myLongOrders, bar_index) strategy.order(longtEntryID, strategy.long, stop=high) strategy.exit(longExitID, longtEntryID, stop=stopLossInLong, limit=takeProfitInLong) // In pine script, any order scheduled but not yet filled can be canceled. // Once a order is filled, the trade is only finished with use of close or exit functions. // As scheduled orders are not stored in the strategy.opentrades array, manual control is required. for myOrderIndex = 0 to (array.size(myLongOrders) == 0 ? na : array.size(myLongOrders) - 1) myLongOrder = array.get(myLongOrders, myOrderIndex) if bar_index - myLongOrder == thresholdForEntryInput longEntryID = "Long Entry:\n" + str.tostring(myLongOrder) strategy.cancel(longEntryID) // Stormer Strategy (123): SHORT var myShortOrders = array.new_int(0) shortEntryID = "Short Entry:\n" + str.tostring(bar_index) shortExitID = "Short Exit:\n" + str.tostring(bar_index) stopLossInShort = highestPrice + 0.01 takeProfitInShort = low - priceRange shortEntryHasBeenMet = isInTradeWindow() and isBearishTrend() and isStormer123Sell() // Scheduling SHORT entry if shortEntryHasBeenMet array.push(myShortOrders, bar_index) strategy.order(shortEntryID, strategy.short, stop=low) strategy.exit(shortExitID, shortEntryID, stop=stopLossInShort, limit=takeProfitInShort) // In pine script, any order scheduled but not yet filled can be canceled. // Once a order is filled, the trade is only finished with use of close or exit functions. // As scheduled orders are not stored in the strategy.opentrades array, manual control is required. for myOrderIndex = 0 to (array.size(myShortOrders) == 0 ? na : array.size(myShortOrders) - 1) myShortOrder = array.get(myShortOrders, myOrderIndex) if bar_index - myShortOrder == thresholdForEntryInput shortEntryID := "Short Entry:\n" + str.tostring(myShortOrder) strategy.cancel(shortEntryID) // Close all positions at the end of the backtest period if isBacktestDateRangeOver() strategy.cancel_all() strategy.close_all(comment="Date Range Exit") // Display Signals plotshape(series=longEntryHasBeenMet, title="123 Buy", style=shape.triangleup, location=location.belowbar, color=buySignalColor, text="123", textcolor=buySignalColor) plotshape(series=shortEntryHasBeenMet, title="123 Sell", style=shape.triangledown, location=location.abovebar, color=sellSignalColor, text="123", textcolor=sellSignalColor)