Tren Mengikuti Strategi Berdasarkan Stochastic dan CCI

Penulis:ChaoZhang, Tanggal: 2023-11-22 16:23:31
Tag:

img

Gambaran umum

Strategi ini menggabungkan indikator Stochastic dan indikator CCI untuk mengidentifikasi arah tren, dan menggunakan indikator Rate of Change untuk menyaring tren yang terikat rentang, untuk mengikuti tren.

Logika Strategi

  1. Indikator stokastik menilai pola bullish/bearish
    Golden Cross dari Stochastic adalah sinyal beli, sementara death cross adalah sinyal jual
  2. Indikator CCI menentukan arah tren CCI di atas 0 menunjukkan pasar bullish, sementara di bawah 0 pasar bearish
  3. Indikator Rate of Change menyaring tren yang terikat pada kisaran
    Tetapkan parameter Rate of Change untuk menilai apakah harga berada dalam tren aktif
  4. Aturan masuk dan keluar Entri panjang: Stochastic golden cross & CCI > 0 & tren aktif Entri singkat: Stochastic death cross & CCI < 0 & tren aktif Stop loss exit: 3% stop loss untuk kedua sisi panjang dan pendek

Analisis Pro

  1. Kombinasi dari Stochastic dan CCI meningkatkan akurasi penilaian tren
  2. Rate of Change menyaring tren yang terbatas pada kisaran, menghindari perdagangan yang tidak valid
  3. Perdagangan panjang dan pendek, mampu menangkap jenis tren yang berbeda
  4. Penembusan masuk tepat waktu menangkap peluang tren
  5. Stop loss yang ketat mencegah kerugian besar dan mengontrol risiko

Analisis Risiko

  1. Pengaturan parameter yang tidak tepat dapat menyebabkan strategi yang terlalu konservatif atau agresif
  2. Efek terbatas dari indikator, mungkin gagal dalam kondisi pasar yang ekstrim
  3. Penembusan entri melewatkan tahap awal tren, menyerah bagian dari keuntungan
  4. Stop loss yang terlalu ketat atau terlalu lebar gagal dalam pengendalian risiko

Arahan Optimasi

  1. Optimasi parameter untuk menemukan kombinasi optimal
  2. Tambahkan lebih banyak indikator tren untuk meningkatkan efektivitas
  3. Menggunakan stop loss trailing atau stop loss berbasis waktu untuk mengurangi kemungkinan pelanggaran stop loss
  4. Tambahkan metrik risiko seperti penarikan maksimum untuk sepenuhnya mengendalikan risiko

Ringkasan

Strategi ini menilai arah tren dengan mengintegrasikan indikator Stochastic, CCI dan Rate of Change, dan menangkap peluang tren dengan pelacakan breakout. Keuntungannya terletak pada penilaian yang akurat yang diberdayakan oleh kombinasi indikator, penyaringan pasar yang terikat rentang, dan stop loss yang ketat untuk pengendalian risiko. Langkah selanjutnya adalah untuk lebih meningkatkan strategi melalui optimasi parameter, beberapa indikator, strategi stop loss untuk membuatnya lebih kuat dan fleksibel.


/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Stochastic CCI BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// 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

///////////// CCI ///////////// 
src = close
ccilength = input(13, minval=1, title="CCI Length")
c=cci(src, ccilength)

///////////// Stochastic ///////////// 
len = input(19, minval=1, title="RSI Length")
lenema = input(12, minval=1, title="RSI-EMA Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
out = ema(rsi, lenema)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, 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 = out > out[1] and isMoving() and c > 0
short = out < out[1] and isMoving() and c < 0

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(3.0, title='Stop Loss %') / 100 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

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

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long_signal)
    strategy.entry("S", strategy.short, when=short_signal)
    strategy.exit("L Ex", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S Ex", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=80)
plot(out, color = out > out[1] ? color.lime:color.red, linewidth = 2, title="Stoch")
plot(c, color = c > 0 ? color.lime:color.red, linewidth = 2, title="CCI")

Lebih banyak