Strategie für den Volatilitätskanal der doppelten Ausbrüche

Schriftsteller:ChaoZhang, Datum: 2024-01-31 10:24:00 Uhr
Tags:

img

Übersicht

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.

Strategie Logik

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.

Analyse der Vorteile

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.

Risikoanalyse

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.

Optimierungsrichtlinien

Die Strategie bietet außerdem ein großes Optimierungspotenzial, das in folgenden Bereichen verbessert werden kann:

  1. Optimierung von Parametern, z. B. Feinabstimmung der DI- und ADX-Länge der DMI, Perioden- und Multiplikator-Einstellungen von Volatilitätskanälen usw.

  2. Erhöhung der Filterbedingungen, z. B. Kombination von MACD und anderen Indikatoren, um falsche Ausbrüche zu vermeiden

  3. Implementieren Sie eine automatische Verfolgung von Take-Profit und Stop-Loss, um Risiken weiter zu kontrollieren

  4. Optimierung der Parameter-Einstellungen und Filterregeln für verschiedene Produkte

Zusammenfassung

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')



Mehr