Chiến lược đột phá vùng thực của RSI


Ngày tạo: 2023-11-08 12:25:59 sửa đổi lần cuối: 2023-11-08 12:25:59
sao chép: 0 Số nhấp chuột: 608
1
tập trung vào
1617
Người theo dõi

Chiến lược đột phá vùng thực của RSI

Tổng quan

Chiến lược phá vỡ khu vực thực của RSI là một chiến lược định lượng để thực hiện giao dịch phá vỡ bằng cách kết hợp chỉ số RSI với vùng dao động của khu vực thực. Chiến lược này thực hiện giao dịch phá vỡ bằng cách tính toán các vùng giới hạn trên và dưới của khu vực thực và kết hợp với tín hiệu quá mua quá bán của chỉ số RSI. Trong trường hợp mạnh, nó có thể bắt đầu hướng xu hướng; trong trường hợp dao động, nó có thể lọc hiệu quả tiếng ồn và khóa cơ hội định hướng lớn hơn.

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

Chiến lược này trước tiên yêu cầu thiết lập thủ công giới hạn trên và dưới của vùng thực với 14 tham số khác nhau. Cách tính toán vùng thực dựa trên giá đóng cửa, tính toán chênh lệch chuẩn và giá trị hồi quy tuyến tính trong một khoảng thời gian nhất định, giới hạn trên là đường hồi quy tuyến tính + n lần chênh lệch chuẩn, giới hạn dưới là đường hồi quy tuyến tính - n lần chênh lệch chuẩn.

Sau đó, trong mỗi chu kỳ, chiến lược sẽ tính toán trong thời gian thực, cao nhất trong số 14 đường giới hạn là giới hạn của khu vực thực và thấp nhất là giới hạn của khu vực thực. Sau đó, kết hợp các giá trị của chỉ số RSI để xác định xem nó có nằm trong khu vực quá mua hay quá bán hay không.

Cuối cùng, chiến lược cũng đặt đường vào và đường ra. Đường vào đại diện cho vùng thấp của thực tế, đường ra đại diện cho vùng trên của thực tế. Như vậy, sau khi mở vị trí, giá chạm vào đường ra một lần nữa, nó sẽ dừng lại.

Nhìn chung, chiến lược này sử dụng lợi thế của chỉ số xu hướng RSI và tự điều chỉnh các kênh khu vực thực để có thể đánh giá hiệu quả hướng xu hướng thị trường, tìm thấy cơ hội định hướng lớn hơn trong tình huống chấn động và kiểm soát rủi ro với đường xuất phát của khu vực thực.

Lợi thế chiến lược

  1. Sử dụng khu vực thực tế thích ứng. Giới hạn trên và dưới của khu vực có thể thay đổi trong thời gian thực, thích ứng với biến động của thị trường.

  2. Các tham số của vùng thực có thể được điều chỉnh. Người dùng có thể chọn các tổ hợp tham số khác nhau để phù hợp với các môi trường thị trường khác nhau.

  3. Kết hợp với chỉ số RSI để xác định hiện tượng quá mua quá bán và tránh bị lạc hướng trong tình huống xung đột.

  4. Đường vào và lối ra được thiết lập hợp lý, có thể kiểm soát rủi ro.

Rủi ro chiến lược

  1. Cài đặt tham số của chỉ số RSI cần thận trọng. Chu kỳ RSI quá ngắn có thể tạo ra tín hiệu sai lệch, quá dài không thể bắt kịp chuyển đổi.

  2. Cài đặt tham số vùng thực cần được tối ưu hóa thử nghiệm. Các tham số quá lớn hoặc quá nhỏ sẽ ảnh hưởng đến hiệu suất của chiến lược.

  3. Rủi ro bị mất mát cao hơn trong trường hợp động đất mạnh. Giá có thể liên tục chạm vào đường xuất phát trong khu vực thực và gây thiệt hại quá mức.

  4. Các khu vực thực tế cần được hình thành theo chu kỳ. Chiến lược này có thể không hoạt động tốt trong trường hợp thiếu dữ liệu.

