
Strategi ini menggunakan Stochastic RSI dan indikator volatilitas harga untuk mengidentifikasi arah tren ke dalam multi-border dan menggunakan koordinat stop loss untuk manajemen risiko.
Pertama, strategi menggunakan indikator RSI dengan panjang 5 dan indikator Stochastic dengan panjang 7 untuk menghitung RSI Stokastik. K nilai RSI Stokastik adalah sinyal bullish ketika lebih tinggi dari nilai D, dan K nilai lebih rendah dari nilai D adalah sinyal bearish.
Kedua, strategi menghitung indikator volatilitas harga EMA ROC. Ketika EMA ROC lebih tinggi dari setengah dari penurunan nilai atau lebih rendah dari setengah negatif dari penurunan nilai, harga dianggap bergerak aktif.
Kemudian, dengan kombinasi sinyal bullish Stochastic RSI dan indikator rasio pergerakan harga, arah tren dapat diidentifikasi. Ketika Stochastic RSI bullish dan harga bergerak aktif, lakukan over; Ketika Stochastic RSI bearish dan harga bergerak aktif, lakukan short.
Terakhir, strategi ini menggunakan koordinat untuk mengelola risiko dengan cara stop loss sliding. Setelah membuka posisi, terus memperbarui harga tertinggi atau terendah, dan stop loss dengan jarak tertentu dari harga tertinggi atau terendah.
Strategi ini memiliki keuntungan sebagai berikut:
Indikator Stochastic RSI dapat digunakan untuk mengidentifikasi tren dan overbought dan oversold.
Indikator volatilitas harga dapat menyaring pasar yang bergejolak untuk menghindari sinyal palsu.
Coordinate Sliding Stop Loss Mode dapat memaksimalkan penguncian keuntungan dan juga mengendalikan risiko.
Ada banyak ruang untuk mengoptimalkan parameter strategi, yang dapat disesuaikan dengan varietas yang berbeda.
Strategi ini sederhana, jelas, dan mudah dipahami.
Strategi ini juga memiliki beberapa risiko:
Stochastic RSI dapat menghasilkan sinyal palsu yang perlu dikonfirmasi dalam kombinasi dengan faktor-faktor lain.
Coordinate Sliding Stop mungkin terlalu radikal, dipukul oleh overnight gaps.
Reversi jangka pendek dapat menyebabkan stop loss dipicu.
Parameter kebijakan perlu dioptimalkan untuk varietas yang berbeda, jika tidak, mungkin tidak akan bekerja dengan baik.
Biaya transaksi dapat mempengaruhi profitabilitas strategi dan perlu mempertimbangkan frekuensi transaksi yang wajar.
Strategi ini juga dapat dioptimalkan dalam beberapa hal:
Optimalkan parameter Stochastic RSI, mengurangi tingkat sinyal palsu. Dapat menguji parameter nilai K dan nilai D yang berbeda.
Optimalkan parameter indikator volatilitas harga untuk meningkatkan efisiensi penyaringan. Anda dapat menguji periode jendela yang berbeda dan nilai terendah volatilitas.
Menggabungkan indikator penilaian tren untuk menghindari terbalik. Misalnya, menambahkan indikator seperti moving average.
Optimalkan rasio stop loss untuk mengurangi risiko underwriting. Anda dapat menguji berbagai stop loss.
Menambahkan manajemen posisi, mengontrol risiko tunggal. Misalnya, tetapkan jumlah stop loss, atau menyesuaikan posisi secara dinamis sesuai dengan saldo akun.
Uji parameter dari berbagai varietas untuk meningkatkan adaptasi.
Strategi ini memiliki konsep yang jelas dan sederhana. Strategi ini menggunakan Stochastic RSI untuk mengidentifikasi arah tren, dan bekerja dengan indikator perubahan harga untuk memfilter sinyal, yang dapat secara efektif menangkap peluang tren garis tengah dan panjang. Metode stop loss yang bergeser koordinat dapat mengunci keuntungan sambil mengendalikan risiko. Dengan pengoptimalan lebih lanjut, strategi ini dapat menjadi strategi pelacakan tren yang sangat praktis.
/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Sto2", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)
/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// Stochastic calc /////////////
smoothK = input(1, minval=1)
smoothD = input(7, minval=1)
lengthRSI = input(5, minval=1)
lengthStoch = input(7, minval=1)
src = input(close, title="RSI Source")
up = sma(max(change(src), 0), lengthRSI)
down = sma(-min(change(src), 0), lengthRSI)
rsi1 = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
///////////// Rate Of Change /////////////
source = close, roclength = input(14, minval=1), pcntChange = input(2, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))
/////////////// STRATEGY ///////////////
long = k > d and isMoving()
short = k < d and isMoving()
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(9.0, title='Take Profit %') / 100
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
// Strategy
if testPeriod()
strategy.entry("Long Entry", strategy.long, when=long)
strategy.entry("Short Entry", strategy.short, when=short)
strategy.exit("Long Ex", "Long Entry", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
strategy.exit("Short Ex", "Short Entry", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
///////////// Plotting /////////////
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
p1 = plot(k, color=color.gray, linewidth=0)
p2 = plot(d, color=color.gray, linewidth=0)
h0 = hline(100)
h1 = hline(50)
h3 = hline(0)
fill(p1, p2, color = k > d ? color.lime : color.red, transp=70)