Chiến lược đột phá RSI kép

Tác giả:ChaoZhang, Ngày: 2023-12-27 14:33:15
Tags:

img

Tổng quan

Chiến lược phá vỡ RSI kép là một chiến lược giao dịch thuật toán xác định các điểm đảo ngược giá bằng cách sử dụng chỉ số RSI. Nó tạo ra các tín hiệu giao dịch bằng cách so sánh chỉ số RSI với các giá ngưỡng trên và dưới đã đặt trước để xác định xem thị trường có bị mua quá mức hay bán quá mức hay không.

Chiến lược logic

Chỉ số RSI được tính dựa trên sự thay đổi giá đóng cửa trong một khoảng thời gian nhất định, phản ánh động lực mua và bán của cổ phiếu. Khi chỉ số RSI vượt quá ngưỡng trên được đặt trước (thất định 75), nó chỉ ra rằng cổ phiếu đã bước vào vùng mua quá mức. Khi chỉ số RSI giảm xuống dưới ngưỡng dưới được đặt trước (thất định 25), nó chỉ ra rằng cổ phiếu đã bước vào vùng bán quá mức.

Các quy định về phán quyết là:

  1. Khi RSI vượt qua ngưỡng trên, hãy bán ngắn;
  2. Khi RSI vượt dưới ngưỡng thấp hơn, mua dài;
  3. Đóng vị trí khi đạt đến mức dừng lỗ hoặc lấy lợi nhuận.

Logic giao dịch của nó đơn giản và rõ ràng, với các thiết lập tham số tham chiếu hợp lý, không gian cấu hình lớn và phù hợp để nắm bắt các xu hướng lớn hơn trên thị trường.

Phân tích lợi thế

Những lợi thế của chiến lược này bao gồm:

  1. Logic đơn giản dễ hiểu và thực hiện;
  2. Các thiết lập tham số tham chiếu hợp lý có thể được cá nhân hóa;
  3. Logic giao dịch ngược có thể cấu hình có thể đáp ứng linh hoạt với điều kiện thị trường;
  4. Có thể xác định hiệu quả các điểm đảo ngược giá và nắm bắt các xu hướng chính.

Nói chung, với các thiết lập tham số tham chiếu hợp lý, thực hiện đơn giản và khả năng xác định hiệu quả sự đảo ngược giá thông qua RSI, chiến lược này phù hợp với việc nắm bắt xu hướng trung và dài hạn và dễ hiểu và sử dụng như một chiến lược định lượng.

Phân tích rủi ro

Mặc dù chiến lược này tương đối đơn giản và đáng tin cậy, chúng ta không thể bỏ qua những rủi ro tiềm ẩn mà nó phải đối mặt:

  1. Khả năng tương đối cao của các chỉ số RSI kích hoạt các tín hiệu sai. RSI không thể dự đoán hoàn hảo sự đảo ngược giá, có thể dẫn đến đánh giá sai.
  2. Khả năng dừng lỗ liên tục trong một thị trường xu hướng. RSI thấy khó phân biệt các điều chỉnh giới hạn trong phạm vi bình thường với sự đảo ngược xu hướng.
  3. RSI không thể xác định hiệu quả xu hướng dao động, dẫn đến tổn thất lớn hơn trong môi trường này.

Để kiểm soát rủi ro, chúng ta cần chú ý đến những điều sau:

  1. Điều chỉnh các thông số phù hợp để ngăn chặn tỷ lệ đánh giá sai quá mức.
  2. Xác nhận tín hiệu giao dịch với các chỉ số khác để cải thiện độ chính xác.
  3. Tăng tỷ lệ thu lợi nhuận và giảm kích thước dừng lỗ duy nhất.
  4. Tránh giao dịch trên các thị trường khác nhau.

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

Xem xét các rủi ro chính đối với chiến lược này là đánh giá sai lầm đảo ngược và thua lỗ trên các thị trường khác nhau, chúng ta có thể tối ưu hóa từ các khía cạnh sau:

  1. Các chỉ số như KDJ và MACD có thể đóng vai trò lọc để tránh đánh giá sai.
  2. Tăng ngưỡng cho số tiền dừng lỗ duy nhất.
  3. Thiết lập giới hạn tần số vị trí mở. Thêm logic hạn chế các mục nhập một lần hoặc N lần trong một khoảng thời gian nhất định để kiểm soát quá thường xuyên mở vị trí.
  4. Đặt ra các đánh giá về điều kiện thị trường. Đảm bảo chiến lược chỉ chạy trên các thị trường xu hướng, tránh các thị trường khác nhau, có thể tối ưu hóa đáng kể tỷ lệ rủi ro-lợi nhuận của chiến lược.

