Trend Bullish Berbasis RSI Mengikuti Strategi

Penulis:ChaoZhang, Tanggal: 2023-12-25 14:32:19
Tag:

img

Gambaran umum

Strategi ini dirancang berdasarkan indikator Relative Strength Index (RSI) untuk membeli pada titik rendah RSI dan mengambil keuntungan dan stop loss pada titik tinggi RSI. Ini menghasilkan sinyal beli ketika RSI turun di bawah garis oversold dan sinyal jual ketika RSI naik di atas garis overbought. Strategi ini dioptimalkan untuk melacak tren dengan kontrol risiko yang efektif.

Logika Strategi

Strategi ini menggunakan indikator RSI untuk menentukan apakah saham terlalu dinilai atau terlalu dinilai. RSI dikombinasikan dengan garis overbought dan oversold membentuk sinyal beli dan jual. Secara khusus, jika RSI melintasi di atas garis oversold 20, sinyal beli dihasilkan; jika RSI melintasi di bawah garis overbought 80, sinyal jual dihasilkan.

Setelah masuk ke posisi long, strategi menetapkan stop loss awal untuk mengendalikan risiko penurunan. Pada saat yang sama, dua jalur mengambil keuntungan dengan rasio yang berbeda diatur untuk mengambil keuntungan dalam batch dan mengunci keuntungan. Secara khusus, 50% dari posisi akan mengambil keuntungan pertama pada 3% di atas harga masuk; kemudian posisi 50% yang tersisa akan mengambil keuntungan pada 5% di atas harga masuk.

Strategi ini secara efektif memanfaatkan indikator RSI untuk menentukan waktu masuk.

Keuntungan

  • Menggunakan indikator RSI untuk menentukan posisi panjang/pendek dan menghindari perdagangan secara buta
  • Parameter RSI yang dioptimalkan untuk efek indikator yang lebih baik
  • Desain dual take profit yang masuk akal memungkinkan mengambil keuntungan dalam batch untuk mengunci lebih banyak keuntungan
  • Stop loss awal dan trailing stop loss mencegah kerugian besar

Risiko

  • Kinerja yang buruk dalam pasar bull yang tidak dapat mempertahankan keuntungan
  • Kemungkinan sinyal yang salah dari RSI ada dan dapat meningkatkan kerugian dari penilaian sinyal yang salah
  • Risiko bahwa stop tidak dapat dipicu jika titik stop loss diatur terlalu tinggi
  • Risiko kerugian yang diperbesar tanpa batas pada waktu dan rasio piramida

Peningkatan

  • Tambahkan indikator lain untuk menyaring sinyal RSI dan meningkatkan akurasi
  • Tetapkan batas waktu dan rasio piramida
  • Efek uji dari parameter RSI yang berbeda
  • Optimalkan stop loss dan mengambil poin keuntungan untuk mengurangi risiko

Ringkasan

Strategi ini menggunakan RSI untuk menilai kondisi pasar dan memiliki konfigurasi stop loss dan take profit yang wajar. Ini dapat secara efektif menentukan tren pasar dan mengendalikan risiko perdagangan, cocok sebagai tren bullish mengikuti strategi. penyaringan sinyal, pengujian parameter, pengoptimalan stop loss dll dapat lebih meningkatkan stabilitas strategi.


