RSI True Level Breakout chiến lược

Tác giả:ChaoZhang, Ngày: 2023-11-08 12:25:59
Tags:

img

Tổng quan

Chiến lược RSI True Level breakout kết hợp chỉ số RSI với các kênh True Level thích nghi để thực hiện giao dịch breakout. Nó tính toán các băng tần trên và dưới True Level và sử dụng các tín hiệu RSI mua quá mức / bán quá mức để tạo ra các giao dịch breakout. Trong các thị trường xu hướng, nó có thể bắt được hướng xu hướng sớm. Trong các thị trường giới hạn phạm vi, nó có thể lọc hiệu quả tiếng ồn và nắm bắt các cơ hội hướng quan trọng.

Chiến lược logic

Chiến lược đầu tiên đòi hỏi phải tự thiết lập 14 băng True Level với các thông số khác nhau. True Level được tính dựa trên giá đóng cửa, độ lệch chuẩn và hồi quy tuyến tính trong một khoảng thời gian nhất định. Dải trên là hồi quy tuyến tính + n độ lệch chuẩn. Dải dưới là hồi quy tuyến tính - n độ lệch chuẩn. Dải n có thể được điều chỉnh thông qua bảng đầu vào.

Tiếp theo, chiến lược tính toán mức cao nhất trong 14 dải là dải trên True Level, và thấp nhất là dải dưới trong mỗi giai đoạn. Kết hợp với các giá trị chỉ số RSI, nó xác định liệu RSI có đi vào khu vực mua quá mức hoặc bán quá mức không. Khi RSI bị mua quá mức hoặc giá phá vỡ dưới dải trên, nó sẽ ngắn. Khi RSI bị bán quá mức hoặc giá phá vỡ trên dải dưới, nó sẽ dài.

Cuối cùng, các dải bước vào và bước ra được thiết lập. Dải bước vào là True Level dưới cùng và dải bước ra là True Level trên cùng. Sau khi mở các vị trí, giá chạm vào dải bước ra một lần nữa sẽ đóng các giao dịch.

Tóm lại, chiến lược sử dụng cả sức mạnh xu hướng của RSI và khả năng thích nghi của các kênh True Level để xác định hiệu quả hướng xu hướng, nắm bắt các cơ hội lớn trong các thị trường giới hạn phạm vi và kiểm soát rủi ro với các dải thoát.

Ưu điểm

  1. Sử dụng các vùng True Level thích nghi. Các dải trên và dưới thay đổi năng động để thích nghi với biến động thị trường.

  2. Các tham số True Level có thể tùy chỉnh. Người dùng có thể tối ưu hóa các tham số cho các điều kiện thị trường khác nhau.

  3. Kết hợp RSI mua quá mức / bán quá mức để tránh whipsaws trong thị trường bên.

  4. Thiết kế đường ra vào hợp lý kiểm soát rủi ro.

Rủi ro

  1. Các thông số RSI cần tối ưu hóa cẩn thận. Giá trị sai có thể tạo ra tín hiệu xấu.

  2. Các thông số True Level cần thử nghiệm và tối ưu hóa.

  3. Rủi ro cao trong các thị trường hỗn loạn khi giá thường xuyên chạm vào dải thoát.

  4. Các dải True Level cần đủ thời gian để hình thành. Chiến lược có thể thất bại với dữ liệu không đầy đủ.

Các rủi ro có thể được giảm thiểu bằng cách tối ưu hóa các thông số RSI, điều chỉnh các thiết lập True Level, thêm các bộ lọc và sử dụng các lối thoát thông minh.

Hướng dẫn tối ưu hóa

  1. Tối ưu hóa các thông số RSI để tìm các cài đặt tốt nhất. Kiểm tra các khoảng thời gian RSI khác nhau.

  2. Tối ưu hóa các thông số True Level cho thị trường hiện tại.

  3. Thêm các bộ lọc khác như MACD, KD để tránh giao dịch xấu trong thị trường hỗn loạn.

  4. Kiểm tra thời gian giao dịch hoặc sản phẩm khác nhau để tìm môi trường tối ưu.

  5. Tối ưu hóa lối ra, như dừng lại sau hoặc dừng lại dựa trên ATR.

  6. Kết hợp các tham số và thử nghiệm cho sự ổn định tối đa.

  7. Sử dụng máy học và dữ liệu lớn để tối ưu hóa tự động.

Kết luận

RSI True Level Breakout Strategy kết hợp các điểm mạnh của chỉ số xu hướng và các kênh thích nghi. Nó có thể xác định hiệu quả hướng xu hướng và nắm bắt các cơ hội lớn trong các thị trường giới hạn trong phạm vi trong khi kiểm soát rủi ro bằng cách dừng lỗ. Việc tùy chỉnh tham số cao cho phép điều chỉnh nó cho các điều kiện thị trường khác nhau. Nhìn chung, bằng cách tích hợp nhiều chỉ số, nó có lợi thế trong xác định xu hướng và kiểm soát rủi ro. Với tối ưu hóa hơn nữa, nó là một chiến lược giao dịch định lượng được khuyến cáo.


/*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)


Thêm nữa