Chiến lược giao dịch đảo ngược theo dõi tín hiệu RSI

Tác giả:ChaoZhang, Ngày: 2023-09-28 10:54:24
Tags:

Tổng quan

Chiến lược này thực hiện giao dịch đảo ngược bằng cách theo dõi các tín hiệu mua quá nhiều và bán quá nhiều từ chỉ số RSI. Các tín hiệu mua được tạo ra khi RSI giảm từ mức mua quá nhiều và bán tín hiệu khi RSI tăng từ mức bán quá nhiều, nhằm mục đích nắm bắt các cơ hội đảo ngược.

Chiến lược logic

Nhận dạng tín hiệu

Chỉ số RSI xác định mức mua quá mức / bán quá mức. Mua quá mức khi RSI vượt quá ngưỡng mua quá mức, bán quá mức khi vượt dưới ngưỡng bán quá mức.

overbought = rsi > uplimit
oversold = rsi < dnlimit

Nếu RSI đã được mua quá mức thanh cuối cùng và ra khỏi thanh này, một tín hiệu muaup1Nếu RSI đã được bán quá mức thanh cuối cùng và ra khỏi bán quá mức thanh này, một tín hiệu bándn1được tạo ra.

up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false

Logic thoát

Nếu hướng thanh phù hợp với hướng vị trí và thân thanh vượt quá một nửa mức trung bình 10 giai đoạn, một tín hiệu thoát được kích hoạt.

exit = (((strategy.position_size > 0 and bar == 1) or  
         (strategy.position_size < 0 and bar == -1)) and  
        body > abody / 2)

Ưu điểm

  1. Theo dõi các tín hiệu đảo ngược RSI bị bỏ lỡ, tránh sự cần thiết phải bắt kịp thời các điểm mua quá mức / bán quá mức.

  2. Đòn bẩy thuộc tính đảo ngược của RSI để nắm bắt các điểm chuyển đổi.

  3. Kết hợp hướng thanh và kích thước vào logic thoát để tránh theo dõi thêm sau khi rút lại.

Rủi ro và giải pháp

  1. Rủi ro tín hiệu sai từ RSI

    • Giải pháp: Xác nhận tín hiệu với các chỉ báo khác để tránh tín hiệu sai
  2. Giá có thể đã bị kéo trở lại đáng kể khi theo dõi tín hiệu, tăng nguy cơ mất mát

    • Giải pháp: Giảm kích thước vị trí khi nhập hoặc tối ưu hóa thời gian nhập
  3. Nguy cơ thoát khỏi thị trường sớm trước khi hoàn toàn đảo ngược lợi nhuận

    • Giải pháp: Cải thiện logic thoát để tăng cơ hội nắm bắt lợi nhuận

Cơ hội gia tăng

  1. Tối ưu hóa các thông số như mức mua quá mức / bán quá mức, thời gian xem lại vv dựa trên các thị trường khác nhau

  2. Điều chỉnh kích thước vị trí, như giảm kích thước khi theo dõi tín hiệu

  3. Cải thiện thời gian nhập, thêm các bộ lọc ngoài tín hiệu theo dõi

  4. Nâng cao lối ra để tăng lợi nhuận, như dừng lợi nhuận

  5. Tối ưu hóa các điểm dừng để giảm tổn thất, chẳng hạn như điểm dừng kéo hoặc điểm dừng nón

Tóm lại

Chiến lược này thực hiện giao dịch đảo ngược bằng cách theo dõi các tín hiệu RSI mua quá mức / bán quá mức. Nó có lợi thế bắt tín hiệu đảo ngược nhưng cũng có rủi ro của các tín hiệu sai và thua lỗ.


/*backtest
start: 2023-09-20 00:00:00
end: 2023-09-27 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Anti RSI Strategy v1.0", shorttitle = "Anti RSI str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
rsiperiod1 = input(14, defval = 14, minval = 2, maxval = 50, title = "RSI Period")
rsilimit1 = input(25, defval = 25, minval = 1, maxval = 100, title = "RSI limit")
showarr = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//RSI
uprsi1 = rma(max(change(close), 0), rsiperiod1)
dnrsi1 = rma(-min(change(close), 0), rsiperiod1)
rsi = dnrsi1 == 0 ? 100 : uprsi1 == 0 ? 0 : 100 - (100 / (1 + uprsi1 / dnrsi1))
uplimit = 100 - rsilimit1
dnlimit = rsilimit1

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
overbought = rsi > uplimit
oversold = rsi < dnlimit

up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false
up2 = bar == -1 and strategy.position_size > 0 and overbought == false
dn2 = bar == 1 and strategy.position_size < 0 and oversold == false

norma = overbought == false and oversold == false
exit = (((strategy.position_size > 0 and bar == 1) or (strategy.position_size < 0 and bar == -1)) and body > abody / 2)

//Arrows
col = exit ? black : up1 or dn1 or up2 or dn2 ? blue : na
needup = up1 or up2
needdn = dn1 or dn2
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Thêm nữa