Bidirektionale ATR-Wellenhandelsstrategie


Erstellungsdatum: 2023-11-01 11:40:07 zuletzt geändert: 2023-11-01 11:40:07
Kopie: 0 Klicks: 642
1
konzentrieren Sie sich auf
1617
Anhänger

Bidirektionale ATR-Wellenhandelsstrategie

Überblick

Die bilaterale ATR-Wellen-Trading-Strategie ist eine Trend-Tracking-Strategie, bei der die Trend-Tracking-Trading-Strategie nach dem Aufbau der Trendrichtung in Kombination mit der Gewinnlinie, dem ATR und mehreren technischen Indikatoren durchgeführt wird.

Strategieprinzip

Die Strategie nutzt die Kijun-Linie als Haupt-Gleichgewichtsindikator, um die Richtung der Preisentwicklung zu bestimmen. Die Strategie kombiniert gleichzeitig den ATR-Kanal, um die Reichweite der Preisaktivität zu begrenzen. Nicht viel zu tun, wenn der Preis nahe an der Oberbahn ist, und keine Leerheit zu machen, wenn der Preis nahe an der Unterbahn ist, um einen Höhen- und Absturz zu vermeiden.

Bei einem Aufwärtsbruch der Kijun-Linie wird ein Kaufsignal erzeugt. Bei einem Abwärtsbruch wird ein Verkaufsignal erzeugt. Um Fehlsignale zu filtern, wird die Strategie auch mit mehreren technischen Indikatoren bestätigt, darunter der Aroon-Indikator, der RSI-Indikator, der MACD-Indikator und der PSAR-Indikator.

Nach dem Eintritt verwaltet die Strategie die Position mit Stop-Loss- und Stop-Stop-Methoden. Der Stop-Loss-Punkt beträgt 0,5 ATR und der Stop-Stop-Punkt 0,5%. Wenn der Preis erneut die Kijun-Linie umkehrt, wird der Stop-Loss-Exit ausgewählt.

Strategische Vorteile

  • Mit Kijun-Linien Trends zu bestimmen, um nicht in die Falle der Marktschwankungen zu geraten
  • ATR-Kanal beschränkt Preisaktivität und hilft, Risiken zu kontrollieren
  • Mehrfache technische Kennzahlen bestätigt, um Fehlsignale stark zu filtern
  • In Kombination mit Stop-Loss-Stopp-Risiko-Management, profitabel, um Gewinne zu sichern

Strategisches Risiko

  • Mehrere Indikatoren bestätigen eine Signalverzögerung, die den Beginn des Trends verpassen könnte
  • Eine zu kleine Stop-Loss-Punkt kann häufig zum Auslaufen gebracht werden.
  • Unvernünftige Kijun- und ATR-Parameter können zu häufigen Fehlsignalen führen
  • Die Festplatte kann auf Parameteroptimierung und historische Datenvergleichsresultate zurückgreifen

Optimierungsrichtung

  • Es gibt auch eine Reihe von anderen Trendindikatoren, wie z.B. die Ichimoku-Cloud-Chart.
  • Anpassung der Stop-Loss-Stopp-Punkte und Optimierung der Verlustquote
  • Die optimale Kombination von Parametern für verschiedene Märkte
  • Erweiterte Funktion zur automatischen Parameteranpassung und Anpassung der Parameter an den Markt in Echtzeit
  • Testen Sie die Wirkung verschiedener Kombinationen von Bestätigungsindikatoren

Zusammenfassen

Die zweiseitige ATR-Wellen-Trading-Strategie kombiniert die Verwendung von Mittellinien, ATR-Kanälen und mehreren unterstützenden technischen Indikatoren, um die Trendverfolgung zu betreiben, nachdem die Trendrichtung festgestellt wurde. Im Vergleich zu einer einzelnen Indikator-Strategie können die Signalqualität und die Gewinnwahrscheinlichkeit erheblich verbessert werden.

Strategiequellcode
/*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)