Chỉ số RSI Chiến lược kép

Tác giả:ChaoZhang, Ngày: 2023-09-19 19:43:19
Tags:

Tổng quan

Chiến lược này sử dụng chỉ số chỉ số sức mạnh tương đối (RSI) để xác định mức mua quá mức và bán quá mức cho ngắn và dài. Đây là một chiến lược giao dịch đảo ngược RSI điển hình. Chiến lược cũng kết hợp tối ưu hóa tham số, dừng lỗ vv để thích nghi với các điều kiện thị trường khác nhau.

Chiến lược logic

Logic cốt lõi bao gồm:

  1. Tính toán giá trị RSI
  2. Đặt giới hạn trên và dưới của RSI
  3. Đi ngắn khi RSI vượt quá giới hạn trên
  4. Đi dài khi RSI vượt dưới giới hạn dưới
  5. Đặt mức lợi nhuận và mức dừng lỗ
  6. Đi ra khỏi các vị trí khi RSI đảo ngược hoặc lấy lợi nhuận / dừng lỗ

Chỉ số RSI cho thấy quá mua trên 70 và quá bán dưới 30 điều kiện thị trường. Chiến lược sử dụng logic cổ điển này để xác định các mục dài / ngắn dựa trên giá trị RSI so với giới hạn đã đặt trước. Các tham số có thể tùy chỉnh cũng cho phép tối ưu hóa giới hạn, dừng lỗ v.v.v. để thích nghi với thị trường.

Ưu điểm

  • RSI xác định hiệu quả tình trạng thị trường mua quá mức / bán quá mức
  • RSI có cơ sở lý thuyết vững chắc
  • Các tham số có thể tùy chỉnh thích nghi với các công cụ và điều kiện khác nhau
  • Tiêu chí rủi ro

Rủi ro và giảm thiểu

  • Khả năng tín hiệu RSI sai dẫn đến lỗ
  • Yêu cầu tối ưu hóa liên tục các mức RSI
  • Các điểm dừng có thể được nhấn thường xuyên trong khi hành động giá hỗn loạn

Hạn chế:

  1. Các yếu tố bổ sung để xác nhận tín hiệu và tránh những tín hiệu sai
  2. Tối ưu hóa mức RSI dựa trên các đặc điểm của thiết bị
  3. Điều chỉnh vị trí dừng lỗ để giảm rủi ro whipsaw

Cơ hội gia tăng

Chiến lược có thể được tăng cường thông qua:

  1. Học máy để tối ưu hóa mức RSI tự động

  2. Xác nhận khối lượng để tránh sự đột phá sai

  3. Các yếu tố bổ sung như trung bình động cho xác nhận đa yếu tố

  4. Đánh giá về giá trị giá trị

  5. Phân tích khối lượng để đo lường dòng chảy/dòng chảy của quỹ

  6. Kết hợp với các chiến lược không tương quan để giảm thu hút danh mục đầu tư

Kết luận

Đây là một chiến lược đảo ngược trung bình đơn giản và thực tế sử dụng chỉ số RSI để phát hiện quá mua / quá bán. Các tham số có thể tùy chỉnh cho phép thích nghi với thị trường thay đổi. Các cải tiến như dừng thích nghi, xác nhận đa yếu tố và tối ưu hóa tham số có thể làm cho chiến lược mạnh mẽ hơn.


/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("4All V3", shorttitle="Strategy", overlay=true)

/////////////// Component Code Start ///////////////
testStartYear = input(2011, "Backtest Start Year") 
testStartMonth = input(8, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(9, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
// testStopDay = testStartDay + 1
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/////////////// Component Code Stop ///////////////

src = close
len = input(4, minval=1, title="Length")

up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

rsin = input(5)
sn = 100 - rsin
ln = 0 + rsin

/////////////// STRATEGY ///////////////
ts = input(99999, "Trailing Stop") / 10000
tp = input(15, "Take Profit") / 10000
sl = input(23, "Stop Loss") / 10000

pyr = input(1, "Pyramiding")

short = crossover(rsi, sn)
long = crossunder(rsi, ln)

totalLongs = 0
totalLongs := nz(totalLongs[1])
totalShorts = 0
totalShorts := nz(totalShorts[1])

totalLongsPrice = 0
totalLongsPrice := nz(totalLongsPrice[1])
totalShortsPrice = 0
totalShortsPrice := nz(totalShortsPrice[1])

sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])

if long
    sectionLongs := sectionLongs + 1
    sectionShorts := 0

if short
    sectionLongs := 0
    sectionShorts := sectionShorts + 1

longCondition = long and sectionLongs >= pyr
shortCondition = short and sectionShorts >= pyr

last_long = na
last_short = na
last_long := longCondition ? time : nz(last_long[1])
last_short := shortCondition ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = na
last_open_short_signal = na
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = na
last_short_signal = na
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = na
last_low = na
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal

long_tp = high >= (last_open_long_signal + tp)
short_tp = low <= (last_open_short_signal - tp)

long_sl = low <= (last_open_long_signal - sl)
short_sl = high >= (last_open_short_signal + sl)

leverage = input(1, "Leverage")
long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal
short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal
long_call_signal = low <= long_call
short_call_signal = high >= short_call

if testPeriod()
    strategy.entry("Long", strategy.long, when=longCondition)
    strategy.entry("Short", strategy.short, when=shortCondition)
    
    strategy.close("Long", when=long_call_signal)
    strategy.close("Short", when=short_call_signal)
    strategy.close("Long", when=long_tp)
    strategy.close("Short", when=short_tp)
    strategy.close("Long", when=long_sl)
    strategy.close("Short", when=short_sl)
    strategy.close("Long", when=long_ts)
    strategy.close("Short", when=short_ts)

Thêm nữa