Chiến lược giao dịch định lượng RSI kép


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

Chiến lược giao dịch định lượng RSI kép

Tổng quan

Chiến lược này sử dụng chỉ số RSI kép để giao dịch hai chiều dài và ngắn, đồng thời kết hợp với hệ thống thống định hướng xu hướng, thuộc chiến lược định lượng RSI kép. Chiến lược đầu tiên sử dụng chỉ số RSI để xác định tín hiệu dư thừa, sau đó kết hợp với định hướng xu hướng định hướng để quyết định làm nhiều nhượng bộ, thuộc chiến lược theo dõi xu hướng điển hình.

Phân tích nguyên tắc

Chiến lược định lượng RSI kép chủ yếu sử dụng chỉ số RSI hai chu kỳ thời gian để xác định tín hiệu giao dịch. Chiến lược này trước tiên đặt hai tham số RSI, một chu kỳ dài làm phán quyết giao dịch chính, một chu kỳ ngắn làm bộ lọc phụ.

Để lọc các tín hiệu giả mạo, chiến lược cũng giới thiệu SMA và EMA trung bình để phán đoán xu hướng. Chỉ khi đường SMA ngắn hạn vượt qua đường EMA dài hạn, hãy xem xét RSI để thực hiện nhiều tín hiệu và chỉ khi đường SMA ngắn hạn vượt qua đường EMA dài hạn, hãy xem xét tín hiệu RSI để làm trống, đảm bảo tín hiệu RSI kép phù hợp với hướng xu hướng và tránh giao dịch ngược xu hướng.

Ngoài ra, chiến lược cũng thiết lập logic dừng lỗ. Sau khi mở vị trí, hai số lệnh dừng khác nhau sẽ được đặt cùng một lúc và thiết lập vị trí dừng lỗ.

Phân tích lợi thế

Chiến lược định lượng RSI kép có những lợi thế sau:

  1. Chỉ số RSI hai chu kỳ thời gian có thể xác định chính xác hơn các tín hiệu không gian. Sự kết hợp chéo của RSI chu kỳ dài và ngắn có thể lọc một số tín hiệu giả, cải thiện chất lượng tín hiệu.

  2. Hệ thống đường trung bình hỗ trợ xác định hướng của xu hướng lớn, tránh giao dịch ngược xu hướng, có thể lọc hầu hết các giao dịch ồn ào và tăng tỷ lệ thắng.

  3. Cơ chế dừng lỗ linh hoạt, có thể đạt được lợi nhuận cao hơn thông qua các thiết lập dừng khác nhau, cũng có thể dừng lỗ để kiểm soát rủi ro.

  4. Chiến lược giao dịch logic đơn giản và rõ ràng, dễ hiểu và tối ưu hóa, phù hợp với học tập của nhà giao dịch định lượng.

Phân tích rủi ro

Mặc dù chiến lược định lượng RSI đôi có một số lợi thế, nhưng cũng có những rủi ro sau:

  1. Chỉ số RSI tự nó không có hiệu quả trong việc đánh giá tình hình biến động và xu hướng đảo ngược, chiến lược có thể không hiệu quả trong giao dịch trên các thị trường này.

  2. Mặc dù hệ thống trung tuyến có thể lọc tiếng ồn trong phạm vi nhỏ, nhưng nó không có hiệu quả trong việc đánh giá sự thay đổi xu hướng trong chu kỳ trung gian và có thể bỏ lỡ điểm chuyển hướng.

  3. Cài đặt dừng lỗ không đúng có thể dẫn đến dừng lỗ quá rộng hoặc dừng lỗ quá nhỏ, làm giảm hiệu quả của chiến lược.

  4. Doanh số giảm giá lớn có thể dẫn đến tổn thất lớn, cần kiểm soát quy mô vị trí.

Đối với các rủi ro trên, bạn có thể làm giảm rủi ro bằng cách điều chỉnh các tham số RSI, giới thiệu các chỉ số xu hướng và đảo ngược tiên tiến hơn, tối ưu hóa logic dừng lỗ và kiểm soát vị trí.

Hướng tối ưu hóa

