Schaff Trend Cycle Momentum Mengikuti Strategi

Penulis:ChaoZhang, Tanggal: 2023-11-01 16:08:35
Tag:

img

Gambaran umum

Strategi ini didasarkan pada indikator Siklus Tren Schaff, dikombinasikan dengan prinsip overbought dan oversold dari Stoch RSI, untuk menentukan dan mengikuti tren menggunakan metrik momentum.

Logika Strategi

    1. Hitung MACD, di mana default Fast Length adalah 23 dan Slow Length adalah 50. MACD mencerminkan perbedaan antara moving average jangka pendek dan jangka panjang untuk menilai momentum harga.
    1. Menerapkan Stoch RSI ke MACD untuk membentuk nilai K, di mana Panjang Siklus default adalah 10, mencerminkan tingkat overbought / oversold dari metrik momentum MACD.
    1. Ambil rata-rata bergerak tertimbang dari K untuk membentuk D, di mana default 1st %D Length adalah 3, untuk menghilangkan kebisingan dari K.
    1. Menerapkan Stoch RSI lagi ke D untuk membentuk nilai STC awal, di mana default 2nd %D Length adalah 3, untuk membuat sinyal overbought / oversold yang tepat.
    1. Ambil rata-rata bergerak tertimbang dari STC awal untuk mendapatkan nilai STC akhir, berkisar dari 0-100. STC di atas 75 adalah overbought, di bawah 25 oversold.
    1. Pergi panjang ketika STC melintasi di atas 25 ke atas, dan pendek ketika STC melintasi ke bawah di atas 75.

Keuntungan

    1. Desain STC yang menggabungkan Stoch RSI dengan jelas mengidentifikasi wilayah overbought/oversold, membentuk sinyal tren yang kuat.
    1. Filter RSI Stoch ganda secara efektif menghilangkan kebocoran palsu.
    1. STCs range standar 0-100 memungkinkan sinyal perdagangan mekanis langsung.
    1. Backtest mengimplementasikan tanda visual dan peringatan popup teks untuk menangkap sinyal yang jelas dan intuitif.
    1. Parameter default yang dioptimalkan menghindari sinyal yang terlalu sensitif dan perdagangan yang tidak perlu.

Risiko

    1. STC sensitif terhadap parameter. Koin dan kerangka waktu yang berbeda membutuhkan pengaturan parameter agar sesuai dengan karakteristik pasar.
    1. Strategi breakout rentan terhadap perangkap, membutuhkan berhenti untuk mengendalikan risiko.
    1. Kebocoran palsu likuiditas rendah dapat menghasilkan sinyal yang buruk, membutuhkan filter volume.
    1. STC saja berisiko membalikkan. konfirmasi menggunakan faktor lain diperlukan.
    1. Tingkat pendukung/resistensi utama harus dipantau untuk menghindari sinyal buruk.

Peluang Peningkatan

    1. Mengoptimalkan parameter MACD untuk periode dan koin yang berbeda.
    1. Memperbaiki nilai Stoch RSI K dan D untuk meluruskan kurva STC.
    1. Tambahkan volume filter untuk menghindari likuiditas rendah false breakouts.
    1. Masukkan indikator tambahan untuk mengkonfirmasi sinyal, misalnya Bollinger Bands.
    1. Tambahkan mekanisme berhenti seperti bergerak / ATR berhenti.
    1. Sesuaikan entri, misalnya masukkan pada pullback setelah breakout untuk konfirmasi tren.

Kesimpulan

Strategi Siklus Tren Schaff mengidentifikasi overbought / oversold melalui metrik momentum untuk menentukan perubahan tren harga jangka pendek. Meskipun sederhana dan dapat disesuaikan, itu berisiko perangkap.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-31 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// Copyright (c) 2018-present, Alex Orekhov (everget)
// Schaff Trend Cycle script may be freely distributed under the MIT license.
strategy("Schaff Trend Cycle", shorttitle="STC Backtest", overlay=true)

fastLength = input(title="MACD Fast Length",  defval=23)
slowLength = input(title="MACD Slow Length",  defval=50)
cycleLength = input(title="Cycle Length",  defval=10)
d1Length = input(title="1st %D Length",  defval=3)
d2Length = input(title="2nd %D Length",  defval=3)
src = input(title="Source",  defval=close)
highlightBreakouts = input(title="Highlight Breakouts ?", type=bool, defval=true)

macd = ema(src, fastLength) - ema(src, slowLength)

k = nz(fixnan(stoch(macd, macd, macd, cycleLength)))

d = ema(k, d1Length)

kd = nz(fixnan(stoch(d, d, d, cycleLength)))

stc = ema(kd, d2Length)
stc := 	stc > 100 ? 100 : stc < 0 ? 0 : stc

//stcColor = not highlightBreakouts ? (stc > stc[1] ? green : red) : #ff3013
//stcPlot = plot(stc, title="STC", color=stcColor, transp=0)

upper = input(75, defval=75)
lower = input(25, defval=25)

transparent = color(white, 100)

upperLevel = plot(upper, title="Upper", color=gray)
// hline(50, title="Middle", linestyle=dotted)
lowerLevel = plot(lower, title="Lower", color=gray)

fill(upperLevel, lowerLevel, color=#f9cb9c, transp=90)

upperFillColor = stc > upper and highlightBreakouts ? green : transparent
lowerFillColor = stc < lower and highlightBreakouts ? red : transparent

//fill(upperLevel, stcPlot, color=upperFillColor, transp=80)
//fill(lowerLevel, stcPlot, color=lowerFillColor, transp=80)

long =  crossover(stc, lower) ? lower : na
short = crossunder(stc, upper) ? upper : na

long_filt = long and not short
short_filt = short and not long

prev = 0
prev := long_filt ? 1 : short_filt ? -1 : prev[1]

long_final = long_filt and prev[1] == -1
short_final = short_filt and prev[1] == 1

strategy.entry("long", strategy.long, when = long )
strategy.entry("short", strategy.short, when = short)

plotshape(crossover(stc, lower) ? lower : na, title="Crossover", location=location.absolute, style=shape.circle, size=size.tiny, color=green, transp=0)
plotshape(crossunder(stc, upper) ? upper : na, title="Crossunder", location=location.absolute, style=shape.circle, size=size.tiny, color=red, transp=0)

alertcondition(long_final, "Long", message="Long")
alertcondition(short_final,"Short", message="Short")

plotshape(long_final, style=shape.arrowup, text="Long", color=green, location=location.belowbar)
plotshape(short_final, style=shape.arrowdown, text="Short", color=red, location=location.abovebar)


Lebih banyak