
Die Strategie des bilateralen Durchbruchs der K-Linie-Schwankungen erfolgt durch die Berechnung der mittleren, oberen und unteren Schienen des Kanals, in Kombination mit Trendindikatoren und Kennzahlen, um die Richtung und Stärke der Marktlage zu bestimmen und gleichzeitig ein Durchbruchsignal auf beiden Seiten des Kanals zu setzen, um das Hauptziel des niedrigen Kauf- und Verkaufs zu erreichen.
Die Kernindikatoren der Strategie basieren auf der statistischen K-Linien-Schwankungskanal. Die mittlere Schiene der Kanal verwendet die Mittellinie-Algorithmen, die oberen und unteren Schienen verwenden die Berechnungsmethode der durchschnittlichen realen Breite, um die Grenzen der Preisfluktuation dynamisch zu erfassen. Gleichzeitig fügt die Strategie die DMI- und Handelsvolumen-Urteilsregeln hinzu, um zu vermeiden, dass falsche Durchbrüche zu Verlusten führen.
Konkret, wenn der Preis aus dem unteren Bahnbruch in den Kanal eintritt, überschreitet die +DI-Linie des DMI die -DI-Linie und die gesetzte ADX-Benchmark und erzeugt ein Kaufsignal, wenn der Umsatz erhöht wird. Im Gegensatz dazu, wenn der Preis aus dem oberen Bahnbruch in den unteren Kanal eintritt, erzeugt die Beurteilungsregel das Gegenteil von oben und erzeugt ein Verkaufssignal.
Der größte Vorteil dieser Strategie besteht darin, die Richtung der wichtigsten Preisdurchbrüche zu erfassen. Die Verwendung von bilateralen Durchbrüchen vermeidet effektiv Korrekturen und Erschütterungen und reduziert die Anzahl der Stop-Losses. Im Vergleich zu einer einfachen Moving-Average-Strategie ist die K-Channel-Durchbruch-Beurteilung besser an die Preisschwankungen angepasst.
Darüber hinaus spielt die Einführung von Hilfsindikatoren DMI und Umsatz eine gute Filterwirkung, um falsche Signale zu vermeiden. Aus Sicht der Gewinn- und Verlustquote hat die Strategie also einige Vorteile.
Die größte Gefahr bei einer bilateralen Durchbruchstrategie besteht darin, dass die Umkehrung nicht beurteilt werden kann. Wenn eine V-Umkehrung eintritt, kann der Stop-Loss leicht ausgelöst werden. Darüber hinaus kann die falsche Einstellung der Parameter auch negative Auswirkungen auf das Handelssystem haben.
Für Risiken können wir die Risiken reduzieren, indem wir die Kennzahlen weiter optimieren und die Stop-Loss-Marge verringern. Natürlich kann ein Handelssystem niemals vollständig Verluste vermeiden, der Schlüssel ist, das Risiko zu kontrollieren.
Die Strategie bietet auch ein großes Optimierungspotenzial und kann vor allem in folgenden Bereichen verbessert werden:
Optimierungsparameter wie die DI- und ADX-Längen des DMI, die Periodizität und die Multiplikator-Einstellungen des K-Kanals
Hinzufügen von Filterbedingungen, um falsche Durchbrüche zu vermeiden, z. B. in Kombination mit anderen Indikatoren wie MACD
Automatische Stop-Loss-Verfolgung zur weiteren Risikokontrolle
Optimierung der Parameter-Einstellungen und Filterregeln für verschiedene Sorten
Die Strategie der bilateralen Durchbruch K-Linie ist im Allgemeinen ein funktionierendes Durchbruchssystem. Sie kann die Richtung und Stärke der wichtigsten Trends effektiv beurteilen und hat großes Potenzial für die Optimierung und Risikokontrolle. Wenn sie systematisch verbessert und optimiert wird, kann die Strategie langfristig stabile Gewinne erzielen.
/*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')