Strategi ini menggunakan Stochastic RSI dan indikator perubahan harga untuk mengidentifikasi arah tren untuk masuk, dan mengkoordinasikan stop loss geser untuk manajemen risiko.
Pertama, strategi ini menghitung RSI Stochastic menggunakan indikator RSI dengan panjang 5 dan indikator Stochastic dengan panjang 7. Ketika nilai RSI Stochastic K di atas nilai D, itu adalah sinyal bullish. Ketika K di bawah D, itu adalah sinyal bearish.
Kedua, strategi menghitung indikator EMA ROC tingkat perubahan harga. Ketika EMA ROC berada di atas setengah ambang atau di bawah setengah negatif ambang, ia mengidentifikasi pergerakan harga aktif.
Kemudian, menggabungkan sinyal RSI Stochastic dan tingkat perubahan harga, ia mengidentifikasi arah tren. Ketika RSI Stochastic bullish dan harga bergerak aktif, pergi panjang. Ketika RSI Stochastic bearish dan harga bergerak aktif, pergi pendek.
Akhirnya, strategi ini menggunakan stop loss geser koordinat untuk manajemen risiko. Setelah membuka posisi, terus menyegarkan harga tertinggi / terendah, dan menggunakan jarak persentase tertentu dari harga tertinggi / terendah sebagai level stop loss.
Keuntungan dari strategi ini:
Indikator RSI stokastis secara efektif mengidentifikasi tren dan situasi overbought/oversold.
Tingkat perubahan harga menyaring keluar dari kisaran pasar untuk menghindari sinyal palsu.
Stop loss geser terkoordinasi dapat mengunci keuntungan sejauh mungkin sambil mengendalikan risiko.
Strategi ini memiliki ruang pengoptimalan yang besar untuk pengaturan parameter berdasarkan produk yang berbeda.
Logika strategi sederhana dan jelas, mudah dimengerti dan diterapkan.
Risiko dari strategi ini:
Stochastic RSI dapat menghasilkan sinyal palsu, membutuhkan konfirmasi dengan faktor lain.
Koordinat geser stop loss mungkin terlalu agresif, bisa dihentikan oleh celah dalam semalam.
Pembalikan jangka pendek dapat memicu stop loss.
Parameter perlu dioptimalkan untuk produk yang berbeda, jika tidak kinerja mungkin buruk.
Biaya perdagangan mempengaruhi profitabilitas strategi, frekuensi perdagangan yang wajar diperlukan.
Strategi ini dapat dioptimalkan lebih lanjut dalam aspek berikut:
Mengoptimalkan parameter RSI Stochastic untuk mengurangi sinyal palsu.
Mengoptimalkan tingkat perubahan parameter harga untuk meningkatkan efek penyaringan.
Tambahkan indikator tren untuk menghindari terhenti oleh pembalikan.
Optimalkan persentase stop loss untuk mengurangi risiko terjebak.
Tambahkan manajemen ukuran posisi untuk mengendalikan risiko perdagangan tunggal. seperti jumlah stop loss tetap, atau menyesuaikan ukuran posisi secara dinamis berdasarkan ekuitas akun.
Uji parameter pada produk yang berbeda untuk meningkatkan kemampuan beradaptasi.
Singkatnya, strategi ini memiliki logika yang jelas dan sederhana, mengidentifikasi arah tren dengan Stochastic RSI dan menyaring sinyal dengan tingkat perubahan harga, yang dapat secara efektif menangkap tren jangka menengah dan panjang. Mengkoordinasikan kunci stop loss geser dalam keuntungan dan mengendalikan risiko. Dengan optimasi lebih lanjut, strategi ini dapat menjadi tren yang sangat praktis mengikuti strategi.
/*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)