Chiến lược này được đặt tên là RSI Bollinger Bands TP / SL Chiến lược. Nó kết hợp chỉ số RSI và Bollinger Bands để xác định xu hướng và tín hiệu giao dịch. Khi chỉ số RSI cho thấy tín hiệu mua quá nhiều hoặc bán quá nhiều và giá chạm hoặc phá vỡ các Bollinger Bands, các vị trí dài hoặc ngắn sẽ được mở. Ngoài ra, điểm lấy lợi nhuận và điểm dừng lỗ cũng được thiết lập để kiểm soát rủi ro.
Chỉ số RSI đánh giá liệu một cổ phiếu có bị mua quá nhiều hay bán quá nhiều. Một bài đọc RSI trên đường mua quá nhiều chỉ ra điều kiện mua quá nhiều, trong khi một bài đọc dưới đường bán quá nhiều chỉ ra điều kiện bán quá nhiều.
Bollinger Bands vẽ đường lệch chuẩn trên và dưới một đường trung bình di chuyển đơn giản. Dải trên đóng vai trò là kháng cự và dải dưới đóng vai trò là hỗ trợ.
Khi chỉ số RSI hiển thị tín hiệu đảo ngược dưới cùng và giá vượt qua dải dưới Bollinger Bands, nó được coi là đảo ngược lên, do đó đi dài.
RSI và Bollinger Bands được sử dụng để xác định xu hướng và đảo ngược.
Các tập hợp chiến lược lấy lợi nhuận (TP) và điểm dừng lỗ (SL) để khóa lợi nhuận và tối đa hóa giảm thiểu lỗ.
Người dùng có thể chỉ mua dài, chỉ mua ngắn hoặc cả hai hướng dựa trên điều kiện thị trường, cho phép kiểm soát rủi ro linh hoạt.
Kích thước độ lệch chuẩn ảnh hưởng đến chiều rộng băng tần và tín hiệu giao dịch.
Sự đảo ngược hình chữ V có thể gây ra tổn thất không cần thiết với các cài đặt TP / SL quá hung hăng.
Cài đặt tham số RSI sai dẫn đến sự giảm độ chính xác của tín hiệu đảo ngược.
Nhiều giá trị chiều dài RSI có thể được thử nghiệm để tìm ra sự kết hợp thông số tối ưu.
Nhiều chiều dài và độ lệch chuẩn có thể được thử nghiệm để tìm ra sự kết hợp tham số tối ưu.
Kiểm tra ngược có thể giúp tìm tỷ lệ TP / SL tối ưu.
Chiến lược này tận dụng RSI và Bollinger Bands để xác định xu hướng và đảo ngược, và thiết lập TP / SL để kiểm soát rủi ro. Nó có thể tự động phát hiện tín hiệu giao dịch và quản lý lối ra.
/*backtest start: 2023-11-20 00:00:00 end: 2023-12-20 00:00:00 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/ // © BigCoinHunter //@version=5 strategy(title="RSI_Boll-TP/SL", overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, currency=currency.USD, commission_value=0.05, commission_type=strategy.commission.percent, process_orders_on_close=true) //----------- get the user inputs -------------- //---------- RSI ------------- price = input(close, title="Source") RSIlength = input.int(defval=6,title="RSI Length") RSIoverSold = input.int(defval=50, title="RSI OverSold", minval=1) RSIoverBought = input.int(defval=50, title="RSI OverBought", minval=1) //------- Bollinger Bands ----------- BBlength = input.int(defval=200, title="Bollinger Period Length", minval=1) BBmult = input.float(defval=2.0, minval=0.001, maxval=50, step=0.1, title="Bollinger Bands Standard Deviation") BBbasis = ta.sma(price, BBlength) BBdev = BBmult * ta.stdev(price, BBlength) BBupper = BBbasis + BBdev BBlower = BBbasis - BBdev source = close buyEntry = ta.crossover(source, BBlower) sellEntry = ta.crossunder(source, BBupper) plot(BBbasis, color=color.aqua, title="Bollinger Bands SMA Basis Line") p1 = plot(BBupper, color=color.silver, title="Bollinger Bands Upper Line") p2 = plot(BBlower, color=color.silver, title="Bollinger Bands Lower Line") fill(plot1=p1, plot2=p2, title="Bollinger BackGround", color=color.new(color.aqua,90), fillgaps=false, editable=true) //---------- input TP/SL --------------- tp = input.float(title="Take Profit:", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01 sl = input.float(title="Stop Loss: ", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01 longEntry = input.bool(defval=true, title= 'Long Entry', inline="11") shortEntry = input.bool(defval=true, title='Short Entry', inline="11") //---------- backtest range setup ------------ fromDay = input.int(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input.int(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input.int(defval = 2021, title = "From Year", minval = 2010) toDay = input.int(defval = 30, title = "To Day", minval = 1, maxval = 31) toMonth = input.int(defval = 12, title = "To Month", minval = 1, maxval = 12) toYear = input.int(defval = 2042, title = "To Year", minval = 2010) //------------ time interval setup ----------- start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(toYear, toMonth, toDay, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" //------- define the global variables ------ var bool long = true var bool stoppedOutLong = false var bool stoppedOutShort = false //--------- Colors --------------- TrendColor = RSIoverBought and (price[1] > BBupper and price < BBupper) and BBbasis < BBbasis[1] ? color.red : RSIoverSold and (price[1] < BBlower and price > BBlower) and BBbasis > BBbasis[1] ? color.green : na //bgcolor(switch2?(color.new(TrendColor,50)):na) //--------- calculate the input/output points ----------- longProfitPrice = strategy.position_avg_price * (1 + tp) // tp -> take profit percentage longStopPrice = strategy.position_avg_price * (1 - sl) // sl -> stop loss percentage shortProfitPrice = strategy.position_avg_price * (1 - tp) shortStopPrice = strategy.position_avg_price * (1 + sl) //---------- RSI + Bollinger Bands Strategy ------------- vrsi = ta.rsi(price, RSIlength) rsiCrossOver = ta.crossover(vrsi, RSIoverSold) rsiCrossUnder = ta.crossunder(vrsi, RSIoverBought) BBCrossOver = ta.crossover(source, BBlower) BBCrossUnder = ta.crossunder(source, BBupper) if (not na(vrsi)) if rsiCrossOver and BBCrossOver long := true if rsiCrossUnder and BBCrossUnder long := false //------------------- determine buy and sell points --------------------- buySignall = window() and long and (not stoppedOutLong) sellSignall = window() and (not long) and (not stoppedOutShort) //---------- execute the strategy ----------------- if(longEntry and shortEntry) if long strategy.entry("LONG", strategy.long, when = buySignall, comment = "ENTER LONG") stoppedOutLong := true stoppedOutShort := false else strategy.entry("SHORT", strategy.short, when = sellSignall, comment = "ENTER SHORT") stoppedOutLong := false stoppedOutShort := true else if(longEntry) strategy.entry("LONG", strategy.long, when = buySignall) strategy.close("LONG", when = sellSignall) if long stoppedOutLong := true else stoppedOutLong := false else if(shortEntry) strategy.entry("SHORT", strategy.short, when = sellSignall) strategy.close("SHORT", when = buySignall) if not long stoppedOutShort := true else stoppedOutShort := false //----------------- take profit and stop loss ----------------- if(tp>0.0 and sl>0.0) if ( strategy.position_size > 0 ) strategy.exit(id="LONG", limit=longProfitPrice, stop=longStopPrice, comment="Long TP/SL Trigger") else if ( strategy.position_size < 0 ) strategy.exit(id="SHORT", limit=shortProfitPrice, stop=shortStopPrice, comment="Short TP/SL Trigger") else if(tp>0.0) if ( strategy.position_size > 0 ) strategy.exit(id="LONG", limit=longProfitPrice, comment="Long TP Trigger") else if ( strategy.position_size < 0 ) strategy.exit(id="SHORT", limit=shortProfitPrice, comment="Short TP Trigger") else if(sl>0.0) if ( strategy.position_size > 0 ) strategy.exit(id="LONG", stop=longStopPrice, comment="Long SL Trigger") else if ( strategy.position_size < 0 ) strategy.exit(id="SHORT", stop=shortStopPrice, comment="Short SL Trigger")