Có thể giảm nguy cơ giao dịch sai bằng cách tối ưu hóa tham số RSI, điều chỉnh tham số vùng thực và kết hợp với các chỉ số khác để xác nhận thời gian vào thị trường. Ngoài ra, có thể mở rộng đường ra để giảm nguy cơ dừng lỗ. Nói chung, cần phải điều chỉnh thích hợp cho các môi trường thị trường khác nhau.

Hướng tối ưu hóa chiến lược

  1. Tối ưu hóa các thiết lập tham số RSI, tìm kiếm sự kết hợp tham số tốt nhất. Bạn có thể thử nghiệm các tham số chu kỳ RSI khác nhau.

  2. Tối ưu hóa các tham số của vùng thực để tìm các thiết lập tham số phù hợp nhất với môi trường thị trường hiện tại.

  3. Thêm các bộ lọc cho các chỉ số khác, chẳng hạn như MACD, KD, v.v., để tránh giao dịch sai trong tình huống chấn động.

  4. Thiết lập thời gian giao dịch khác nhau hoặc các loại khác nhau để phù hợp với môi trường giao dịch cụ thể mà chiến lược áp dụng.

  5. Tối ưu hóa các chiến lược dừng lỗ, chẳng hạn như chọn dừng dao động hoặc đặt mức dừng lỗ theo ATR.

  6. Thực hiện thử nghiệm kết hợp các tham số để tìm các thiết lập tham số có lợi nhuận ổn định nhất cho chiến lược.

  7. Thêm các thuật toán học máy để sử dụng dữ liệu lớn để tự động tối ưu hóa tham số.

Tóm tắt

Chiến lược phá vỡ khu vực thực của RSI sử dụng các lợi thế của các chỉ số xu hướng và kỹ thuật tự thích ứng. Nó có thể xác định hiệu quả hướng xu hướng thị trường, nắm bắt cơ hội định hướng lớn hơn trong tình huống biến động. Đồng thời thiết lập đường dừng để kiểm soát rủi ro.