Kết luận

Tóm lại, chiến lược phá vỡ RSI kép là một chiến lược định lượng đơn giản và thực tế. Nó xác định sự đảo ngược giá thông qua RSI để đạt được xu hướng đơn giản. Mặc dù có một số rủi ro đánh giá sai, các tối ưu hóa như điều chỉnh tham số, lọc tín hiệu có thể giúp giảm thiểu điều này và cho phép nó đóng một vai trò quan trọng trong việc bắt các xu hướng trung hạn đến dài hạn.


/*backtest
start: 2023-12-19 00:00:00
end: 2023-12-26 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("RSI Algo", overlay=true)

// Calculate start/end date and time condition
DST = 1 //day light saving for usa
//--- Europe
London = iff(DST==0,"0000-0900","0100-1000")
//--- America
NewYork = iff(DST==0,"0400-1500","0500-1600")
//--- Pacific
Sydney = iff(DST==0,"1300-2200","1400-2300")
//--- Asia
Tokyo = iff(DST==0,"1500-2400","1600-0100")

//-- Time In Range
timeinrange(res, sess) => time(res, sess) != 0

london = timeinrange(timeframe.period, London)
newyork = timeinrange(timeframe.period, NewYork)

time_cond = true


myPeriod = input(defval=14, type=input.integer, title="Period")
myThresholdUp = input(defval=75, type=input.float, title="Upper Threshold")
myThresholdDn = input(defval=25, type=input.float, title="Lower Threshold")
myAlgoFlipToggle = input(defval=false, type=input.bool, title="Imverse Algorthim")
myLineToggle = input(defval=true, type=input.bool, title="Show Lines")
myLabelToggle = input(defval=true, type=input.bool, title="Show Labels")
myRSI=rsi(close, myPeriod)
buy = myAlgoFlipToggle ? falling(myRSI,1) and cross(myRSI, myThresholdDn) : rising(myRSI, 1) and cross(myRSI,myThresholdUp) //and time_cond
sell = myAlgoFlipToggle ? rising(myRSI, 1) and cross(myRSI,myThresholdUp) : falling(myRSI,1) and cross(myRSI, myThresholdDn) //and time_cond
myPosition = 0
myPosition := buy==1 ? 0 : sell==1 or myPosition[1]==1 ? 1 : 0
trendColor = buy ? color.red : sell ? color.green : na
plot(myLineToggle ? buy and myPosition[1]==1 ? low - 0.004: sell and myPosition[1]==0 ? high + 0.004 : na : na, color=trendColor, style=plot.style_line, linewidth=4, editable=false)
plotshape(myLabelToggle ? buy and myPosition[1]==1 ? low - 0.005 : na : na, style=shape.labelup, location=location.absolute, text="Buy", transp=0, textcolor = color.white, color=color.black, editable=false)
plotshape(myLabelToggle ? sell and myPosition[1]==0 ? high + 0.005 : na : na, style=shape.labeldown, location=location.absolute, text="Sell", transp=0, textcolor = color.white, color=color.black, editable=false)

strategy.initial_capital = 50000
    //Calculate the size of the next trade
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit          //floating profit/loss
risk = input(2,type=input.float,title="Risk %")/100           //risk % per trade
isTwoDigit = input(false,"Is this a 2 digit pair? (JPY, XAU, XPD...")


stop = input(250, title="stop loss pips")
tp = input(2500, title="take profit pips")
if(isTwoDigit)
    stop := stop/100
    
temp01 = balance * risk     //Risk in USD
temp02 = temp01/stop        //Risk in lots
temp03 = temp02*100000      //Convert to contracts
size = 1
    
strategy.entry("long",1,size,when=buy and myPosition[1]==1 )
strategy.entry("short",0,size,when=sell and myPosition[1]==0)

strategy.exit("exit_long","long",loss=stop, profit=tp)      //Long exit (stop loss)
strategy.exit("exit_short","short",loss=stop, profit=tp)      //Short exit (stop loss)

//strategy.close_all(when= not time_cond)


Thêm nữa