Strategi Perbezaan Momentum Moving Average

Penulis:ChaoZhang, Tarikh: 2023-11-27 16:25:54
Tag:

img

Ringkasan

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.

Logika Strategi

Komponen utama strategi ini ialah:

  1. EMA/SMA Crossover: Garis pantas EMA 9 tempoh melintasi di atas garis perlahan SMA 21 tempoh untuk mencetuskan isyarat beli.

  2. Indikator MACD: Histogram MACD perlu positif apabila digabungkan dengan isyarat silang EMA/SMA sebagai pengesahan tambahan.

  3. Indikator StockRSI: Isyarat diaktifkan apabila StockRSI melebihi tahap OVERBOUGHT (80) atau di bawah tahap OVERSOLD (20).

  4. Bollinger Bands: Memerlukan harga berada dalam jalur di mana jalur tengah adalah SMA 20 tempoh dan lebar jalur adalah dua penyimpangan standard.

  5. 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.

Analisis Kelebihan

Kekuatan utama strategi ini ialah:

  1. Hasil Backtest yang cemerlang: Pelbagai penunjuk yang terbukti membawa kepada prestasi yang lebih baik berbanding penanda aras dan penunjuk individu.

  2. Parameter yang dioptimumkan: Parameter utama seperti tempoh EMA dan Bollinger Band dioptimumkan untuk meningkatkan kestabilan.

  3. Pendaftaran dan pengesahan: Bollinger Bands dan ATR membolehkan penyesuaian dinamik berhenti untuk kawalan risiko yang lebih baik.

  4. Mudah Digunakan: Struktur kod yang bersih dan akses data yang mudah menghasilkan operasi praktikal yang mudah.

Analisis Risiko

Walaupun prestasi yang baik, risiko utama termasuk:

  1. Isyarat Palsu: Fluktuasi pasaran yang luar biasa atau kegagalan penunjuk boleh menghasilkan isyarat yang salah.

  2. 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.

  3. 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:

  1. Campur tangan manual: Dalam situasi yang tidak normal, isyarat boleh diperiksa secara manual, parameter disesuaikan semula atau strategi berhenti sementara.

  2. Pengoptimuman Parameter: Kaedah yang lebih saintifik dan objektif seperti algoritma genetik boleh digunakan untuk pengoptimuman sistematik.

  3. Penangguhan yang Disesuaikan Volatiliti: Julat stop loss boleh ditetapkan pada 1-3 kali ATR untuk menggabungkan turun naik.

Peluang Peningkatan

Strategi ini boleh ditingkatkan lagi dalam bidang berikut:

  1. Mekanisme Stop Loss yang Lebih Kuat: Stop loss atau stop yang berasaskan purata bergerak boleh dimasukkan.

  2. Penapis Volume: Menambah penunjuk jumlah untuk mengelakkan pecah palsu.

  3. Parameter Dinamik: Mengoptimumkan parameter secara automatik seperti tempoh purata bergerak dan lebar jalur berdasarkan keadaan pasaran yang berubah.

  4. Pembelajaran Mesin: LSTM, RNN dan algoritma lain boleh membolehkan pengoptimuman dinamik parameter.

Kesimpulan

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)


Lebih lanjut