RSI Bollinger Bands Strategi TP/SL

Penulis:ChaoZhang, Tarikh: 2023-12-21 11:17:19
Tag:

img

I. Ringkasan Strategi

Strategi ini dinamakan RSI Bollinger Bands TP/SL Strategy. Ia menggabungkan penunjuk RSI dan Bollinger Bands untuk mengenal pasti trend dan isyarat perdagangan. Apabila penunjuk RSI menunjukkan isyarat overbought atau oversold dan harga menyentuh atau memecahkan Bollinger Bands, kedudukan panjang atau pendek akan dibuka. Selain itu, mengambil keuntungan dan titik hentian kerugian juga ditetapkan untuk mengawal risiko.

II. Logik Strategi

1. Penunjuk RSI untuk Pembalikan

Indikator RSI menilai sama ada saham terlalu banyak dibeli atau terlalu banyak dijual. Pembacaan RSI di atas garis terlalu banyak dibeli menunjukkan keadaan terlalu banyak dibeli, sementara pembacaan di bawah garis terlalu banyak dijual menunjukkan keadaan terlalu banyak dijual.

2. Bollinger Bands untuk Trend

Bollinger Bands merangka garis penyimpangan standard di atas dan di bawah purata bergerak mudah. Band atas bertindak sebagai rintangan dan band bawah bertindak sebagai sokongan.

3. Gabungan RSI dan Bollinger Bands

Apabila penunjuk RSI menunjukkan isyarat pembalikan bawah dan harga memecahkan jalur bawah Bollinger Bands, ia dianggap sebagai pembalikan ke atas, dengan itu pergi panjang.

III. Kelebihan

1. Penambahbaikan ketepatan dengan penunjuk berganda

RSI dan Bollinger Bands digunakan untuk menentukan trend dan pembalikan.

2. Kawalan risiko menggunakan TP/SL

Strategi set mengambil keuntungan (TP) dan titik stop loss (SL) untuk mengunci keuntungan dan memaksimumkan pengurangan kerugian.

3. Arahan yang boleh disesuaikan

Pengguna boleh pergi hanya panjang, hanya pendek atau kedua-dua arah berdasarkan keadaan pasaran, yang membolehkan kawalan risiko yang fleksibel.

IV. Risiko

1. Parameter Bollinger Bands sensitif

Saiz penyimpangan standard mempengaruhi lebar jalur dan isyarat perdagangan. tetapan yang tidak betul boleh menghasilkan isyarat palsu yang berlebihan.

2. Risiko TP/SL

Pembalikan berbentuk V boleh mencetuskan kerugian yang tidak perlu dengan tetapan TP / SL yang terlalu agresif.

3. Parameter RSI sensitif

Tetapan parameter RSI yang salah membawa kepada penurunan ketepatan isyarat pembalikan.

V. Arahan pengoptimuman

1. Mengoptimumkan Parameter RSI

Lebih banyak nilai panjang RSI boleh diuji untuk mencari kombinasi parameter yang optimum.

2. Mengoptimumkan Parameter Bollinger Bands

Lebih banyak panjang dan penyimpangan standard boleh diuji untuk mencari kombinasi parameter yang optimum.

3. Uji nisbah TP / SL yang berbeza

Ujian belakang boleh membantu mencari nisbah TP / SL yang optimum.

VI. Kesimpulan

Strategi ini memanfaatkan RSI dan Bollinger Bands untuk mengenal pasti trend dan pembalikan, dan menetapkan TP / SL untuk mengawal risiko. Ia boleh mengesan isyarat perdagangan secara automatik dan menguruskan keluar. Masih ada beberapa risiko yang boleh ditingkatkan dengan pengoptimuman parameter. Secara umum, ini adalah strategi praktikal dengan penerapan yang kuat.


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



















Lebih lanjut