Mã nguồn chiến lược
/*backtest
start: 2022-11-01 00:00:00
end: 2023-11-07 00:00:00
period: 1d
basePeriod: 1h
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/
// © Julien_Eche

//@version=4
strategy("RSI TrueLevel Strategy", shorttitle="RSI TL", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// Input parameters for RSI
rsiPeriod = input(14, title="RSI Period", type=input.integer)
rsiOverbought = input(65, title="RSI Overbought Level", type=input.integer)
rsiOversold = input(40, title="RSI Oversold Level", type=input.integer)

// Inputs for selecting bands
entry_band = input(12, title="Entry TrueLevel Band", type=input.integer, minval=1, maxval=14)
exit_band = input(12, title="Exit TrueLevel Band", type=input.integer, minval=1, maxval=14)

// Input for long and short mode
long_and_short = input(false, title="Enable Long and Short", type=input.bool)

// Calculate the RSI
rsi = rsi(close, rsiPeriod)

// User inputs
len1 = input(title="Length 1", type=input.integer, defval=126)
len2 = input(title="Length 2", type=input.integer, defval=189)
len3 = input(title="Length 3", type=input.integer, defval=252)
len4 = input(title="Length 4", type=input.integer, defval=378)
len5 = input(title="Length 5", type=input.integer, defval=504)
len6 = input(title="Length 6", type=input.integer, defval=630)
len7 = input(title="Length 7", type=input.integer, defval=756)
len8 = input(title="Length 8", type=input.integer, defval=1008)
len9 = input(title="Length 9", type=input.integer, defval=1260)
len10 = input(title="Length 10", type=input.integer, defval=1638)
len11 = input(title="Length 11", type=input.integer, defval=2016)
len12 = input(title="Length 12", type=input.integer, defval=2646)
len13 = input(title="Length 13", type=input.integer, defval=3276)
len14 = input(title="Length 14", type=input.integer, defval=4284)

fill_color = input(title="Fill Color", type=input.color, defval=color.rgb(0, 191, 255, 95))
mult = input(title="Multiple", type=input.float, defval=1, step=0.2, options=[0.6, 0.8, 1, 1.2, 1.4])
src = input(title="Source", type=input.source, defval=close)

// Upper band calculation function
upperBand(length) =>
    linreg = linreg(src, length, 0)
    stddev = mult * stdev(src, length)
    upperband = linreg + stddev
    upperband

// Lower band calculation function
lowerBand(length) =>
    linreg = linreg(src, length, 0)
    stddev = mult * stdev(src, length)
    lowerband = linreg - stddev
    lowerband

// Calculate upper and lower bands for each length
upperband_1 = upperBand(len1)
upperband_2 = upperBand(len2)
upperband_3 = upperBand(len3)
upperband_4 = upperBand(len4)
upperband_5 = upperBand(len5)
upperband_6 = upperBand(len6)
upperband_7 = upperBand(len7)
upperband_8 = upperBand(len8)
upperband_9 = upperBand(len9)
upperband_10 = upperBand(len10)
upperband_11 = upperBand(len11)
upperband_12 = upperBand(len12)
upperband_13 = upperBand(len13)
upperband_14 = upperBand(len14)

lowerband_1 = lowerBand(len1)
lowerband_2 = lowerBand(len2)
lowerband_3 = lowerBand(len3)
lowerband_4 = lowerBand(len4)
lowerband_5 = lowerBand(len5)
lowerband_6 = lowerBand(len6)
lowerband_7 = lowerBand(len7)
lowerband_8 = lowerBand(len8)
lowerband_9 = lowerBand(len9)
lowerband_10 = lowerBand(len10)
lowerband_11 = lowerBand(len11)
lowerband_12 = lowerBand(len12)
lowerband_13 = lowerBand(len13)
lowerband_14 = lowerBand(len14)

// Plot envelope bands for each length
upperband_1_plot = plot(upperband_1, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 1")
lowerband_1_plot = plot(lowerband_1, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 1")

upperband_2_plot = plot(upperband_2, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 2")
lowerband_2_plot = plot(lowerband_2, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 2")

upperband_3_plot = plot(upperband_3, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 3")
lowerband_3_plot = plot(lowerband_3, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 3")

upperband_4_plot = plot(upperband_4, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 4")
lowerband_4_plot = plot(lowerband_4, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 4")

upperband_5_plot = plot(upperband_5, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 5")
lowerband_5_plot = plot(lowerband_5, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 5")

upperband_6_plot = plot(upperband_6, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 6")
lowerband_6_plot = plot(lowerband_6, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 6")

upperband_7_plot = plot(upperband_7, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 7")
lowerband_7_plot = plot(lowerband_7, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 7")

upperband_8_plot = plot(upperband_8, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 8")
lowerband_8_plot = plot(lowerband_8, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 8")

upperband_9_plot = plot(upperband_9, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 9")
lowerband_9_plot = plot(lowerband_9, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 9")

upperband_10_plot = plot(upperband_10, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 10")
lowerband_10_plot = plot(lowerband_10, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 10")

upperband_11_plot = plot(upperband_11, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 11")
lowerband_11_plot = plot(lowerband_11, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 11")

upperband_12_plot = plot(upperband_12, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 12")
lowerband_12_plot = plot(lowerband_12, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Lower Band 12")

upperband_13_plot = plot(upperband_13, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 13")
lowerband_13_plot = plot(lowerband_13, color=color.rgb(14, 139, 212, 95), linewidth=1, title="Lower Band 13")

upperband_14_plot = plot(upperband_14, color=color.rgb(14, 116, 212, 95), linewidth=1, title="Upper Band 14")
lowerband_14_plot = plot(lowerband_14, color=color.rgb(14, 139, 212, 95), linewidth=1, title="Lower Band 14")


// Plot fills for each length
fill(upperband_1_plot, lowerband_1_plot, color=fill_color, title="Fill 1")
fill(upperband_2_plot, lowerband_2_plot, color=fill_color, title="Fill 2")
fill(upperband_3_plot, lowerband_3_plot, color=fill_color, title="Fill 3")
fill(upperband_4_plot, lowerband_4_plot, color=fill_color, title="Fill 4")
fill(upperband_5_plot, lowerband_5_plot, color=fill_color, title="Fill 5")
fill(upperband_6_plot, lowerband_6_plot, color=fill_color, title="Fill 6")
fill(upperband_7_plot, lowerband_7_plot, color=fill_color, title="Fill 7")
fill(upperband_8_plot, lowerband_8_plot, color=fill_color, title="Fill 8")
fill(upperband_9_plot, lowerband_9_plot, color=fill_color, title="Fill 9")
fill(upperband_10_plot, lowerband_10_plot, color=fill_color, title="Fill 10")
fill(upperband_11_plot, lowerband_11_plot, color=fill_color, title="Fill 11")
fill(upperband_12_plot, lowerband_12_plot, color=fill_color, title="Fill 12")
fill(upperband_13_plot, lowerband_13_plot, color=fill_color, title="Fill 13")
fill(upperband_14_plot, lowerband_14_plot, color=fill_color, title="Fill 14")

// Add variables to store the highest upper band and lowest lower band values
var float highestUpperBand = na
var float lowestLowerBand = na

// Calculate the trueLevelUpperBand and trueLevelLowerBand
trueLevelUpperBand = max(upperband_1, max(upperband_2, max(upperband_3, max(upperband_4, max(upperband_5, max(upperband_6, max(upperband_7, max(upperband_8, max(upperband_9, max(upperband_10, max(upperband_11, max(upperband_12, max(upperband_13, upperband_14)))))))))))))
trueLevelLowerBand = min(lowerband_1, min(lowerband_2, min(lowerband_3, min(lowerband_4, min(lowerband_5, min(lowerband_6, min(lowerband_7, min(lowerband_8, min(lowerband_9, min(lowerband_10, min(lowerband_11, min(lowerband_12, min(lowerband_13, lowerband_14)))))))))))))

// Update the highest upper band and lowest lower band
highestUpperBand := highest(trueLevelUpperBand, 1)
lowestLowerBand := lowest(trueLevelLowerBand, 1)

// Store the upper and lower bands in an array for easy access
upperbands = array.new_float(14)
lowerbands = array.new_float(14)

array.set(upperbands, 0, upperband_1)
array.set(upperbands, 1, upperband_2)
array.set(upperbands, 2, upperband_3)
array.set(upperbands, 3, upperband_4)
array.set(upperbands, 4, upperband_5)
array.set(upperbands, 5, upperband_6)
array.set(upperbands, 6, upperband_7)
array.set(upperbands, 7, upperband_8)
array.set(upperbands, 8, upperband_9)
array.set(upperbands, 9, upperband_10)
array.set(upperbands, 10, upperband_11)
array.set(upperbands, 11, upperband_12)
array.set(upperbands, 12, upperband_13)
array.set(upperbands, 13, upperband_14)

array.set(lowerbands, 0, lowerband_1)
array.set(lowerbands, 1, lowerband_2)
array.set(lowerbands, 2, lowerband_3)
array.set(lowerbands, 3, lowerband_4)
array.set(lowerbands, 4, lowerband_5)
array.set(lowerbands, 5, lowerband_6)
array.set(lowerbands, 6, lowerband_7)
array.set(lowerbands, 7, lowerband_8)
array.set(lowerbands, 8, lowerband_9)
array.set(lowerbands, 9, lowerband_10)
array.set(lowerbands, 10, lowerband_11)
array.set(lowerbands, 11, lowerband_12)
array.set(lowerbands, 12, lowerband_13)
array.set(lowerbands, 13, lowerband_14)

// Get the selected bands for entry and exit
selected_entry_lowerband = array.get(lowerbands, entry_band - 1)
selected_exit_upperband = array.get(upperbands, exit_band - 1)


// Entry conditions
longCondition = crossover(rsi, rsiOversold) or crossover(close, selected_entry_lowerband)
shortCondition = crossunder(rsi, rsiOverbought) or crossunder(close, selected_exit_upperband)

if (longCondition)
    strategy.entry("Long", strategy.long)

if (long_and_short and shortCondition)
    strategy.entry("Short", strategy.short)

// Exit conditions
exitLongCondition = crossunder(rsi, rsiOverbought) or crossunder(close, selected_exit_upperband)
exitShortCondition = crossover(rsi, rsiOversold) or crossover(close, selected_entry_lowerband)

strategy.close("Long", when=exitLongCondition)
strategy.close("Short", when=long_and_short and exitShortCondition)