Diese Strategie identifiziert Trendformationen durch Berechnung von Kanälen und Momentumindikatoren, um einen Trend-Tracking-Handel zu erreichen.
Die Strategie verwendet hauptsächlich folgende zwei Indikatoren:
Momentum-Indikator (DMI): Beurteilt den langen und kurzen Trend auf dem Markt und erzeugt Handelssignale, wenn der Index den festgelegten Schwellenwert übersteigt.
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.
Die Strategie verwendet Dynamikindikatoren, um das frühe Stadium der Marktentwicklung zu bestimmen, was effizienter ist als Nachschubindikatoren wie einfache gleitende Durchschnitte.
Die Verwendung des Gleichgewichtskanals zur Bestimmung des spezifischen Handelsbereichs kann die Gewinnzone effektiv sperren.
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.
Die Strategie ist relativ einfach und klar, leicht zu verstehen und umzusetzen und eignet sich für Anfänger des quantitativen Handels.
Das Risiko der Strategie ist kontrollierbar und setzt dynamische Stop-Loss mit der Medianlinie ein, um einzelne Verluste effektiv zu kontrollieren.
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.
Der DMI-Indikator hat eine gewisse Verzögerung und kann keine Trendbestätigung ermitteln.
Die Festprozentsatz-Stop-Loss-Methode birgt Risiken, da sie nach starken Schwankungen nicht wieder in Trends eingreifen kann und so nachfolgende Trends verpasst.
Es gibt ausreichend Daten aus Backtests, aber es bedarf noch eines langfristigen Laufens, um die Parameterstabilität im realen Handel zu überprüfen.
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.
Es können sekundäre Bestätigungsindikatoren hinzugefügt werden, z. B. Volumenverstärkung, um den Eintritt nach der Trendbestätigung sicherzustellen.
Verschiedene Parameterkombinationen können getestet werden, um die optimale Parameterkombination zu finden.
Die Robustheit der Parameter kann durch schrittweise Optimierung und Vorwärtsprüfung überprüft werden.
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")