Chiến lược giao dịch theo dõi tín hiệu bị bỏ lỡ dựa trên RSI ngược


Ngày tạo: 2023-09-28 10:54:24 sửa đổi lần cuối: 2023-09-28 10:54:24
sao chép: 1 Số nhấp chuột: 693
1
tập trung vào
1617
Người theo dõi

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 bán vượt quá RSI bị bỏ lỡ. Khi chỉ số RSI quay trở lại từ vùng mua bán vượt quá, nó tạo ra tín hiệu theo dõi nhiều và khi nó bật trở lại từ vùng bán tháo, nó tạo ra tín hiệu theo dõi trống để nắm bắt cơ hội đảo ngược.

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

Tín hiệu xác định

Chỉ số RSI được sử dụng để đánh giá quá mua quá bán. Khi RSI vượt qua đường mua quá mức được thiết lập, nó là tín hiệu mua quá mức và khi vượt qua đường bán quá mức, nó là tín hiệu bán quá mức.

overbought = rsi > uplimit 
oversold = rsi < dnlimit

Nếu một chỉ số RSI K-line trước đó ở trạng thái quá mua, chỉ số RSI K-line hiện tại sẽ thoát khỏi trạng thái quá mua, tạo ra tín hiệu đa theo dõiup1; Nếu một chỉ số RSI đường K trước đó đang bán quá mức, thì chỉ số RSI đường K hiện tại sẽ thoát khỏi tình trạng bán quá mức, tạo ra tín hiệu dừng theo dõidn1

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 

Tránh ra khỏi phán quyết

Một tín hiệu thoát được tạo ra khi hướng giữ vị trí phù hợp với hướng của thực thể K-line và thực thể đã phá vỡ một nửa giá trị trung bình 10 chu kỳ của nó.

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

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

  1. Theo dõi các tín hiệu đảo ngược mà chỉ số RSI đã bỏ lỡ để tránh khó khăn khi bắt kịp các điểm mua quá mức.

  2. Sử dụng tính chất đảo ngược của chỉ số RSI để nắm bắt cơ hội đảo ngược.

  3. Xác định kết hợp với chiều hướng và kích thước của thực thể đường K để tránh tiếp tục theo dõi sau khi phản xạ.

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

  1. RSI có nguy cơ phát ra tín hiệu sai

    • Giải pháp: Xác định kết hợp với các chỉ số khác để tránh sai lầm.
  2. Theo dõi tín hiệu, giá có thể đã có một sự điều chỉnh, rủi ro mất mát lớn

    • Giải pháp: Giảm vị trí đầu vào hoặc tối ưu hóa thời gian đầu vào.
  3. Một số đợt hồi phục không mang lại lợi nhuận và có nguy cơ đưa ra tín hiệu rút lui

    • Giải pháp: Tối ưu hóa logic quyết định rút lui, tăng cơ hội lợi nhuận của các vị trí.

Tối ưu hóa tư duy

  1. Cài đặt các tham số tối ưu hóa, chẳng hạn như đường mua quá mức, chu kỳ xem lại, để điều chỉnh cho các thị trường khác nhau.

  2. Điều chỉnh cách quản lý vị trí, chẳng hạn như giảm vị trí khi theo dõi tín hiệu.

  3. Tối ưu hóa thời gian nhập cảnh, thêm các điều kiện khác dựa trên tín hiệu theo dõi.

  4. Tối ưu hóa các phương thức rút tiền để tăng tỷ lệ lợi nhuận, chẳng hạn như giới thiệu các phương thức dừng di động.

  5. Tối ưu hóa phương thức dừng lỗ, giảm rủi ro thua lỗ, chẳng hạn như giới thiệu dừng di chuyển, dừng hình cầu.

Tóm tắt

Chiến lược này có lợi thế trong việc theo dõi tín hiệu đảo ngược, nhưng cũng có một số rủi ro tín hiệu giả và rủi ro thua lỗ. Bằng cách tối ưu hóa liên tục, bạn có thể tăng thêm sự ổn định và lợi nhuận của chiến lược.

Mã nguồn chiến lược
/*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()