Doppelkanal-ATR-Trend nach Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-01 11:40:07
Tags:

img

Übersicht

Die Strategie zur Beobachtung des Trendverlaufs im Doppel-ATR-Kanal ist eine Trendverfolgungsstrategie, die gleitende Durchschnitte, ATR-Kanäle und mehrere technische Indikatoren kombiniert, um dem Trend nach seiner Feststellung zu folgen.

Wie es funktioniert

Die Strategie verwendet die Kijun-Linie als Haupt gleitenden Durchschnittsindikator, um die Trendrichtung zu bestimmen. Es enthält auch ATR-Kanäle, um die Preisaktivitätsspanne zu begrenzen - nicht lange zu gehen, wenn der Preis in der Nähe des oberen Bandes ist, und nicht kurz zu gehen, wenn der Preis in der Nähe des unteren Bandes ist, um zu vermeiden, neue Höchststände zu verfolgen und Tiefstände zu verkaufen.

Wenn die Kijun-Linie einen Aufwärts-Crossover hat, wird ein Kaufsignal generiert. Wenn ein Abwärts-Crossover eintritt, wird ein Verkaufssignal ausgelöst. Um falsche Signale auszufiltern, verwendet die Strategie auch mehrere technische Indikatoren zur Bestätigung, einschließlich Aroon, RSI, MACD und PSAR. Ein Kauf- oder Verkaufssignal wird nur ausgelöst, wenn alle Bestätigungsbedingungen erfüllt sind.

Einmal in einem Handel verwendet die Strategie Stop-Loss und Take-Profit, um Positionen zu verwalten. Der Stop-Loss wird auf 0,5 ATR und Take-Profit auf 0,5 festgelegt. Wenn der Preis die Kijun-Linie wieder in die entgegengesetzte Richtung überschreitet, wird die Position sofort geschlossen.

Vorteile

  • Die Verwendung der Kijun-Linie zur Bestimmung des Trends verhindert, dass Sie von den Märkten mit Bandbreite beeinflusst werden
  • ATR-Kanäle beschränken die Preisaktivität für eine bessere Risikokontrolle
  • Mehrfache Bestätigungen reduzieren die falschen Signale erheblich
  • Einbeziehung von Stop-Loss- und Take-Profit-Locks in die Gewinne bei der Risikomanagement

Risiken

  • Verzögerte Signale aus mehreren Bestätigungen, möglicherweise fehlende frühe Trendbewegungen
  • Kleine Stop-Loss können häufig gestoppt werden
  • Schlechte Kijun- und ATR-Parameter können viele falsche Signale erzeugen
  • Die Abhängigkeit von Parameteroptimierung und Kurvenanpassung kann im Live-Handel nicht gut funktionieren

Möglichkeiten zur Verbesserung

  • Testen Sie fortschrittlichere Trendindikatoren wie Ichimoku-Wolken
  • Optimieren Sie Stop-Loss- und Take-Profit-Punkte für eine bessere Risikovergütung
  • Finden Sie optimale Parameter für verschiedene Märkte
  • Hinzufügen einer dynamischen Anpassung der Parameter auf der Grundlage der Marktbedingungen
  • Versuche verschiedene Kombinationen von Bestätigungsindikatoren
  • Kontinuierliche Optimierung zur Gewährleistung der Robustheit der Strategie

Schlussfolgerung

Die doppelte ATR-Kanal-Trend-Folge-Strategie kombiniert gleitende Durchschnitte, ATR-Kanäle und mehrere technische Indikatoren, um in die Richtung des Trends zu handeln. Im Vergleich zu einzelnen Indikator-Strategien kann sie die Signalqualität und die Gewinnrate erheblich verbessern. Die Stop-Loss- und Take-Profit-Mechanismen kontrollieren auch das Risiko. Durch Parameteroptimierung und kombinatorische Tests hat diese Strategie das Potenzial, stetige Gewinne zu erzielen. Aber ihre Abhängigkeit von historischen Daten ist ein Problem und die Live-Performance erfordert weitere Verifizierung.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-10-27 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// strategy(title="NoNonsense Forex", overlay=true, default_qty_value=100000, initial_capital=100)

//////////////////////
////// BASELINE //////
//////////////////////
ma_slow_type = input(title="Baseline Type", type=input.string, defval="Kijun", options=["ALMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMA", "SMMA", "HMA", "LSMA", "Kijun", "McGinley"])
ma_slow_src = close //input(title="MA Source", type=input.source, defval=close)
ma_slow_len = input(title="Baseline Length", type=input.integer, defval=20)
ma_slow_len_fast = input(title="Baseline Length Fast", type=input.integer, defval=12)

lsma_offset  = input(defval=0, title="* Least Squares (LSMA) Only - Offset Value", minval=0)
alma_offset  = input(defval=0.85, title="* Arnaud Legoux (ALMA) Only - Offset Value", minval=0, step=0.01)
alma_sigma   = input(defval=6, title="* Arnaud Legoux (ALMA) Only - Sigma Value", minval=0)

