Strategi ini adalah sistem perdagangan automatik yang menggabungkan beberapa penunjuk teknikal, terutamanya menggunakan RSI (Relative Strength Index), CHOP (Choppiness Index), dan penunjuk Stochastic untuk mengenal pasti trend pasaran sambil menguruskan risiko perdagangan melalui mekanisme mengambil keuntungan dan berhenti rugi yang dinamik.
Strategi ini menggunakan empat penunjuk teras untuk pengesanan trend dan penjanaan isyarat perdagangan: 1. RSI untuk mengenal pasti keadaan overbought/oversold (RSI <30 oversold, >70 overbought) 2. Indeks CHOP untuk menentukan ketegangan pasaran (<50 menunjukkan trend yang jelas) 3. persilangan garis K dan D stokastik untuk pengesahan masa perdagangan 4. SMA (Simple Moving Average) untuk sokongan trend keseluruhan
Peraturan perdagangan adalah: - Long Entry: RSI<30 + CHOP<50 + garis K melintasi di atas garis D - Entry Pendek: RSI>70 + CHOP<50 + Garis K melintasi di bawah Garis D Strategi ini melaksanakan tahap keuntungan dinamik berasaskan peratusan dan stop-loss untuk kawalan risiko.
Strategi ini membina sistem perdagangan yang agak lengkap melalui gabungan pelbagai penunjuk dan kawalan risiko yang ketat. Walaupun terdapat bidang untuk pengoptimuman, reka bentuk keseluruhan jelas dan mempunyai nilai aplikasi praktikal. Melalui pengoptimuman berterusan dan penyesuaian parameter, kestabilan dan keuntungan strategi dapat ditingkatkan lagi.
/*backtest start: 2024-12-17 00:00:00 end: 2025-01-16 00:00:00 period: 4h basePeriod: 4h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}] */ //@version=5 strategy("RSI + CHOP + Stochastic Strategy", overlay=true) // Parametry wskaźników rsiPeriod = input(14, title="RSI Period") chopPeriod = input(14, title="Choppiness Period") stochK = input(14, title="Stochastic K Period") stochD = input(3, title="Stochastic D Period") stochSmoothK = input(3, title="Stochastic Smooth K Period") smaPeriod = input(50, title="SMA Period") // Parametry Take Profit i Stop Loss longTakeProfitPct = input.float(1.0, title="Long Take Profit %", minval=0.1, step=0.1) / 100 longStopLossPct = input.float(5.0, title="Long Stop Loss %", minval=0.1, step=0.1) / 100 shortTakeProfitPct = input.float(1.0, title="Short Take Profit %", minval=0.1, step=0.1) / 100 shortStopLossPct = input.float(5.0, title="Short Stop Loss %", minval=0.1, step=0.1) / 100 // Obliczenia wskaźników rsiValue = ta.rsi(close, rsiPeriod) highLowRange = ta.highest(high, chopPeriod) - ta.lowest(low, chopPeriod) chopIndex = 100 * math.log10(highLowRange / ta.sma(close, chopPeriod)) / math.log10(2) stoch = ta.stoch(close, high, low, stochK) k = stoch[0] d = stoch[1] // Obliczenia SMA smaValue = ta.sma(close, smaPeriod) // Warunki kupna i sprzedaży buyCondition = (rsiValue < 30) and (chopIndex < 50) and (ta.crossover(k, d)) sellCondition = (rsiValue > 70) and (chopIndex < 50) and (ta.crossunder(k, d)) var float longStopLevel = na var float longTakeProfitLevel = na var float shortStopLevel = na var float shortTakeProfitLevel = na // Wejście w pozycję długą if (buyCondition and na(longStopLevel)) strategy.entry("Long", strategy.long) longStopLevel := na // Zresetuj poziom Stop Loss longTakeProfitLevel := na // Zresetuj poziom Take Profit // Wejście w pozycję krótką if (sellCondition and na(shortStopLevel)) strategy.entry("Short", strategy.short) shortStopLevel := na // Zresetuj poziom Stop Loss shortTakeProfitLevel := na // Zresetuj poziom Take Profit // Ustaw poziomy Take Profit i Stop Loss na podstawie ceny wejścia w pozycję if (strategy.position_size > 0 and na(longTakeProfitLevel)) longStopLevel := strategy.position_avg_price * (1 - longStopLossPct) longTakeProfitLevel := strategy.position_avg_price * (1 + longTakeProfitPct) if (strategy.position_size < 0 and na(shortTakeProfitLevel)) shortStopLevel := strategy.position_avg_price * (1 + shortStopLossPct) shortTakeProfitLevel := strategy.position_avg_price * (1 - shortTakeProfitPct) // Resetowanie poziomów po wyjściu z pozycji if (strategy.position_size == 0) longStopLevel := na longTakeProfitLevel := na shortStopLevel := na shortTakeProfitLevel := na // Wyjście z pozycji długiej if (strategy.position_size > 0) strategy.exit("Take Profit", "Long", limit=longTakeProfitLevel, stop=longStopLevel) // Wyjście z pozycji krótkiej if (strategy.position_size < 0) strategy.exit("Take Profit", "Short", limit=shortTakeProfitLevel, stop=shortStopLevel) // Oznaczenie poziomów stop loss i take profit na wykresie plot(series=longStopLevel, title="Long Stop Loss", color=color.red, linewidth=1, style=plot.style_circles) plot(series=longTakeProfitLevel, title="Long Take Profit", color=color.green, linewidth=1, style=plot.style_circles) plot(series=shortStopLevel, title="Short Stop Loss", color=color.red, linewidth=1, style=plot.style_circles) plot(series=shortTakeProfitLevel, title="Short Take Profit", color=color.green, linewidth=1, style=plot.style_circles) // Wyświetlanie wskaźników na wykresie plot(rsiValue, title="RSI", color=color.blue, linewidth=2) hline(30, "RSI 30", color=color.red) hline(70, "RSI 70", color=color.red) plot(chopIndex, title="Choppiness Index", color=color.purple, linewidth=2) hline(50, "CHOP 50", color=color.red) plot(k, title="Stochastic K", color=color.green, linewidth=2) plot(d, title="Stochastic D", color=color.red, linewidth=2) hline(20, "Stoch 20", color=color.red) hline(80, "Stoch 80", color=color.red) // Wyświetlanie SMA na wykresie plot(smaValue, title="SMA", color=color.orange, linewidth=2)