RSI Bollinger Bands Chiến lược TP/SL

Tác giả:ChaoZhang, Ngày: 21-12-2023 11:17:19
Tags:

img

I. Tổng quan chiến lược

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.

II. Chiến lược logic

1. Chỉ số RSI cho sự đảo ngược

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.

2. Bollinger Bands cho xu hướng

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ợ.

3. Kết hợp RSI và Bollinger Bands

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.

III. Ưu điểm

1. Cải thiện độ chính xác với các chỉ số kép

RSI và Bollinger Bands được sử dụng để xác định xu hướng và đảo ngược.

2. Kiểm soát rủi ro bằng cách sử dụng TP/SL

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ỗ.

3. Các hướng dẫn có thể tùy chỉnh

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.

IV. Rủi ro

1. Các thông số Bollinger Bands nhạy cảm

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.

2. Rủi ro của TP/SL

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.

3. Các thông số RSI nhạy cảm

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.

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

1. Tối ưu hóa các thông số RSI

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.

2. Tối ưu hóa các thông số Bollinger Bands

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.

3. Kiểm tra tỷ lệ TP / SL khác nhau

Kiểm tra ngược có thể giúp tìm tỷ lệ TP / SL tối ưu.

VI. Kết luận

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")



















Thêm nữa