Momentum Breakout Moving Average adalah strategi perdagangan saham yang menggabungkan sinyal crossover rata-rata bergerak dengan indikator momentum. Strategi ini menggunakan beberapa indikator teknis termasuk Exponential Moving Average (EMA), Simple Moving Average (SMA), Moving Average Convergence Divergence (MACD), dan Modified Relative Strength Index (StockRSI) untuk menghasilkan sinyal beli saat mengkonfirmasi tren kenaikan jangka panjang. Ketika indikator momentum jangka pendek menunjukkan sinyal pembalikan, strategi mengambil keuntungan.
Komponen utama dari strategi ini adalah:
EMA/SMA Crossover: Garis cepat EMA 9 periode melintasi di atas garis lambat SMA 21 periode untuk memicu sinyal beli.
Indikator MACD: Histogram MACD harus positif bila dikombinasikan dengan sinyal crossover EMA/SMA sebagai konfirmasi tambahan.
Indikator StockRSI: Sinyal dipicu ketika StockRSI berada di atas tingkat OVERBOUGHT (80) atau di bawah tingkat OVERSOLD (20).
Bollinger Bands: Memerlukan harga berada dalam band di mana band tengah adalah SMA 20 periode dan lebar band adalah dua standar deviasi.
Hentikan Kerugian dan Dapatkan Keuntungan: Dihitung berdasarkan ATR 14 periode.
Strategi ini membutuhkan setidaknya 2 dari 3 indikator untuk memberikan sinyal beli, harga berada dalam Bollinger Bands, dan tren jangka panjang tetap bullish untuk menghasilkan sinyal beli akhir.
Kekuatan utama dari strategi ini adalah:
Hasil Tes Belakang yang Baik: Beberapa indikator yang telah terbukti menghasilkan kinerja yang lebih baik daripada indikator acuan dan indikator individu.
Parameter yang Dioptimalkan: Parameter kunci seperti periode EMA dan Bollinger Band dioptimalkan untuk meningkatkan stabilitas.
Pembuatan Stop Loss/Profit Automated: Bollinger Bands dan ATR memungkinkan penyesuaian stop secara dinamis untuk kontrol risiko yang lebih baik.
Mudah Diimplementasikan: Struktur kode yang bersih dan aksesibilitas data yang mudah menghasilkan operasi praktis yang mudah.
Meskipun kinerja yang layak, risiko utama termasuk:
Sinyal Palsu: Fluktuasi pasar yang tidak biasa atau kegagalan indikator dapat menghasilkan sinyal yang salah.
Parameter yang Tidak Memadai: Parameter yang tidak tepat dapat menyebabkan perdagangan yang terlalu sering atau sensitivitas yang tidak cukup. Parameter harus disesuaikan dengan produk dan lingkungan pasar yang berbeda.
Stop Loss yang Tidak Sesuai: Stop loss yang terlalu ketat cenderung berhenti terlalu dini, sedangkan stop loss yang diatur terlalu luas dapat mengakibatkan kerugian yang berlebihan.
Untuk mengatasi risiko di atas, langkah-langkah berikut dapat diadopsi:
Intervensi manual: Dalam situasi abnormal, sinyal dapat diperiksa secara manual, parameter disesuaikan kembali atau strategi secara sementara dihentikan.
Optimasi Parameter: Metode yang lebih ilmiah dan obyektif seperti algoritma genetik dapat digunakan untuk optimasi sistematis.
Volatilitas Disesuaikan Stop: Jangkauan stop loss dapat ditetapkan pada 1-3 kali ATR untuk memasukkan volatilitas.
Strategi ini dapat ditingkatkan lagi di bidang berikut:
Mekanisme Stop Loss yang Lebih Kuat: Stop loss atau stop stop yang didasarkan pada moving average dapat dimasukkan.
Filter Volume: Menambahkan indikator volume untuk menghindari pecah palsu.
Parameter Dinamis: Mengoptimalkan parameter secara otomatis seperti periode rata-rata bergerak dan lebar pita berdasarkan perubahan kondisi pasar.
Pembelajaran Mesin: LSTM, RNN dan algoritma lainnya dapat memungkinkan optimasi dinamis parameter.
Strategi Momentum Breakout Moving Average memanfaatkan kekuatan menggabungkan beberapa indikator teknis, dan telah mencapai profitabilitas yang layak dengan konfirmasi jangka panjang dan jangka pendek.
/*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)