Đâ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.
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
ADX lọc ra các thị trường giới hạn phạm vi để tránh whipsaws
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
Đơ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
Nhiều chỗ cho tối ưu hóa và tinh chỉnh tham số
Chỉ số RSI mua quá mức / bán quá mức có thể có giảm và đảo ngược
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
Đặt stop loss không đúng có thể dẫn đến lỗ
Nguy cơ tối ưu hóa quá mức do sự đơn giản
Tối ưu hóa tham số cần thiết cho hiệu suất tốt hơn
Tối ưu hóa các thông số RSI và mức mua quá mức / bán quá mức
Kiểm tra các khoảng thời gian ADX khác nhau để tìm thiết lập tối ưu
Kiểm tra các phương pháp lấy lợi nhuận / dừng lỗ khác nhau
Thêm bộ lọc xu hướng để tránh giao dịch ngược xu hướng
Kết hợp với các chỉ số khác để tăng hiệu suất
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")