Keltner Channel Trendbasierte Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-03 16:59:39
Tags:

img

Übersicht

Diese Strategie basiert auf drei Hauptindikatoren: dem Trendindikator, dem Keltner-Kanal und dem DM-Indikator.

Der Trendindikator besteht aus SMA und EMA. Der Keltner-Kanal wird verwendet, um den Öffnungs- und Schlusskurs von Kerzen zu bestimmen. Der DM-Indikator dient zur Beurteilung der Richtung von Long und Short.

Das Eingangssignal wird ausgelöst, wenn

  1. EMA überschreitet SMA und bestätigt Aufwärtstrend
  2. Kerze öffnet sich über dem oberen Band und schließt im Inneren des Kanals
  3. Der DM-Indikator liegt über der Benchmark

Die Strategie hat zwei Gewinnspielstufen und einen Stop-Loss-Spielstufen.

Strategieprinzipien

Identifizierung von Trends

Bei der Ermittlung der Trendrichtung werden SMA- und EMA-Kreuzungen verwendet.

Keltnerkanal

Der Kanal hat drei Linien: mittlere, obere und untere. Die mittlere Linie ist SMA des Schlusskurses mit einer Länge von 81. Die oberen und unteren Bande werden an einem Vielfachen des wahren Bereichs oberhalb und unterhalb der mittleren Linie platziert. Hier verwenden wir 2,5 Mal den wahren Bereich.

Der Keltner-Kanal zeigt Unterstützungs- und Widerstandsniveaus.

DM-Indikator

Der DM-Indikator enthält ADX, +DI und -DI. +DI misst die Stärke des Aufwärtstrends, während -DI die Stärke des Abwärtstrends misst.

Wenn +DI über die Benchmark (Standard 27) geht, signalisiert dies einen starken Aufwärtstrend und ist gut für einen Long-Entry.

Analyse der Vorteile

Diese Strategie kombiniert Trend-, Kanal- und Dynamikindikatoren, um die Kursbewegungen und die Long/Short-Richtung effektiv zu bestimmen.

  1. Die Trendidentifizierung ist relativ genau, um Gegentrendgeschäfte zu vermeiden.

  2. Der Keltner-Kanal zeigt klare Unterstützungs- und Widerstandsniveaus.

  3. Der DM-Indikator misst den langen/kurzen Impuls, um die Richtung sicherzustellen.

  4. Strenge Eintrittsregeln helfen, falsche Ausbrüche zu filtern.

  5. Profit- und Stop-Loss-Punkte ermöglichen die Gewinngewinnung.

Risikoanalyse

Es gibt auch einige Risiken, die zu berücksichtigen sind:

  1. Der Trend kann umgekehrt sein, wenn die EMA unterhalb der SMA überschreitet, also gehen Sie rechtzeitig aus.

  2. Der Kanal kann bei starken Trends versagen, nicht bei strengen Unterstützungs-/Widerstandsraten.

  3. DM kann falsche Signale erzeugen, die Preisbewegung überprüfen.

  4. Ein falscher Ausbruch kann einen Einstieg auslösen, aber schnell zurück, mit einem angemessenen Stop-Loss.

  5. Profit- und Stop-Loss-Anwendungen müssen kontinuierlich optimiert werden, um sich an sich ändernde Marktbedingungen anzupassen.

Optimierungsrichtlinien

Einige Möglichkeiten zur weiteren Optimierung der Strategie:

  1. Anpassung der Parameter und Prüfung verschiedener Methoden zur Identifizierung von Trends.

  2. Optimieren Sie die Kanalparameter, damit sie besser zur wahren Reichweite passen.

  3. Testen Sie verschiedene DM-Parameter und finden Sie die optimale Kombination.

  4. Fügen Sie mehr Eingabefilter wie Lautstärke hinzu.

  5. Versuchen Sie, den Stop-Loss zu verfolgen, um mehr Gewinne zu erzielen.

  6. Versuche für verschiedene Produkte getrennt, um die besten Parametermengen zu finden.

Schlussfolgerung

Die Strategie integriert mehrere Indikatoren zur Bestimmung von Trend, Support/Resistance und Momentum, was es ermöglicht, Trends effektiv zu erfassen und Risiken zu kontrollieren.


/*backtest
start: 2022-10-27 00:00:00
end: 2023-11-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: Wunderbit Trading

//@version=4
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(46, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = 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(81, step=1, minval=1)
mult         = input(2.5, step=0.1)

// Calculate Keltner Channel
ma      = sma(source, length)
range   = useTrueRange ? tr : high - low
rangema = sma(range, length)
upper = ma + rangema * mult
lower = ma - rangema * mult

plot(ma, title="Middle", color=color.orange)
p1=plot(upper, title="Upper", color=color.orange)
p2=plot(lower, title="Lower", color=color.orange)
fill(p1,p2)


// 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 = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
	[adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)

benchmark=input(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(4.5, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(20, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(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(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=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", long=true, 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.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")

Mehr