Xu hướng RSI theo chiến lược với Trailing Stop Loss

Tác giả:ChaoZhang, Ngày: 2024-01-31 15:13:18
Tags:

img

Tổng quan

Đây là một chiến lược giao dịch định lượng sử dụng chỉ số RSI để xác định xu hướng thị trường và thiết lập dừng lỗ và lấy lợi nhuận để khóa lợi nhuận và giảm thiểu rủi ro.

Chiến lược logic

Chiến lược này chủ yếu sử dụng chỉ số RSI để xác định hướng xu hướng thị trường cho các giao dịch dài hoặc ngắn. Khi đường RSI vượt qua trên đường dưới, nó được xác định là xu hướng tăng và đi dài. Khi đường RSI vượt qua dưới đường trên, nó được đánh giá là xu hướng giảm và đi ngắn.

Đồng thời, chiến lược theo dõi giá nhập của mỗi lệnh và thiết lập một lệnh dừng lỗ và lấy lợi nhuận nổi. Đối với các lệnh dài, một tỷ lệ phần trăm nhất định của giá nhập được thiết lập là đường dừng lỗ, và cho các lệnh ngắn, một tỷ lệ phần trăm nhất định của giá nhập được thiết lập là đường lấy lợi nhuận. Khi giá đạt đến đường dừng lỗ hoặc lấy lợi nhuận, vị trí sẽ được đóng tự động.

Ưu điểm

  • Sử dụng chỉ số RSI để xác định xu hướng thị trường, tránh giao dịch trên các thị trường giới hạn phạm vi;
  • Thiết lập lệnh dừng lỗ thay đổi và lấy lợi nhuận để khóa lợi nhuận một cách linh hoạt và kiểm soát rủi ro một cách hiệu quả;
  • Các thông số RSI và tỷ lệ dừng lỗ / lấy lợi nhuận có thể điều chỉnh để tối ưu hóa.

Rủi ro

  • Chỉ số RSI có một số chậm lại, có thể bỏ lỡ các điểm đảo ngược xu hướng ngắn hạn;
  • Dừng lỗ và lấy lợi nhuận đường quá gần có thể bị tấn công dễ dàng.

Tối ưu hóa

  • Kiểm tra các chỉ số RSI với các khoảng thời gian khác nhau;
  • Kiểm tra các kết hợp tham số khác nhau để tìm tỷ lệ dừng lỗ / lấy lợi nhuận tối ưu;
  • Thêm các chỉ số bổ sung để lọc tín hiệu.

Kết luận

Tóm lại, đây là một chiến lược giao dịch định lượng sử dụng chỉ số RSI để theo dõi xu hướng và kết hợp dừng lỗ và lấy lợi nhuận nổi. So với các chiến lược chỉ số duy nhất, chiến lược này quản lý rủi ro khá tốt bằng cách khóa lợi nhuận một cách linh hoạt.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// ©chewyScripts.

//@version=5
strategy("96er RSI+200EMA Strategy + Alerts", overlay=true, shorttitle = "The old 96er - RSI5 + 200 EMA")
//,use_bar_magnifier=false 
// This works best on a small account $100, with 50% of equity and up to 10 max open trades. 
// 96% Profitable, turns $100 into $350 in 1 month. very few losses. super happy with it.
// So far it triples the account on a 1m chart in 1 month back testing on the SEI-USD pair.
// I did not test on FX pairs or other instruments.
// had some issues with the inputs not working so had to hard code some, also the lastClose var sometimes breaks and starts following every candle, not sure why.

in_r1 = input.int(8,"5 day input or RSI1", group = "Signals")
in_lowerRSI = input.int(28,"RSI Lower", group = "Signals")
in_upperRSI = input.int(72,"RSI Upper ", group = "Signals")
in_emaperiod = input.int(200,"EMA Period", group = "Signals")
in_daysback = input.int(1,"Look back days for close/open", group = "Signals")

in_openOrders = input.int(5,"max open orders",tooltip = "Be careful, to high and you will get margin called!! 5 is probably the highest you should go", group = "Order Controls")
in_buybreakout = input.int(40,"Buy breakout range", group = "Order Controls")

in_buyTP = input.float(1.1500,"Buy TP: 1+TP %, .05 seems to work well.", group = "TPSL")
in_sellTP = input.float(0.9750, "Sell TP: 1-TP%. .025 seems to work well. ", group = "TPSL")