/*backtest
start: 2023-12-17 00:00:00
end: 2023-12-24 00:00:00
period: 1m
basePeriod: 1m
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/

//@version=5

strategy(title='RSI Long Strategy', overlay=true, pyramiding=5, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_order_fills=false, slippage=0, commission_type=strategy.commission.percent, commission_value=0.075)
strat_dir_input = input.string(title='Strategy Direction', defval='long', options=['long', 'short', 'all'])
strat_dir_value = strat_dir_input == 'long' ? strategy.direction.long : strat_dir_input == 'short' ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//INPUTS


length = input(21)
overSold = input(20)
overBought = input(80)
p = close

vrsi = ta.rsi(p, length)
price = close
var bool long = na
var bool short = na

long := ta.crossover(vrsi, overSold)
short := ta.crossunder(vrsi, overBought)

var float last_open_long = na
var float last_open_short = na

last_open_long := long ? close : nz(last_open_long[1])
last_open_short := short ? close : nz(last_open_short[1])
mpoint=(last_open_long+last_open_short)/2

entry_value = last_open_long
entry_value1 = last_open_short

// Rounding levels to min tick
nround(x) =>
    n = math.round(x / syminfo.mintick) * syminfo.mintick
    n
//
disp_panels = input(true, title='Display info panels?')
fibs_label_off = input(40, title='fibs label offset')
fibs_label_size = input.string(size.normal, options=[size.tiny, size.small, size.normal, size.large, size.huge], title='fibs label size')
r1_x = timenow + math.round(ta.change(time) * fibs_label_off)
r1_y = last_open_short
text1 = 'High : ' + str.tostring(nround(last_open_short))
s1_y = last_open_long
text3 = 'low : ' + str.tostring(nround(last_open_long))

R1_label = disp_panels ? label.new(x=r1_x, y=r1_y, text=text1, xloc=xloc.bar_time, yloc=yloc.price, color=color.orange, style=label.style_label_down, textcolor=color.black, size=fibs_label_size) : na
S1_label = disp_panels ? label.new(x=r1_x, y=s1_y, text=text3, xloc=xloc.bar_time, yloc=yloc.price, color=color.lime, style=label.style_label_up, textcolor=color.black, size=fibs_label_size) : na

label.delete(R1_label[1])
label.delete(S1_label[1])
//
plot(mpoint, title='avreage', color=color.new(color.red, 40), style=plot.style_linebr, linewidth=3, trackprice=true, offset=-9999)
plot(last_open_short, title='high', color=color.new(color.red, 40), style=plot.style_linebr, linewidth=3, trackprice=true, offset=-9999)
plot(last_open_long, title='low', color=color.new(color.blue, 40), style=plot.style_linebr, linewidth=3, trackprice=true, offset=-9999)
//
trend = input(false)
if barstate.islast and trend == true
    line z = line.new(bar_index[1], last_open_short[1], bar_index, last_open_short, extend=extend.both, color=color.red, style=line.style_dashed, width=1)
    line f = line.new(bar_index[1], mpoint[1], bar_index, mpoint, extend=extend.both, color=color.blue, style=line.style_dashed, width=1)
    line w = line.new(bar_index[1], last_open_long[1], bar_index, last_open_long, extend=extend.both, color=color.green, style=line.style_dashed, width=1)
    line.delete(z[1])
    line.delete(f[1])
    line.delete(w[1])
    
//bu = ta.crossover(close, mpoint)
//sz = ta.crossunder(close, mpoint)
//bu1 = ta.crossover(close, last_open_short)
sz1 = ta.crossunder(close, last_open_short)
bu2 = ta.crossover(close, last_open_long)
//sz2 = ta.crossunder(close, last_open_long)
//plotshape(sz, style=shape.triangledown, location=location.abovebar, color=color.new(color.orange, 0), size=size.tiny)
//plotshape(bu, style=shape.triangleup, location=location.belowbar, color=color.new(color.blue, 0), size=size.tiny)
//plotshape(sz1, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.tiny)
//plotshape(bu1, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.tiny)
//plotshape(sz2, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.tiny)
//plotshape(bu2, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.tiny)

l = bu2
s = sz1 
if l
    strategy.entry('buy', strategy.long)
if s
    strategy.entry('sell', strategy.short)
per(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
stoploss = input.float(title=' stop loss', defval=5, minval=0.01)
los = per(stoploss)
q1 = input.int(title=' qty_percent1', defval=50, minval=1)
q2 = input.int(title=' qty_percent2', defval=50, minval=1)
tp1 = input.float(title=' Take profit1', defval=3, minval=0.01)
tp2 = input.float(title=' Take profit2', defval=5, minval=0.01)
//tp4 = input.float(title=' Take profit4', defval=5, minval=0.01)
strategy.exit('x1', qty_percent=q1, profit=per(tp1), loss=los)
strategy.exit('x2', qty_percent=q2, profit=per(tp2), loss=los)



Lebih banyak