Chiến lược định lượng RSI đôi có thể được tối ưu hóa hơn nữa theo một số hướng sau:

  1. Thử các kết hợp khác nhau, tối ưu hóa các tham số chu kỳ RSI và tìm ra kết hợp tốt nhất cho các chỉ số RSI dài hoặc ngắn.

  2. Kiểm tra các chỉ số đường trung bình khác nhau, giới thiệu các chỉ số như MACD để đánh giá xu hướng và cơ hội đảo ngược.

  3. Tối ưu hóa chiến lược dừng lỗ, thiết lập theo dõi dừng lỗ hoặc di chuyển dừng lỗ, cho phép dừng lỗ linh hoạt hơn.

  4. Thêm mô-đun kiểm soát vị trí, kiểm soát nhiều vị trí nhược điểm ở các giai đoạn khác nhau của xu hướng chu kỳ lớn.

  5. Thêm mô hình học máy nâng cao độ chính xác của các mục nhập và lối ra.

  6. Các nhà đầu tư cũng có thể sử dụng các giao dịch này để tìm kiếm các loại giao dịch và chu kỳ thời gian tốt nhất.

Tóm tắt

Chiến lược định lượng RSI kép là một chiến lược theo dõi xu hướng điển hình. Nó kết hợp các chỉ số RSI kép để đánh giá tín hiệu giao dịch và hệ thống lọc tiếng ồn đồng tuyến rất cổ điển và thực tế. Mặc dù chiến lược cũng có một số không gian cải tiến, nhưng logic hoạt động tổng thể rõ ràng, dễ hiểu và tối ưu hóa. Đây là một chiến lược rất phù hợp để học tập và thực hành của người mới bắt đầu giao dịch định lượng.

