Chiến lược ADX + RSI


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

Tổng quan

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

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

  1. Sử dụng RSI 7 chu kỳ để đánh giá quá mua quá bán
  • RSI dưới 30 được coi là bán quá mức
  • RSI cao hơn 70 được coi là quá mua
  1. Sử dụng ADX để đánh giá xu hướng
  • ADX cao hơn 30 cho thấy xu hướng rõ ràng
  • ADX thấp hơn 30 cho thấy xu hướng không rõ ràng
  1. Quy tắc nhập cảnh
  • Làm nhiều hơn khi RSI thấp hơn 30 và ADX cao hơn 30
  • Hạn chế khi RSI trên 70 và ADX trên 30
  1. Stop Loss
  • Có tùy chọn dừng lỗ, có thể chọn dừng lỗ đóng cửa hoặc dừng lỗ rung
  • Hạn chế lỗ hổng là tiêu chuẩn của giá đóng cửa
  • Phương pháp dừng lỗ dao động được tiêu chuẩn hóa bằng các điểm cao nhất hoặc thấp nhất của biến động giá gần đây

Phân tích lợi thế

  1. Chỉ số RSI có thể đánh giá hiệu quả các điểm quá mua và quá bán, giảm bớt bẫy mua và bẫy bán

  2. Chỉ số ADX có thể lọc ra các tình huống không rõ ràng về xu hướng, tránh bị giam giữ trong các biến động

  3. Lựa chọn Stop Loss để kiểm soát rủi ro tốt hơn

  4. Các chiến lược đơn giản, dễ hiểu và phù hợp với người mới học

  5. Các tham số chiến lược có thể được tối ưu hóa bằng cách điều chỉnh các tham số như chu kỳ RSI, khoảng quá mua quá bán, chu kỳ làm mỏng ADX

Phân tích rủi ro

  1. RSI có nguy cơ đảo ngược, có thể có tín hiệu mua quá mức và bán quá mức

  2. ADX cho rằng xu hướng đang bị tụt hậu và có thể đã bỏ lỡ một bước ngoặt

  3. Đặt điểm dừng lỗ không hợp lý có thể dẫn đến tổn thất

  4. Chiến lược đơn giản, có nguy cơ tối ưu hóa quá mức

  5. Cần tối ưu hóa tham số để đạt được hiệu quả tốt hơn

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

  1. Bạn có thể tối ưu hóa các tham số của RSI, điều chỉnh khoảng cách mua bán quá mức và tìm ra sự kết hợp tham số tốt nhất

  2. Có thể thử nghiệm ADX của các chu kỳ khác nhau để tìm các tham số tốt nhất để xác định xu hướng

  3. Có thể thử nghiệm các phương thức dừng lỗ khác nhau để tìm các thiết lập phù hợp nhất với chiến lược

  4. Có thể thêm các chỉ số lọc xu hướng để tránh giao dịch ngược

  5. Có thể kết hợp với các chỉ số khác để làm cho chiến lược có lợi thế hơn

Tóm tắt

Chiến lược này kết hợp các lợi thế của hai chỉ số cổ điển RSI và ADX, có thể phát hiện xu hướng hiệu quả và tránh các cú sốc, là một chiến lược theo dõi xu hướng đơn giản và thực tế. Có nhiều không gian để tối ưu hóa chiến lược và có thể đạt được hiệu quả tốt hơn bằng cách điều chỉnh các bộ tham số. Nhìn chung, chiến lược này phù hợp với chiến lược nhập học cho người mới học giao dịch thuật toán và có thể được tích hợp thành mô-đun vào các hệ thống chiến lược phức tạp hơn.

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