Trend Mengikut Strategi Berdasarkan Stochastic dan CCI

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

img

Ringkasan

Strategi ini menggabungkan penunjuk Stochastic dan penunjuk CCI untuk mengenal pasti arah trend, dan menggunakan penunjuk Kadar Perubahan untuk menapis trend terhad dalam julat, untuk mengikuti trend.

Logika Strategi

  1. Indikator stokastik menilai corak bullish/bearish
    Salib emas Stochastic adalah isyarat beli, manakala salib kematian isyarat jual
  2. Indikator CCI menentukan arah trend CCI di atas 0 menunjukkan pasaran bullish, manakala di bawah 0 pasaran bearish
  3. Indikator kadar perubahan menapis trend terikat julat
    Tetapkan parameter kadar perubahan untuk menilai sama ada harga adalah dalam trend aktif
  4. Peraturan kemasukan dan keluar Entri panjang: Stochastic golden cross & CCI > 0 & trend aktif Entry ringkas: Stochastic death cross & CCI < 0 & trend aktif Keluar Stop Loss: 3% Stop Loss untuk kedua-dua sisi panjang dan pendek

Analisis Kelebihan

  1. Gabungan Stochastic dan CCI meningkatkan ketepatan penilaian trend
  2. Rate of Change menapis trend terhad julat, mengelakkan perdagangan yang tidak sah
  3. Kedua-dua perdagangan panjang dan pendek, mampu menangkap jenis trend yang berbeza
  4. Penembusan masuk tepat pada masanya menangkap peluang trend
  5. Stop loss yang ketat menghalang kerugian besar dan mengawal risiko

Analisis Risiko

  1. Tetapan parameter yang tidak betul boleh membawa kepada strategi yang terlalu konservatif atau agresif
  2. Kesan ketara penunjuk, mungkin gagal dalam keadaan pasaran yang melampau
  3. Pendaftaran pecah terlepas peringkat awal trend, melepaskan sebahagian daripada keuntungan
  4. Stop loss yang terlalu ketat atau terlalu luas gagal dalam kawalan risiko

Arahan pengoptimuman

  1. Pengoptimuman parameter untuk mencari kombinasi optimum
  2. Tambah lebih banyak penunjuk trend untuk meningkatkan keberkesanan
  3. Menggunakan stop loss berturut-turut atau stop loss berasaskan masa untuk mengurangkan kemungkinan pelanggaran stop loss
  4. Tambah metrik risiko seperti pengeluaran maksimum untuk mengawal sepenuhnya risiko

Ringkasan

Strategi ini menilai arah trend dengan mengintegrasikan penunjuk Stochastic, CCI dan Rate of Change, dan menangkap peluang trend dengan penjejakan pecah. Kelebihannya terletak pada penilaian yang tepat yang dikuasakan oleh kombinasi penunjuk, penapisan pasaran yang terikat julat, dan stop loss yang ketat untuk kawalan risiko. Langkah seterusnya adalah untuk meningkatkan lagi strategi melalui pengoptimuman parameter, pelbagai penunjuk, strategi stop loss untuk menjadikannya lebih mantap 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 lanjut