Strategi ini berdasarkan kepada penunjuk Siklus Trend Schaff, digabungkan dengan prinsip overbought dan oversold Stoch RSI, untuk menentukan dan mengikuti trend menggunakan metrik momentum. Ia pergi lama apabila harga keluar dari rantau oversold ke rantau overbought, dan pergi pendek apabila harga pecah dari rantau overbought ke rantau oversold. Strategi secara dinamik menyesuaikan kedudukan dengan menangkap perubahan dalam trend harga.
Strategi Siklus Trend Schaff mengenal pasti overbought / oversold melalui metrik momentum untuk menentukan perubahan trend harga jangka pendek. Walaupun mudah dan boleh diselaraskan, ia berisiko perangkap. Pengesahan dan berhenti membantu pengoptimuman untuk trend yang kuat.
/*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)