Die doppelte Breakout-Volatilitätskanalstrategie berechnet die mittleren, oberen und unteren Bands des Kanals und verwendet Trend- und Volumenindikatoren, um die Marktrichtung und -dynamik zu bestimmen.
Der Kernindikator dieser Strategie ist der statistisch basierte Volatilitätskanal von Kerzenlinien. Das mittlere Band übernimmt den gleitenden Durchschnittsalgorithmus und die oberen und unteren Bande übernehmen die durchschnittliche wahre Bandbreite Methode, um die Grenzen von Kursschwankungen dynamisch zu erfassen. Gleichzeitig enthält die Strategie DMI und Volumenkriterien, um falsche Ausbrüche zu vermeiden.
Wenn der Preis aus der unteren Schiene in den Kanal bricht, übersteigt die +DI-Linie des DMI die -DI-Linie und den festgelegten ADX-Benchmark und das Handelsvolumen steigt, wird ein Kaufsignal generiert.
Der größte Vorteil dieser Strategie ist die Erfassung der wichtigsten Durchbruchsrichtung der Preise. Das Dual Breakout-Urteil kann die Seiten- und Schockmärkte effektiv vermeiden und die Anzahl der Stop-Losses reduzieren. Im Vergleich zu einfachen gleitenden Durchschnittsstrategien ist das Volatilitätskanal-Breakout-Urteil anpassungsfähiger an Kursschwankungen.
Darüber hinaus spielt die Einführung von Hilfsindikatoren DMI und Volumen auch eine gute Filterrolle und vermeidet falsche Signale.
Das größte Risiko der Dual-Breakout-Strategie ist, dass sie Marktumkehrungen nicht beurteilen kann. Wenn eine V-förmige Umkehrung auf dem Markt auftritt, kann der Stop-Loss-Punkt leicht ausgelöst werden. Darüber hinaus können unsachgemäße Parameter-Einstellungen auch das Handelssystem negativ beeinflussen.
Um die Risiken zu beheben, können wir die Parameter-Einstellungen weiter optimieren und Stop-Losses einschränken, um Risiken zu reduzieren.
Die Strategie bietet außerdem ein großes Optimierungspotenzial, das in folgenden Bereichen verbessert werden kann:
Optimierung von Parametern, z. B. Feinabstimmung der DI- und ADX-Länge der DMI
Erhöhung der Filterbedingungen, z. B. Kombination von MACD und anderen Indikatoren, um falsche Ausbrüche zu vermeiden
Implementieren Sie eine automatische Verfolgung von Take-Profit und Stop-Loss, um Risiken weiter zu kontrollieren
Optimierung der Parameter-Einstellungen und Filterregeln für verschiedene Produkte
Im Allgemeinen ist die Dual-Breakout-Volatilitätskanalstrategie ein effektives Breakout-System. Sie kann effektiv die Haupttrendrichtung und -dynamik bestimmen und hat ein großes Potenzial bei der Optimierung und Risikokontrolle. Wenn sie systematisch verbessert und optimiert wird, kann die Strategie langfristig stetig profitieren.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Original Idea by: Wunderbit Trading //@version=5 strategy('Keltner Channel ETH/USDT 1H', overlay=true, initial_capital=1000, pyramiding=0, currency='USD', default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.07) /// TREND ribbon_period = input.int(46, 'Period', step=1) leadLine1 = ta.ema(close, ribbon_period) leadLine2 = ta.sma(close, ribbon_period) // p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1) // p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1) // fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c) //Upward Trend UT = leadLine2 < leadLine1 DT = leadLine2 > leadLine1 ///////////////////////////////////////INDICATORS // KELTNER // source = close useTrueRange = input(true) length = input.int(81, step=1, minval=1) mult = input.float(2.5, step=0.1) // Calculate Keltner Channel ma = ta.sma(source, length) range_1 = useTrueRange ? ta.tr : high - low rangema = ta.sma(range_1, length) upper = ma + rangema * mult lower = ma - rangema * mult plot(ma, title='Middle', color=color.new(color.orange, 0)) p1 = plot(upper, title='Upper', color=color.new(color.orange, 0)) p2 = plot(lower, title='Lower', color=color.new(color.orange, 0)) fill(p1, p2, transp=90) // DMI INDICATOR // adxlen = 10 // input(10, title="ADX Smoothing") dilen = input(19, title='DI Length') keyLevel = 23 // input(23, title="key level for ADX") dirmov(len) => up = ta.change(high) down = -ta.change(low) truerange = ta.rma(ta.tr, len) plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange) minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) [adx, plus, minus] [sig, up, down] = adx(dilen, adxlen) benchmark = input.int(title='DMI Benchmark', defval=27, minval=1, step=1) // plot(sig, color=color.red, title="ADX") // plot(up, style=plot.style_histogram, color=color.green, title="+DI") // plot(down, style=plot.style_histogram, color=color.red, title="-DI") // plot(keyLevel, color=color.white, title="Key Level") /////////////////////////////////////////////////////////// ////////////////////////////////////////////////////Component Code Start testStartYear = input(2019, 'Backtest Start Year') testStartMonth = input(1, 'Backtest Start Month') testStartDay = input(1, 'Backtest Start Day') testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0) testStopYear = input(9999, 'Backtest Stop Year') testStopMonth = input(12, 'Backtest Stop Month') testStopDay = input(31, 'Backtest Stop Day') testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) testPeriod() => true ///// Component Code Stop ////////////////////////////////////////// //////////////// STRATEGY EXECUTION ////////////////////////// //LONG SET UP // Take Profit / Stop Loss long_tp1_inp = input.float(4.5, title='Long Take Profit 1 %', step=0.1) / 100 long_tp1_qty = input.int(15, title='Long Take Profit 1 Qty', step=1) long_tp2_inp = input.float(20, title='Long Take Profit 2%', step=0.1) / 100 long_tp2_qty = input.int(100, title='Long Take Profit 2 Qty', step=1) long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp) long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp) long_sl_inp = input.float(4, title='Long Stop Loss %', step=0.1) / 100 long_stop_level = strategy.position_avg_price * (1 - long_sl_inp) // STRATEGY CONDITION // LONG entry_long = open > lower and open < upper and close > upper and up > down and up > benchmark // and volume[0] > volume[1] entry_price_long = ta.valuewhen(entry_long, close, 0) SL_long = entry_price_long * (1 - long_sl_inp) exit_long = close < lower or low < SL_long // STRATEGY EXECUTION if testPeriod() // LONG if UT strategy.entry(id='Long', direction=strategy.long, when=entry_long, comment='INSERT ENTER LONG COMMAND') strategy.exit('TP1', 'Long', qty_percent=long_tp1_qty, limit=long_take_level_1) // PLACE TAKE PROFIT IN WBT BOT SETTINGS strategy.exit('TP2', 'Long', qty_percent=long_tp2_qty, limit=long_take_level_2) // PLACE TAKE PROFIT IN WBT BOT SETTINGS strategy.close(id='Long', when=exit_long, comment='INSERT EXIT LONG COMMAND') //PLOT FIXED SLTP LINE // LONG POSITION plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='1st Long Take Profit') plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='2nd Long Take Profit') plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Stop Loss')