Strategi Moving Average Breakout Momentum adalah strategi perdagangan saham yang menggabungkan isyarat silang purata bergerak dengan penunjuk momentum. Strategi ini menggunakan beberapa penunjuk teknikal termasuk Exponential Moving Average (EMA), Simple Moving Average (SMA), Moving Average Convergence Divergence (MACD), dan Indeks Kekuatan Relatif yang diubah suai (StockRSI) untuk menjana isyarat beli apabila mengesahkan trend menaik jangka panjang. Apabila penunjuk momentum jangka pendek menunjukkan isyarat pembalikan, strategi mengambil keuntungan.
Komponen utama strategi ini ialah:
EMA/SMA Crossover: Garis pantas EMA 9 tempoh melintasi di atas garis perlahan SMA 21 tempoh untuk mencetuskan isyarat beli.
Indikator MACD: Histogram MACD perlu positif apabila digabungkan dengan isyarat silang EMA/SMA sebagai pengesahan tambahan.
Indikator StockRSI: Isyarat diaktifkan apabila StockRSI melebihi tahap OVERBOUGHT (80) atau di bawah tahap OVERSOLD (20).
Bollinger Bands: Memerlukan harga berada dalam jalur di mana jalur tengah adalah SMA 20 tempoh dan lebar jalur adalah dua penyimpangan standard.
Berhenti Kerugian dan Ambil Keuntungan: Dihitung berdasarkan ATR 14 tempoh.
Strategi ini memerlukan sekurang-kurangnya 2 daripada 3 penunjuk untuk memberikan isyarat beli, harga berada dalam Bollinger Bands, dan trend jangka panjang tetap bullish untuk menjana isyarat beli akhir.
Kekuatan utama strategi ini ialah:
Hasil Backtest yang cemerlang: Pelbagai penunjuk yang terbukti membawa kepada prestasi yang lebih baik berbanding penanda aras dan penunjuk individu.
Parameter yang dioptimumkan: Parameter utama seperti tempoh EMA dan Bollinger Band dioptimumkan untuk meningkatkan kestabilan.
Pendaftaran dan pengesahan: Bollinger Bands dan ATR membolehkan penyesuaian dinamik berhenti untuk kawalan risiko yang lebih baik.
Mudah Digunakan: Struktur kod yang bersih dan akses data yang mudah menghasilkan operasi praktikal yang mudah.
Walaupun prestasi yang baik, risiko utama termasuk:
Isyarat Palsu: Fluktuasi pasaran yang luar biasa atau kegagalan penunjuk boleh menghasilkan isyarat yang salah.
Parameter yang tidak mencukupi: Parameter yang tidak betul boleh membawa kepada perdagangan yang terlalu kerap atau kepekaan yang tidak mencukupi. Parameter harus disesuaikan mengikut produk dan persekitaran pasaran yang berbeza.
Stop Loss yang Tidak Sesuai: Stop loss yang terlalu ketat cenderung untuk berhenti sebelum waktunya, sementara stop loss yang terlalu luas boleh mengakibatkan kerugian yang berlebihan.
Untuk menangani risiko di atas, langkah-langkah berikut boleh diambil:
Campur tangan manual: Dalam situasi yang tidak normal, isyarat boleh diperiksa secara manual, parameter disesuaikan semula atau strategi berhenti sementara.
Pengoptimuman Parameter: Kaedah yang lebih saintifik dan objektif seperti algoritma genetik boleh digunakan untuk pengoptimuman sistematik.
Penangguhan yang Disesuaikan Volatiliti: Julat stop loss boleh ditetapkan pada 1-3 kali ATR untuk menggabungkan turun naik.
Strategi ini boleh ditingkatkan lagi dalam bidang berikut:
Mekanisme Stop Loss yang Lebih Kuat: Stop loss atau stop yang berasaskan purata bergerak boleh dimasukkan.
Penapis Volume: Menambah penunjuk jumlah untuk mengelakkan pecah palsu.
Parameter Dinamik: Mengoptimumkan parameter secara automatik seperti tempoh purata bergerak dan lebar jalur berdasarkan keadaan pasaran yang berubah.
Pembelajaran Mesin: LSTM, RNN dan algoritma lain boleh membolehkan pengoptimuman dinamik parameter.
Strategi Purata Bergerak Momentum Breakout memanfaatkan kekuatan menggabungkan beberapa penunjuk teknikal, dan telah mencapai keuntungan yang baik dengan pengesahan jangka panjang dan jangka pendek. Dengan prosedur kawalan risiko yang baik dalam pelaksanaan, strategi ini mempunyai potensi yang luas untuk penambahbaikan lanjut di bidang seperti mekanisme kehilangan berhenti dan penapisan isyarat untuk mencapai pulangan alpha yang lebih konsisten.
/*backtest start: 2022-11-20 00:00:00 end: 2023-11-26 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true) // Volatility volatility = ta.atr(14) // EMA/MA Crossover fast_length = 9 slow_length = 21 fast_ma = ta.ema(close, fast_length) slow_ma = ta.sma(close, slow_length) crossover_signal = ta.crossover(fast_ma, slow_ma) // MACD [macdLine, signalLine, macdHistogram] = ta.macd(close, 12, 26, 9) macd_signal = crossover_signal and (macdHistogram > 0) // Bollinger Bands source = close basis = ta.sma(source, 20) upper = basis + 2 * ta.stdev(source, 20) lower = basis - 2 * ta.stdev(source, 20) // Fractal-based Support and Resistance levels isFractalHigh = high[2] < high[1] and high[1] > high[0] isFractalLow = low[2] > low[1] and low[1] < low[0] resistance = ta.valuewhen(isFractalHigh, high[1], 0) support = ta.valuewhen(isFractalLow, low[1], 0) // StockRSI length = 14 K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length)) D = ta.sma(K, 3) overbought = 80 oversold = 20 stockrsi_signal = ((K < D) and (K < oversold)) or ((K > D) and (K > overbought)) // Buy and sell conditions mandatory_buy_conditions = (crossover_signal ? 1 : 0) + (macd_signal ? 1 : 0) + (stockrsi_signal ? 1 : 0) // Long-term Trend Check long_term_ma = ta.sma(close, 200) long_term_bullish = close > long_term_ma long_term_bearish = close < long_term_ma // Plot the long-term MA for visual clarity plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1) // Simplified Buy and Sell conditions buy_condition = long_term_bullish and (mandatory_buy_conditions >= 2) and (close > lower) and (close < upper) sell_condition = (macdHistogram < 0) and (K > D) and (K > overbought) // Potential SL and TP based on volatility potential_SL = close - volatility potential_TP = close + 2 * volatility plot(potential_SL, title="SL Level", color=color.red, linewidth=1, style=plot.style_linebr) plot(potential_TP, title="TP Level", color=color.green, linewidth=1, style=plot.style_linebr) // ... (rest of your code above) // State variable to track if we're in a position, a counter for trades, and a delayed counter for plotting var bool inPosition = false var tradeCounter = 0 var tradeCounterDelayed = 0 // Declaration of the variable // Buy logic: Check if tradeCounter is 0 and the buy condition is met if tradeCounter == 0 and buy_condition strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP) inPosition := true tradeCounter := tradeCounter + 1 // Sell logic: Check if tradeCounter is 1, the sell condition is met, and we are in a position if tradeCounter == 1 and inPosition and sell_condition strategy.close("BUY") inPosition := false tradeCounter := tradeCounter - 1 // Update the delayed trade counter: tradeCounterDelayed := tradeCounter // Plotting bgcolor(buy_condition ? color.new(color.green, 90) : sell_condition ? color.new(color.red, 90) : na) plotshape(series=buy_condition and tradeCounterDelayed == 0, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small) plotshape(series=sell_condition and tradeCounterDelayed == 1, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small) // ... (rest of your code if any)