Strategi ini menggabungkan crossover rata-rata bergerak dan indikator momentum untuk secara efektif melacak dan membalikkan tren. Pertama-tama menggunakan rata-rata bergerak cepat dan lambat untuk menghasilkan sinyal panjang salib emas dan sinyal pendek salib kematian. Kemudian dengan indikator momentum dari parameter tertentu, jika momentum pada MA cepat muncul lagi setelah salib emas, tren dianggap berkelanjutan dan posisi panjang akan dipertahankan. Ketika momentum turun, itu dianggap sebagai pembalikan tren dan posisi yang ada akan ditutup. Logika yang sama berlaku untuk sinyal pendek salib kematian saat melacak pembalikan tren. Filter ADX juga digunakan untuk menghindari sinyal yang salah ketika tidak dalam keadaan tren.
Logika inti dari strategi ini didasarkan pada sinyal tren dari penyeberangan MA dan sinyal pembalikan tren dari indikator momentum.
Menghitung harga MA cepat1 (HMA 5 periode) dan harga MA lambat2 (HMA 7 periode).
Palang emas dengan harga1 melintasi harga2 menghasilkan sinyal panjang. Palang kematian dengan harga1 melintasi harga2 menghasilkan sinyal pendek. Ini adalah penggunaan umum MA.
Setelah sinyal panjang, jika momentum harga roc1 muncul lagi, tren dianggap berlanjut dan posisi panjang akan dipertahankan.
Ketika momentum roc1 turun, itu dianggap sebagai pembalikan tren dan posisi yang ada akan ditutup.
Masukkan ambang ADX untuk menghindari sinyal yang salah ketika tidak dalam kondisi tren.
Dibandingkan dengan strategi MA sederhana, keuntungan terbesar dari strategi ini adalah pengenalan indikator momentum untuk menentukan pembalikan tren lebih cepat dan akurat.
MAs sendiri menunda perubahan harga, sementara indikator momentum dapat dengan cepat menangkap sinyal pembalikan untuk stop loss yang tepat waktu atau perdagangan terbalik.
Sinyal pembalikan yang didasarkan pada momentum lebih dapat diandalkan, menghindari perintah buka/tutup yang tidak perlu selama perdagangan tren.
ADX menghindari sinyal yang salah di pasar non-trending, menjaga strategi lebih terfokus pada tren dengan peluang menang yang lebih tinggi.
Logikanya sederhana dan mudah dimengerti, cocok untuk pemula perdagangan algo.
Ruang optimalisasi yang besar dengan menyesuaikan periode MA, parameter momentum dll untuk pasar yang berbeda.
Risiko utama dari strategi ini berasal dari:
Sifat keterlambatan MAs, yang dapat menyebabkan sinyal tertunda, kehilangan titik masuk terbaik.
Penembusan palsu menyebabkan entri atau keluar yang tidak perlu. Membutuhkan optimasi lebih lanjut dari parameter atau filter tambahan.
Deteksi pembalikan tren bergantung pada momentum, yang dapat goyah selama perubahan pasar yang besar.
ADX tidak sempurna dalam mendeteksi tren dan konsolidasi. pengaturan ambang yang tidak tepat dapat menyebabkan masalah.
Tidak mempertimbangkan biaya perdagangan. Stop loss yang tepat harus ditetapkan ketika diterapkan dalam perdagangan nyata.
Strategi ini dapat dioptimalkan lebih lanjut dalam aspek berikut:
Cobalah jenis MA lain atau sesuaikan parameter MA untuk efek pelembab yang lebih baik.
Mengoptimalkan panjang indikator momentum untuk sensitivitas yang lebih tinggi untuk menangkap pembalikan harga.
Tetapkan filter harga saat momentum berbalik untuk menghindari tertipu oleh fluktuasi jangka pendek.
Meningkatkan penggunaan ADX dengan menggunakan parameter yang berbeda pada tingkat ADX yang berbeda.
Memperkenalkan indikator volume dll untuk meningkatkan kualitas sinyal dan menyaring kebocoran palsu.
Tambahkan mekanisme stop loss untuk mengendalikan kerugian perdagangan tunggal.
Strategi ini menggabungkan keuntungan dari indikator MA dan momentum untuk melacak tren dan menangkap pembalikan. Dibandingkan dengan strategi mengikuti tren murni, strategi ini dapat lebih fleksibel dalam menangani tahap pasar yang berbeda, menghindari kerugian dari klimaks tren sambil menjaga perdagangan tren. Perbaikan lebih lanjut dapat dilakukan melalui optimasi parameter dan pengenalan kondisi tambahan. Secara keseluruhan, strategi ini memiliki logika yang jelas dan sederhana, sangat cocok untuk pemula perdagangan algo untuk belajar dan menerapkan.
/*backtest start: 2023-09-23 00:00:00 end: 2023-10-23 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //study(title="MA Crossover Strategy", overlay = true) strategy("MA Crossover Strategy with MA Turning Point Exits", overlay=true) src = input(open, title="Source") price = request.security(syminfo.tickerid, timeframe.period, src) ma1 = input(5, title="1st MA Length") type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA"]) ma2 = input(7, title="2nd MA Length") type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA"]) adxlen = input(14, title="ADX Smoothing") dilen = input(14, title="DI Length") adxthreshold = input(20, title="ADX threshold") dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) //study("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, resolution="") //plot(sig, color=color.red, title="ADX") f_hma(_src, _length)=> _return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length))) price1 = if (type1 == "SMA") sma(price, ma1) else if (type1 == "EMA") ema(price, ma1) else f_hma(price, ma1) price2 = if (type2 == "SMA") sma(price, ma2) else if (type2 == "EMA") ema(price, ma2) else f_hma(price, ma2) //plot(series=price, style=line, title="Price", color=black, linewidth=1, transp=0) plot(series=price1, style=line, title="1st MA", color=blue, linewidth=2, transp=0) plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0) //longCondition = price1> price2 longCondition = price1> price2 and sig > adxthreshold if (longCondition) strategy.entry("Long", strategy.long) shortCondition = price1 < price2 and sig > adxthreshold if (shortCondition) strategy.entry("Short", strategy.short) lookback1 = input(1, "Lookback 1") roc1 = roc(price1, lookback1) ma1up = false ma1down = false ma2up = false ma2down = false ma1up := nz(ma1up[1]) ma1down := nz(ma1down[1]) ma2up := nz(ma2up[1]) ma2down := nz(ma2down[1]) trendStrength1 = input(2, title="Minimum slope magnitude * 100", type=float) * 0.01 if crossover(roc1, trendStrength1) ma1up := true ma1down := false if crossunder(roc1, -trendStrength1) ma1up := false ma1down := true shortexitCondition = ma1up and ma1down[1] and sig > adxthreshold if (shortexitCondition) strategy.close("Short") longexitCondition = ma1down and ma1up[1] and sig > adxthreshold if (longexitCondition) strategy.close("Long")