Momentum-Gleichgewichtskanal-Trendverfolgungsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-12-12 18:07:31
Tags:

img

Übersicht

Diese Strategie identifiziert Trendformationen durch Berechnung von Kanälen und Momentumindikatoren, um einen Trend-Tracking-Handel zu erreichen.

Strategieprinzip

Die Strategie verwendet hauptsächlich folgende zwei Indikatoren:

  1. Momentum-Indikator (DMI): Beurteilt den langen und kurzen Trend auf dem Markt und erzeugt Handelssignale, wenn der Index den festgelegten Schwellenwert übersteigt.

  2. Gleichgewichtskanal (Keltner-Kanal): Bestimmt den Trendbereich. Wenn der Preis durch die obere Schiene bricht, ist es Zeit zu kaufen, und wenn der Preis unter die mittlere Schiene fällt, ist es ein Signal, die Position zu schließen.

Die spezifische Handelslogik ist: Wenn der +DI-Impulsindikator größer als die festgelegte Schwelle (Standard 32) ist, wird festgestellt, dass sich ein bullischer Trend gebildet hat. Zu diesem Zeitpunkt wird, wenn der Preis durch die obere Schiene des Gleichgewichtskanals bricht, ein Kaufsignal generiert; danach wird der Gleichgewichtskanal verwendet. Die mittlere Schiene wird als Stop-Loss-Linie verwendet, um den Stop-Loss zu verfolgen und Gewinnschutz zu erzielen.

Diese Strategie kombiniert die Vorteile von zwei Indikatoren, verwendet Momentum-Indikatoren, um die Trendrichtung zu bestimmen, und verwendet Gleichgewichtskanäle, um Eintrittszeiten und Stop-Loss-Bereiche zu bestimmen.

Analyse der Vorteile

  1. Die Strategie verwendet Dynamikindikatoren, um das frühe Stadium der Marktentwicklung zu bestimmen, was effizienter ist als Nachschubindikatoren wie einfache gleitende Durchschnitte.

  2. Die Verwendung des Gleichgewichtskanals zur Bestimmung des spezifischen Handelsbereichs kann die Gewinnzone effektiv sperren.

  3. Die Indikatorparameter und die Handelsregeln sind streng und angemessen, und die Daten aus den Backtests ergeben sich gut und bestätigen die tatsächliche Kampfwirkung.

  4. Die Strategie ist relativ einfach und klar, leicht zu verstehen und umzusetzen und eignet sich für Anfänger des quantitativen Handels.

  5. Das Risiko der Strategie ist kontrollierbar und setzt dynamische Stop-Loss mit der Medianlinie ein, um einzelne Verluste effektiv zu kontrollieren.

Risikoanalyse

  1. Die Strategie eignet sich nur für Trendmärkte und nicht für konsolidierende und schwankende Märkte. Wenn der QtCore-Kanal steigt und der mittlere Schienenhaltverlust zu locker ist, kann er den Verlust nicht kontrollieren.

  2. Der DMI-Indikator hat eine gewisse Verzögerung und kann keine Trendbestätigung ermitteln.

  3. Die Festprozentsatz-Stop-Loss-Methode birgt Risiken, da sie nach starken Schwankungen nicht wieder in Trends eingreifen kann und so nachfolgende Trends verpasst.

  4. Es gibt ausreichend Daten aus Backtests, aber es bedarf noch eines langfristigen Laufens, um die Parameterstabilität im realen Handel zu überprüfen.

Optimierung

  1. Es können verschiedene Stop-Loss-Methoden getestet werden, z. B. ATR-Stop-Loss, beweglicher Stop-Loss usw., um einen festen Stop-Loss-Prozentsatz zu ersetzen.

  2. Es können sekundäre Bestätigungsindikatoren hinzugefügt werden, z. B. Volumenverstärkung, um den Eintritt nach der Trendbestätigung sicherzustellen.

  3. Verschiedene Parameterkombinationen können getestet werden, um die optimale Parameterkombination zu finden.

  4. Die Robustheit der Parameter kann durch schrittweise Optimierung und Vorwärtsprüfung überprüft werden.

Zusammenfassung

Diese Strategie ermöglicht eine effiziente Erfassung von Trending-Märkten durch doppelte Indikatorurteile. Die Strategie ist relativ einfach und intuitiv mit klarer Logik und guter Backtestleistung. Sie kann als eine der Einstiegsstrategien für den quantitativen Handel dienen.


/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: @Wunderbit


//@version=4
strategy("Keltner Channel [LINKUSDT] 1H", overlay=true, initial_capital=3000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100,  commission_type=strategy.commission.percent,commission_value=0.1)


/// TREND
trend_cond = input(true, title="Enable Ribbon Filter")
ribbon_period = input(30, "Ribbon 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(80, "KELTNER Period", step=1, minval=1)
mult         = input(3.0,"KELTNER Multiple", step=0.1)

// Calculate Keltner Channel
ma      = ema(source, length)
range   = useTrueRange ? tr : high - low
rangema = ema(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 //

lensig = input(14, title="ADX Smoothing", minval=1, maxval=50)
len = input(14, minval=1, title="DI Length")
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / trur)
minus = fixnan(100 * rma(minusDM, len) / trur)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)

trig_level=input(title="+DI Trigger Level", defval=32, minval=1,step=1)
//trig_level_adx=input(title="ADX Trigger Level", defval=30, minval=1,step=1)

//plot(adx, color=#FF006E, title="ADX")
//plot(plus, color=#0094FF, title="+DI")
//plot(minus, color=#FF6A00, title="-DI")
// plot(trig_level, 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(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
    
///// Component Code Stop //////////////////////////////////////////

//////////////// STRATEGY EXECUTION //////////////////////////

// STRATEGY CONDITION
// LONG

long = ((open > lower and open < upper) and close > upper) and plus > minus and plus > trig_level and volume[0] > volume[1]
entry_long = trend_cond ? long and UT : long
exit_long = (close < ma) //or low < SL_long

//LONG SET UP
// Take Profit / Stop Loss

entry_price_long=valuewhen(entry_long,close,0)
//SL_long = entry_price_long * (1 - long_sl_inp)

long_tp1_inp = input(8, title='Long Take Profit 1 Target %', step=0.1)/100
long_tp1_qty = input(20, title="Long Take Profit 1 Qty %", step=1)

long_tp2_inp = input(16, title='Long Take Profit 2 Target %', step=0.1)/100
long_tp2_qty = input(30, 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 EXECUTION
if testPeriod()

    // LONG
    
    strategy.entry(id="Long", long=true, when=entry_long, comment = "INSERT ENTRY 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