Chiến lược ADX + RSI

Tác giả:ChaoZhang, Ngày: 2023-09-27 16:27:39
Tags:

Tổng quan

Đây là một chiến lược theo xu hướng kết hợp các chỉ số ADX và RSI. Nó sử dụng RSI để xác định mức mua quá mức và bán quá mức để tạo ra các tín hiệu giao dịch, và ADX để xác định xu hướng để lọc các giao dịch khi xu hướng không rõ ràng, do đó tránh các whipsaws trong các thị trường giới hạn phạm vi.

Chiến lược logic

  1. Sử dụng chỉ số RSI 7 giai đoạn để xác định mức mua quá mức và bán quá mức
  • RSI dưới 30 được coi là bán quá mức
  • RSI trên 70 được coi là mua quá mức
  1. Sử dụng ADX để xác định xu hướng
  • ADX trên 30 cho thấy xu hướng mạnh mẽ
  • ADX dưới 30 cho thấy không có xu hướng
  1. Quy tắc nhập cảnh
  • Mức đầu tư đầu tư đầu tư
  • Mức giá ngắn khi RSI > 70 và ADX > 30
  1. Lấy lợi nhuận và dừng lỗ
  • Các phương pháp lấy lợi nhuận và dừng lỗ tùy chọn - dựa trên đóng cửa hoặc dựa trên dao động
  • Giá đóng cửa sử dụng gần
  • Sử dụng dựa trên biến động mức cao / thấp biến động gần đây

Phân tích lợi thế

  1. RSI xác định hiệu quả mức mua quá mức và bán quá mức để tránh bẫy mua / bán

  2. ADX lọc ra các thị trường giới hạn phạm vi để tránh whipsaws

  3. Phương pháp lấy lợi nhuận / dừng lỗ tùy chọn giúp kiểm soát tốt hơn rủi ro

  4. Đơn giản và dễ hiểu, tốt cho người mới bắt đầu học giao dịch thuật toán

  5. Nhiều chỗ cho tối ưu hóa và tinh chỉnh tham số

Phân tích rủi ro

  1. Chỉ số RSI mua quá mức / bán quá mức có thể có giảm và đảo ngược

  2. ADX xác định xu hướng có sự chậm trễ, có thể bỏ lỡ các điểm chuyển hướng xu hướng

  3. Đặt stop loss không đúng có thể dẫn đến lỗ

  4. Nguy cơ tối ưu hóa quá mức do sự đơn giản

  5. Tối ưu hóa tham số cần thiết cho hiệu suất tốt hơn

Hướng dẫn tối ưu hóa

  1. Tối ưu hóa các thông số RSI và mức mua quá mức / bán quá mức

  2. Kiểm tra các khoảng thời gian ADX khác nhau để tìm thiết lập tối ưu

  3. Kiểm tra các phương pháp lấy lợi nhuận / dừng lỗ khác nhau

  4. Thêm bộ lọc xu hướng để tránh giao dịch ngược xu hướng

  5. Kết hợp với các chỉ số khác để tăng hiệu suất

Tóm lại

Chiến lược này kết hợp các điểm mạnh của các chỉ số RSI và ADX cổ điển để xác định xu hướng và tránh các whipsaws. Nó có nhiều chỗ để tối ưu hóa để đạt được hiệu suất tốt hơn. Nhìn chung, nó phục vụ tốt như một chiến lược giao dịch thuật toán giới thiệu của người mới bắt đầu, và cũng có thể được kết hợp vào các hệ thống giao dịch phức tạp hơn.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © tweakerID

// This is a strategy that uses the 7 Period RSI to buy when the indicator is shown as oversold (OS) and sells when 
// the index marks overbought (OB). It also uses the ADX to determine whether the trend is ranging or trending
// and filters out the trending trades. Seems to work better for automated trading when the logic is inversed (buying OB 
// and selling the OS) wihout stop loss.

//@version=4
strategy("ADX + RSI Strat", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, commission_value=0.04, calc_on_every_tick=false)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))


//SL & TP Inputs
i_SL=input(false, title="Use Swing Lo/Hi Stop Loss & Take Profit")
i_SwingLookback=input(20, title="Swing Lo/Hi Lookback")
i_SLExpander=input(defval=0, step=.2, title="SL Expander")
i_TPExpander=input(defval=0, step=.2, title="TP Expander")
i_reverse=input(true, title="Reverse Trades")

//SL & TP Calculations
SwingLow=lowest(i_SwingLookback)
SwingHigh=highest(i_SwingLookback)
bought=strategy.position_size != strategy.position_size[1]
LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0))*i_SLExpander)
SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0))*i_SLExpander)
lTP=strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0))+((valuewhen(bought, atr(14), 0))*i_TPExpander))
sTP=strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0)-strategy.position_avg_price)-((valuewhen(bought, atr(14), 0))*i_TPExpander)
islong=strategy.position_size > 0
isshort=strategy.position_size < 0
SL= islong ? LSL : isshort ? SSL : na
TP= islong ? lTP : isshort ? sTP : na

//RSI Calculations
RSI=rsi(close, 7)
OS=input(30, step=5)
OB=input(80, step=5)

//ADX Calculations
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
adxlevel=input(30, step=5)


//Entry Logic
BUY = sig < adxlevel and (RSI < OS) 
SELL = sig < adxlevel and (RSI > OB) 

//Entries
strategy.entry("long", strategy.long, when=i_reverse?SELL:BUY)
strategy.entry("short", strategy.short, when=not i_reverse?SELL:BUY)
//Exits
if i_SL
    strategy.exit("longexit", "long", stop=SL, limit=TP)
    strategy.exit("shortexit", "short", stop=SL, limit=TP)

//Plots
plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL")
plot(i_SL ? TP : na, color=color.green, style=plot.style_cross, title="TP")
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, color=color.green, title="Bullish Setup")
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, color=color.red, title="Bearish Setup")

Thêm nữa