Mã nguồn chiến lược
/*backtest
start: 2023-11-07 00:00:00
end: 2023-11-14 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Growth Producer", overlay=true, initial_capital = 1000, currency = "USD", pyramiding = 2, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

//Functions
Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

/// TREND
ribbon_period = input(19, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

p1 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p2 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p1, p2, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

// Relative volatility index
length = input(120,"RVI period", minval=1), src = close
len = 14
stddev = stdev(src, length)
upper = ema(change(src) <= 0 ? 0 : stddev, len)
lower = ema(change(src) > 0 ? 0 : stddev, len)
rvi = upper / (upper + lower) * 100
benchmark = input(35, "RVI benchmark", minval=10, maxval=100, step=0.1)

// Plot RVI
// h0 = hline(80, "Upper Band", color=#C0C0C0)
// h1 = hline(20, "Lower Band", color=#C0C0C0)
// fill(h0, h1, color=#996A15, title="Background")
// offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
// plot(rvi, title="RVI", color=#008000, offset = offset)


/// MFI input
mfi_source = hlc3
mfi_length = input(19, "MFI Length", minval=1)
mfi_lower = input(15, "MFI Lower level", minval=0, maxval=50)
mfi_upper = input(90, "MFI Higher level", minval=50, maxval=100)


// MFI
upper_s = sum(volume * (change(mfi_source) <= 0 ? 0 : mfi_source), mfi_length)
lower_s = sum(volume * (change(mfi_source) >= 0 ? 0 : mfi_source), mfi_length)
mf = rsi(upper_s, lower_s)
// mfp = plot(mf, color=color.new(color.gray,0), linewidth=1)
// top = hline(mfi_upper, color=color.new(color.gray, 100), linewidth=1, editable=false)
// bottom = hline(mfi_lower, color=color.new(color.gray,100), linewidth=1, editable=false)
// hline(0, color=color.new(color.black,100), editable=false)
// hline(100, color=color.new(color.black,100), editable=false)

// Breaches
// b_color = (mf > mfi_upper) ? color.new(color.red,70) : (mf < mfi_lower) ? color.new(color.green,60) : na
// bgcolor(HighlightBreaches ? b_color : na)

// fill(top, bottom, color=color.gray, transp=75)

// Initial inputs
Act_RSI_VWAP_long = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE LONG")
RSI_VWAP_length_long = input(16, "RSI-VWAP LENGTH LONG")
RSI_VWAP_overSold_long = input(13, "RSI-VWAP OVERSOLD LONG", type=input.float)
RSI_VWAP_overBought_long = input(68, "RSI-VWAP OVERBOUGHT LONG", type=input.float)

Act_RSI_VWAP_short = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE SHORT")
RSI_VWAP_length_short = input(14, "RSI-VWAP LENGTH SHORT")
RSI_VWAP_overSold_short = input(7, "RSI-VWAP OVERSOLD SHORT", type=input.float)
RSI_VWAP_overBought_short = input(68, "RSI-VWAP OVERBOUGHT SHORT", type=input.float)

// RSI with VWAP as source
RSI_VWAP_long = rsi(vwap(close), RSI_VWAP_length_long)
RSI_VWAP_short = rsi(vwap(close), RSI_VWAP_length_short)

// Plot Them Separately.
// Plotting LONG, Put overlay=false
// r=plot(RSI_VWAP_long, color = RSI_VWAP_long > RSI_VWAP_overBought_long ? color.red : RSI_VWAP_lnog < RSI_VWAP_overSold_long ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line)
// h1=plot(RSI_VWAP_overBought_long, color = color.gray, style=plot.style_stepline)
// h2=plot(RSI_VWAP_overSold_long, color = color.gray, style=plot.style_stepline)
// fill(r,h1, color = RSI_VWAP_long > RSI_VWAP_overBought_long ? color.red : na, transp = 60)
// fill(r,h2, color = RSI_VWAP_long < RSI_VWAP_overSold_long ? color.lime : na, transp = 60)

// Plotting SHORT, Put overlay=false
// r=plot(RSI_VWAP_short, color = RSI_VWAP_short > RSI_VWAP_overBought_short ? color.red : RSI_VWAP_short < RSI_VWAP_overSold_short ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line)
// h1=plot(RSI_VWAP_overBought_short, color = color.gray, style=plot.style_stepline)
// h2=plot(RSI_VWAP_overSold_short, color = color.gray, style=plot.style_stepline)
// fill(r,h1, color = RSI_VWAP_short > RSI_VWAP_overBought_short ? color.red : na, transp = 60)
// fill(r,h2, color = RSI_VWAP_short < RSI_VWAP_overSold_short ? color.lime : na, transp = 60)


///////  STRATEGY Take Profit / Stop Loss ////////
////// LONG //////

long_tp1_inp = input(3.3, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(12, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(100, title="Long Take Profit 2 Qty", step=1)

long_sl_inp = input(3.3, title='Long Stop Loss %', step=0.1)/100

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)
long_stop_level = strategy.position_avg_price * (1 - long_sl_inp)

////// SHORT //////
short_tp1_inp = input(3.2, title='Short Take Profit 1 %', step=0.1)/100
short_tp1_qty = input(20, title="Short Take Profit 1 Qty", step=1)

short_tp2_inp = input(5.5, title='Short Take Profit 2%', step=0.1)/100
short_tp2_qty = input(100, title="Short Take Profit 2 Qty", step=1)

short_sl_inp = input(3.2, title='Short Stop Loss %', step=0.1)/100

short_take_level_1 = strategy.position_avg_price * (1 - short_tp1_inp)
short_take_level_2 = strategy.position_avg_price * (1 - short_tp2_inp)
short_stop_level = strategy.position_avg_price * (1 + short_sl_inp)



///Strategy_Conditions
/// LONG ///
entry_long =(crossover(RSI_VWAP_long, RSI_VWAP_overSold_long) and leadLine2<leadLine1) or (crossunder(mf,mfi_lower) and leadLine2<leadLine1)
entry_price_long=valuewhen(entry_long,close,0)
exit_long =crossunder(RSI_VWAP_long, RSI_VWAP_overBought_long)

/// SHORT ///

entry_short =crossunder(RSI_VWAP_short, RSI_VWAP_overBought_short) and leadLine2>leadLine1 or (crossover(mf,mfi_upper) and leadLine2>leadLine1)
entry_price_short=valuewhen(entry_short,close,0)
exit_short =crossover(RSI_VWAP_short, RSI_VWAP_overSold_short)

////// BACKTEST PERIOD ///////
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() => true

if testPeriod()

    if strategy.position_size == 0 or strategy.position_size > 0 and rvi>benchmark
        strategy.entry("long", true, when = entry_long, comment="Insert Enter Long Comment")
    strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1, stop=long_stop_level)
    strategy.exit("TP2","long", qty_percent=long_tp2_qty, limit=long_take_level_2, stop=long_stop_level)
    strategy.close("long", when=exit_long, comment = "Insert Exit Long Comment")

    if strategy.position_size == 0 or strategy.position_size < 0 and rvi>benchmark
        strategy.entry("short", false, when = entry_short, comment="Insert Enter Short Comment")
    strategy.exit("TP1","short", qty_percent=short_tp1_qty, limit=short_take_level_1, stop=short_stop_level)
    strategy.exit("TP2","short", qty_percent=short_tp2_qty, limit=short_take_level_2, stop=short_stop_level)
    strategy.close("short", when=exit_short, comment = "Insert Exit Short Comment")


// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")


// SHORT POSITION
plot(strategy.position_size < 0 ? short_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Short Take Profit")
plot(strategy.position_size < 0 ? short_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Short Take Profit")
plot(strategy.position_size < 0 ? short_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")