
Chiến lược này là một hệ thống giao dịch theo dõi xu hướng dựa trên các chỉ số tương đối mạnh mẽ (RSI) tăng cường. Bằng cách tính toán phiên bản cải tiến của RSI và kết hợp với đường tín hiệu của nó, nó nắm bắt cơ hội đảo ngược xu hướng trong các chu kỳ thị trường khác nhau.
Các nguyên tắc cốt lõi của chiến lược là xác định xu hướng thị trường bằng cách tính toán RSI ((ARSI)).
Đây là một chiến lược theo dõi xu hướng có cấu trúc, logic rõ ràng. Một hệ thống giao dịch đáng tin cậy được tạo ra bằng cách sử dụng các phương pháp tính toán sáng tạo của RSI tăng cường, kết hợp với các lợi thế của nhiều chỉ số kỹ thuật. Mặc dù có một số rủi ro vốn có, nhưng với các biện pháp tối ưu hóa và quản lý rủi ro hợp lý, chiến lược này có triển vọng ứng dụng thực tế tốt.
/*backtest
start: 2024-02-19 00:00:00
end: 2025-02-16 08:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("Ultimate RSI [LuxAlgo] Strategy", shorttitle="ULT RSI Strat", overlay=false, initial_capital=10000, currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
//------------------------------------------------------------------------------
// Settings
//------------------------------------------------------------------------------
length = input.int(14, minval=2, title="RSI Length")
smoType1 = input.string("RMA", title="Method", options=["EMA", "SMA", "RMA", "TMA"])
src = input(close, title="Source")
arsiCss = input.color(color.silver, "RSI Color", inline="rsicss")
autoCss = input.bool(true, "Auto", inline="rsicss")
// Signal Line settings
smooth = input.int(14, minval=1, title="Signal Smooth", group="Signal Line")
smoType2 = input.string("EMA", title="Method", options=["EMA", "SMA", "RMA", "TMA"], group="Signal Line")
signalCss = input.color(color.new(#ff5d00, 0), "Signal Color", group="Signal Line")
// Overbought/Oversold style
obValue = input.float(80, "Overbought", inline="ob", group="OB/OS Style")
obCss = input.color(color.new(#089981, 0), "", inline="ob", group="OB/OS Style")
obAreaCss = input.color(color.new(#089981, 80), "", inline="ob", group="OB/OS Style")
osValue = input.float(20, "Oversold", inline="os", group="OB/OS Style")
osCss = input.color(color.new(#f23645, 0), "", inline="os", group="OB/OS Style")
osAreaCss = input.color(color.new(#f23645, 80), "", inline="os", group="OB/OS Style")
//------------------------------------------------------------------------------
// Function: Moving Average (selectable type)
//------------------------------------------------------------------------------
ma(x, len, maType)=>
switch maType
"EMA" => ta.ema(x, len)
"SMA" => ta.sma(x, len)
"RMA" => ta.rma(x, len)
"TMA" => ta.sma(ta.sma(x, len), len)
//------------------------------------------------------------------------------
// Augmented RSI Calculation
//------------------------------------------------------------------------------
upper = ta.highest(src, length)
lower = ta.lowest(src, length)
r = upper - lower
d = src - src[1]
diff = upper > upper[1] ? r : lower < lower[1] ? -r : d
num = ma(diff, length, smoType1)
den = ma(math.abs(diff), length, smoType1)
arsi = den != 0 ? num / den * 50 + 50 : 50 // safeguard against division by zero
signal = ma(arsi, smooth, smoType2)
//------------------------------------------------------------------------------
// Strategy Entry Conditions
//------------------------------------------------------------------------------
// Long entry: Ultimate RSI crosses above its signal when it is below 50 (lower half)
// Short entry: Ultimate RSI crosses below its signal when it is above 50 (upper half)
longCondition = ta.crossover(arsi, signal) and arsi < 50
shortCondition = ta.crossunder(arsi, signal) and arsi > 50
// Close opposite positions when conditions occur
if shortCondition
strategy.close("Long")
if longCondition
strategy.close("Short")
// Place new entries based on the conditions
if longCondition
strategy.entry("Long", strategy.long)
if shortCondition
strategy.entry("Short", strategy.short)
// //------------------------------------------------------------------------------
// // Plots and Constant Lines
// //------------------------------------------------------------------------------
// // Plot the Ultimate RSI and its Signal
// plot_rsi = plot(arsi, title="Ultimate RSI",
// color = arsi > obValue ? obCss : arsi < osValue ? osCss : autoCss ? chart.fg_color : arsiCss,
// linewidth=2)
// plot(signal, title="Signal Line", color=signalCss, linewidth=2)
// // Instead of using hline, create constant plots for OB, Midline, and OS
// plot_ob = plot(obValue, title="Overbought", color=obCss, style=plot.style_line, linewidth=1)
// plot_mid = plot(50, title="Midline", color=color.gray, style=plot.style_line, linewidth=1)
// plot_os = plot(osValue, title="Oversold", color=osCss, style=plot.style_line, linewidth=1)
// //------------------------------------------------------------------------------
// // Fill OB/OS Areas for Visual Clarity
// //------------------------------------------------------------------------------
// fill(plot_rsi, plot_ob, color=arsi > obValue ? obAreaCss : na)
// fill(plot_os, plot_rsi, color=arsi < osValue ? osAreaCss : na)