Chiến lược giao dịch sóng ATR hai chiều


Ngày tạo: 2023-11-01 11:40:07 sửa đổi lần cuối: 2023-11-01 11:40:07
sao chép: 0 Số nhấp chuột: 642
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch sóng ATR hai chiều

Tổng quan

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

Nguyên tắc chiến lược

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

Đường Kijun tạo ra tín hiệu mua khi xảy ra đột phá lên, tạo ra tín hiệu bán khi xảy ra đột phá xuống. Để lọc tín hiệu sai, chiến lược cũng giới thiệu nhiều chỉ số kỹ thuật để xác nhận, bao gồm chỉ số Aroon, chỉ số RSI, chỉ số MACD và chỉ số PSAR.

Sau khi vào thị trường, chiến lược sử dụng phương thức dừng lỗ và dừng để quản lý vị trí. Điểm dừng lỗ là 0.5 ATR, điểm dừng là 0.5%. Khi giá vượt qua đường Kijun một lần nữa, hãy chọn dừng lỗ ngay lập tức.

Lợi thế chiến lược

  • Sử dụng đường Kijun để đánh giá xu hướng, tránh bị mắc kẹt trong thị trường bất ổn
  • Kênh ATR giới hạn phạm vi hoạt động giá, tốt để kiểm soát rủi ro
  • Một số chỉ số kỹ thuật đã được xác nhận, có thể lọc các tín hiệu sai
  • Kết hợp với quản lý rủi ro dừng lỗ, lợi nhuận khóa lợi nhuận

Rủi ro chiến lược

  • Một số chỉ số xác nhận có sự chậm trễ trong tín hiệu, có thể bỏ lỡ giai đoạn bắt đầu của xu hướng
  • Điểm dừng quá nhỏ có thể bị dừng thường xuyên
  • Kijun line và ATR tham số không hợp lý có thể dẫn đến tín hiệu sai thường xuyên
  • Đĩa cứng có thể không hoạt động tốt, phụ thuộc vào tối ưu hóa tham số và kết quả so sánh dữ liệu lịch sử

Hướng tối ưu hóa

  • Thử các chỉ số xu hướng tiên tiến hơn, chẳng hạn như biểu đồ đám mây Ichimoku
  • Điều chỉnh điểm dừng lỗ, tối ưu hóa tỷ lệ thua lỗ
  • Kiểm tra các tham số tốt nhất cho các thị trường khác nhau
  • Thêm chức năng điều chỉnh tham số tự động để điều chỉnh tham số theo thị trường thực tế
  • Kiểm tra hiệu quả của sự kết hợp các chỉ số xác nhận khác nhau

Tóm tắt

Chiến lược giao dịch sóng ATR hai chiều kết hợp sử dụng đường trung bình, kênh ATR và nhiều chỉ số kỹ thuật phụ trợ để thực hiện hoạt động theo dõi xu hướng sau khi xác định hướng xu hướng. Nó có thể cải thiện đáng kể chất lượng tín hiệu và xác suất lợi nhuận so với chiến lược chỉ số đơn.

Mã nguồn chiến lược
/*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)