in_useAlerts = input.bool(false,"Turns on Buy/Sell Alerts",group = "Alerts")
in_useCustomAlertMSG = input.bool(false,"Use default Buy/Sell or the messages below",group = "Alerts")
in_alertBuySignalTxt = input("Buy","Buy signal API/TXT message template", tooltip = "Review the UserGuid on JSON varibles in alerts", group = "Alerts")
in_alertSellSignalTxt = input("Sell","Sell signal API/TXT message template", tooltip = "Review the UserGuid on JSON varibles in alerts", group = "Alerts")

simple int rsi5 = in_r1

// 3 rsi strategy , when all of them are overbought we sell, and vice versa
rsi7 = ta.rsi(close,rsi5)
[lastOpen, lastClose] = request.security(syminfo.tickerid, "D", [open,close], lookahead = barmerge.lookahead_on)
rsi3 = ta.rsi(close[5],rsi5)

ma = ta.ema(close,in_emaperiod)

plot(rsi7,"5 Day RSI",color.red)
plot(lastClose,"Previous Days Close",color.green)
plot(lastOpen,"Previous Days Open",color.white)
plot(rsi3,"Previous 5th candles RSI",color.purple)
plot(ma,"200 EMA",color.blue)


//sell = ta.crossunder(rsi7,70) and ta.crossunder(rsi14,70) and ta.crossunder(rsi21,70)
//buy = ta.crossover(rsi7,in_lowerRSI) and close < ma and rsi3 <= in_upperRSI and strategy.opentrades < in_openOrders
//sell = ta.crossunder(rsi7,in_upperRSI) and close > ma and rsi3 >= in_lowerRSI3 and strategy.opentrades < in_openOrders

//buy condition
buy = ta.crossover(rsi7,in_lowerRSI) and close < ma and close < lastClose and strategy.opentrades < in_openOrders

// sell condition
sell = ta.crossunder(rsi7,in_upperRSI) and close > ma and close > lastClose and strategy.opentrades < in_openOrders


var lastBuy = close 
var lastSell = close 
//var buyLabel = label.new(na,na,yloc = yloc.belowbar, style = label.style_none, textcolor = color.green, size = size.normal)
//var sellLabel = label.new(na,na,yloc = yloc.abovebar, style = label.style_none, textcolor = color.red, size = size.normal)
if (buy)
    strategy.entry("BUY", strategy.long,alert_message = "Buy @"+str.tostring(close))
    lastBuy := close 
    //buyLabel := label.new(na,na,yloc = yloc.belowbar, style = label.style_none, textcolor = color.green, size = size.normal)
    //label.set_x(buyLabel,bar_index)
    //label.set_y(buyLabel,low)
    //label.set_text(buyLabel,"Buy!!@ " +str.tostring(lastBuy)  + "\n TP: " + str.tostring(lastBuy*in_buyTP) + "\n↑")
    if(not in_useAlerts)
        alert("Buy")

//label.delete(buyLabel)

if ((close >= lastBuy*in_buyTP ) or (rsi7 > in_buybreakout) and close >= lastClose and (close >= lastClose*in_buyTP or close >= lastBuy*in_buyTP ) )
    //label.new(bar_index,na,"TP!!@ " +str.tostring(close), yloc = yloc.abovebar, style = label.style_none, textcolor = color.green, size = size.normal)
    strategy.close("BUY", "BUY Exit",alert_message = "Buy Exit: TP @" +str.tostring(close) + " OR TP: " + str.tostring(lastBuy*in_buyTP))    
    if(not in_useAlerts)
        alert("Buy Exit")
    
if (sell)
    strategy.entry("SELL", strategy.short, alert_message = "Sell @ " + str.tostring(close))
    lastSell := close    
    //sellLabel := label.new(na,na,yloc = yloc.abovebar, style = label.style_none, textcolor = color.red, size = size.normal)
    //label.set_x(sellLabel,bar_index)
    //label.set_y(sellLabel,high)
    //label.set_text(sellLabel,"Sell!!@ " +str.tostring(lastSell)  + "\n TP: " + str.tostring(lastSell*in_sellTP) + "\n🠇")
    if(not in_useAlerts)
        alert("Sell")

//label.delete(sellLabel)

if ( close < ma and (close <= lastSell*in_sellTP ) or (close < lastClose*in_sellTP) )
    //label.new(bar_index,na,"TP!!@ " +str.tostring(close), yloc = yloc.belowbar, style = label.style_none, textcolor = color.red, size = size.normal)
    strategy.close("SELL", "Sell Exit", alert_message = "Sell Exit TP @" +str.tostring(close) + " OR TP: " + str.tostring(lastSell*in_sellTP))
    if(not in_useAlerts)
        alert("Sell Exit")


   
alertcondition(buy and in_useAlerts,"Buy Alert","test")

Thêm nữa