ma(type, src, len) =>
    float result = 0
    if type=="SMA" // Simple
        result := sma(src, len)
    if type=="EMA" // Exponential
        result := ema(src, len)
    if type=="DEMA" // Double Exponential
        e = ema(src, len)
        result := 2 * e - ema(e, len)
    if type=="TEMA" // Triple Exponential
        e = ema(src, len)
        result := 3 * (e - ema(e, len)) + ema(ema(e, len), len)
    if type=="WMA" // Weighted
        result := wma(src, len)
    if type=="VWMA" // Volume Weighted
        result := vwma(src, len) 
    if type=="SMMA" // Smoothed
        w = wma(src, len)
        result := na(w[1]) ? sma(src, len) : (w[1] * (len - 1) + src) / len
    if type=="HMA" // Hull
        result := wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))
    if type=="LSMA" // Least Squares
        result := linreg(src, len, lsma_offset)
    if type=="ALMA" // Arnaud Legoux
        result := alma(src, len, alma_offset, alma_sigma)
    if type=="Kijun" //Kijun-sen
        kijun = avg(lowest(len), highest(len))
        result :=kijun
    if type=="McGinley"
        mg = 0.0
        mg := na(mg[1]) ? ema(src, len) : mg[1] + (src - mg[1]) / (len * pow(src/mg[1], 4))
        result :=mg
    result

baseline = ma(ma_slow_type, ma_slow_src, ma_slow_len)
plot(baseline, title='Baseline', color=rising(baseline,1) ? color.green : falling(baseline,1) ? color.maroon : na, linewidth=3)

//////////////////
////// ATR ///////
//////////////////
atrlength=input(14, title="ATR Length")
one_atr=rma(tr(true), atrlength)
upper_atr_band=baseline+one_atr
lower_atr_band=baseline-one_atr
plot(upper_atr_band, color=color.gray, style=plot.style_areabr, transp=95, histbase=50000, title='ATR Cave')
plot(lower_atr_band, color=color.gray, style=plot.style_areabr, transp=95, histbase=0, title='ATR Cave')
plot(upper_atr_band, color=close>upper_atr_band ? color.fuchsia : na, style=plot.style_line, linewidth=5, transp=50, title='Close above ATR cave')
plot(lower_atr_band, color=close<lower_atr_band ? color.fuchsia : na, style=plot.style_line, linewidth=5, transp=50, title='Close below ATR cave')
donttradeoutside_atrcave=input(true)
too_high = close>upper_atr_band and donttradeoutside_atrcave
too_low = close<lower_atr_band and donttradeoutside_atrcave

////////////////////////////
////// CONFIRMATION 1 ////// the trigger actually
////////////////////////////
lenaroon = input(8, minval=1, title="Length Aroon")
c1upper = 100 * (highestbars(high, lenaroon+1) + lenaroon)/lenaroon
c1lower = 100 * (lowestbars(low, lenaroon+1) + lenaroon)/lenaroon
c1CrossUp=crossover(c1upper,c1lower)
c1CrossDown=crossunder(c1upper,c1lower)


////////////////////////////////
////// CONFIRMATION: MACD //////
////////////////////////////////
dont_use_macd=input(false)
macd_fast_length = input(title="Fast Length", type=input.integer, defval=13)
macd_slow_length = input(title="Slow Length", type=input.integer, defval=26)
macd_signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
macd_fast_ma = ema(close, macd_fast_length)
macd_slow_ma = ema(close, macd_slow_length)
macd = macd_fast_ma - macd_slow_ma
macd_signal = ema(macd, macd_signal_length)
macd_hist = macd - macd_signal

macdLong=macd_hist>0 or dont_use_macd
macdShort=macd_hist<0 or dont_use_macd

/////////////////////////////
///// CONFIRMATION: RSI /////
/////////////////////////////
dont_use_rsi=input(false)
lenrsi = input(14, minval=1, title="RSI Length") //14
up = rma(max(change(close), 0), lenrsi)
down = rma(-min(change(close), 0), lenrsi)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiLong=rsi>50 or dont_use_rsi
rsiShort=rsi<50 or dont_use_rsi

//////////////////////////////
///// CONFIRMATION: PSAR /////
//////////////////////////////
dont_use_psar=input(false)
psar_start = input(0.03, step=0.01)
psar_increment = input(0.018, step=0.001)
psar_maximum = input(0.11, step=0.01) //default 0.08
psar = sar(psar_start, psar_increment, psar_maximum)

plot(psar, style=plot.style_cross, color=color.blue, title='PSAR')
psarLong=close>psar or dont_use_psar
psarShort=close<psar or dont_use_psar

/////////////////////////
///// CONFIRMATIONS /////
/////////////////////////
Long_Confirmations=psarLong and rsiLong and macdLong
Short_Confirmations=psarShort and rsiShort and macdShort

GoLong=c1CrossUp and Long_Confirmations and not too_high
GoShort=c1CrossDown and Short_Confirmations and not too_low

////////////////////
///// STRATEGY /////
////////////////////

use_exit=input(false)
KillLong=c1CrossDown and use_exit
KillShort=c1CrossUp and use_exit

SL=input(0.5, step=0.1)/syminfo.mintick
TP=input(0.005, step=0.001)/syminfo.mintick

strategy.entry("nnL", strategy.long, when = GoLong)
strategy.entry("nnS", strategy.short, when = GoShort)
strategy.exit("XL-nn", from_entry = "nnL", loss = SL, profit=TP)
strategy.exit("XS-nn", from_entry = "nnS", loss = SL, profit=TP)
strategy.close("nnL", when = KillLong)
strategy.close("nnS", when = KillShort)



Mehr