Đâ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.
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
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
Lựa chọn Stop Loss để kiểm soát rủi ro tốt hơn
Các chiến lược đơn giản, dễ hiểu và phù hợp với người mới học
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
RSI có nguy cơ đảo ngược, có thể có tín hiệu mua quá mức và bán quá mức
ADX cho rằng xu hướng đang bị tụt hậu và có thể đã bỏ lỡ một bước ngoặt
Đặt điểm dừng lỗ không hợp lý có thể dẫn đến tổn thất
Chiến lược đơn giản, có nguy cơ tối ưu hóa quá mức
Cần tối ưu hóa tham số để đạt được hiệu quả tốt hơn
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
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
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
Có thể thêm các chỉ số lọc xu hướng để tránh giao dịch ngược
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
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.
/*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")