Dual ATR Channel trend following strategy adalah strategi trend tracking yang menggabungkan purata bergerak, saluran ATR dan pelbagai penunjuk teknikal untuk mengikuti trend selepas ia telah ditubuhkan.
Strategi ini menggunakan garis Kijun sebagai penunjuk purata bergerak utama untuk menentukan arah trend. Ia juga menggabungkan saluran ATR untuk mengehadkan julat aktiviti harga - tidak lama apabila harga berhampiran dengan band atas dan tidak pendek apabila harga berhampiran dengan band bawah untuk mengelakkan mengejar paras tertinggi baru dan menjual paras rendah.
Apabila garis Kijun mempunyai persilangan ke atas, isyarat beli dihasilkan. Apabila persilangan ke bawah berlaku, isyarat jual dicetuskan. Untuk menapis isyarat palsu, strategi ini juga menggunakan beberapa penunjuk teknikal untuk pengesahan, termasuk Aroon, RSI, MACD dan PSAR. Isyarat beli atau jual hanya dicetuskan apabila semua syarat pengesahan dipenuhi.
Sekali dalam perdagangan, strategi menggunakan stop loss dan mengambil keuntungan untuk menguruskan kedudukan. Stop loss ditetapkan pada 0.5 ATR dan mengambil keuntungan pada 0.5%. Apabila harga melintasi garisan Kijun ke arah yang bertentangan lagi, kedudukan akan ditutup dengan segera.
Strategi mengikuti trend saluran ATR berganda menggabungkan purata bergerak, saluran ATR dan pelbagai penunjuk teknikal untuk berdagang ke arah trend setelah ditubuhkan. Berbanding dengan strategi penunjuk tunggal, ia dapat meningkatkan kualiti isyarat dan kadar kemenangan. Mekanisme stop loss dan mengambil keuntungan juga mengawal risiko. Melalui pengoptimuman parameter dan ujian kombinasi, strategi ini berpotensi untuk mencapai keuntungan yang stabil. Tetapi ketergantungan pada data sejarah adalah kebimbangan dan prestasi langsung memerlukan pengesahan lanjut. Pengoptimuman berterusan adalah kunci untuk memastikan ketahanan.
/*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)