Xu hướng kênh ATR kép theo chiến lược

Tác giả:ChaoZhang, Ngày: 2023-11-01 11:40:07
Tags:

img

Tổng quan

Chiến lược theo dõi xu hướng kênh ATR kép là một chiến lược theo dõi xu hướng kết hợp các đường trung bình động, các kênh ATR và nhiều chỉ số kỹ thuật để theo dõi xu hướng sau khi nó được thiết lập.

Làm thế nào nó hoạt động

Chiến lược này sử dụng đường Kijun làm chỉ số trung bình động chính để xác định hướng xu hướng. Nó cũng kết hợp các kênh ATR để giới hạn phạm vi hoạt động giá - không đi dài khi giá gần dải trên và không đi ngắn khi giá gần dải dưới để tránh đuổi theo mức cao mới và bán thấp.

Khi đường Kijun có đường chéo lên, một tín hiệu mua được tạo ra. Khi một đường chéo xuống xảy ra, một tín hiệu bán được kích hoạt. Để lọc ra các tín hiệu sai, chiến lược cũng sử dụng nhiều chỉ số kỹ thuật để xác nhận, bao gồm Aroon, RSI, MACD và PSAR. Một tín hiệu mua hoặc bán chỉ được kích hoạt khi tất cả các điều kiện xác nhận được đáp ứng.

Một khi giao dịch, chiến lược sử dụng stop loss và take profit để quản lý các vị trí. Stop loss được đặt ở mức 0,5 ATR và take profit ở mức 0,5%. Khi giá vượt qua đường Kijun theo hướng ngược lại một lần nữa, vị trí sẽ được đóng ngay lập tức.

Ưu điểm

  • Sử dụng đường Kijun để xác định xu hướng tránh bị đánh bại bởi các thị trường giới hạn phạm vi
  • Các kênh ATR hạn chế hoạt động giá để kiểm soát rủi ro tốt hơn
  • Nhiều xác nhận làm giảm đáng kể các tín hiệu sai
  • Kết hợp các khóa dừng lỗ và lấy lợi nhuận trong lợi nhuận trong khi quản lý rủi ro

Rủi ro

  • Các tín hiệu chậm từ nhiều xác nhận, có thể bỏ lỡ các động thái xu hướng ban đầu
  • Các lỗ dừng nhỏ có thể bị dừng thường xuyên
  • Kijun kém và các thông số ATR có thể tạo ra nhiều tín hiệu sai
  • Sự dựa vào tối ưu hóa tham số và phù hợp đường cong, có thể không hoạt động tốt trong giao dịch trực tiếp

Cơ hội cải thiện

  • Kiểm tra các chỉ số xu hướng tiên tiến hơn như mây Ichimoku
  • Tối ưu hóa điểm dừng lỗ và lấy lợi nhuận để có tỷ lệ phần thưởng rủi ro tốt hơn
  • Tìm các thông số tối ưu cho các thị trường khác nhau
  • Thêm điều chỉnh động các thông số dựa trên điều kiện thị trường trực tiếp
  • Kiểm tra kết hợp các chỉ số xác nhận khác nhau
  • Tiếp tục tối ưu hóa để đảm bảo sự vững chắc của chiến lược

Kết luận

Chiến lược theo xu hướng kênh ATR kép kết hợp trung bình động, kênh ATR và nhiều chỉ số kỹ thuật để giao dịch theo hướng xu hướng một khi được thiết lập. So với các chiến lược chỉ số duy nhất, nó có thể cải thiện đáng kể chất lượng tín hiệu và tỷ lệ thắng. Cơ chế dừng lỗ và lấy lợi nhuận cũng kiểm soát rủi ro. Thông qua tối ưu hóa tham số và thử nghiệm kết hợp, chiến lược này có tiềm năng đạt được lợi nhuận ổn định. Nhưng sự phụ thuộc của nó vào dữ liệu lịch sử là một mối quan tâm và hiệu suất trực tiếp cần xác minh thêm.


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



Thêm nữa