Strategi ini menggabungkan crossover purata bergerak dan penunjuk momentum untuk mengesan dan membalikkan trend dengan berkesan. Ia mula-mula menggunakan purata bergerak cepat dan perlahan untuk menjana isyarat panjang salib emas dan isyarat pendek salib kematian. Kemudian dengan penunjuk momentum parameter tertentu, jika momentum pada MA pantas muncul lagi selepas salib emas, trend dianggap berterusan dan kedudukan panjang akan dikekalkan. Apabila momentum turun, ia dianggap sebagai pembalikan trend dan kedudukan sedia ada akan ditutup. Logik yang sama berlaku untuk isyarat pendek salib kematian ketika mengesan pembalikan trend. Penapis ADX juga digunakan untuk mengelakkan isyarat yang salah apabila tidak berada dalam keadaan trend.
Logik teras strategi ini adalah berdasarkan isyarat trend dari persimpangan MA dan isyarat pembalikan trend dari penunjuk momentum.
Mengira harga MA cepat1 (HMA tempoh 5) dan harga MA perlahan2 (HMA tempoh 7).
Salib emas dengan harga1 melintasi di atas harga2 menghasilkan isyarat panjang. Salib kematian dengan harga1 melintasi di bawah harga2 menghasilkan isyarat pendek. Ini adalah penggunaan biasa MA.
Selepas isyarat panjang, jika momentum harga roc1 muncul lagi, trend dianggap berterusan dan kedudukan panjang akan dikekalkan.
Apabila momentum roc1 turun, ia dianggap sebagai pembalikan trend dan kedudukan sedia ada akan ditutup.
Memperkenalkan ambang ADX untuk mengelakkan isyarat yang salah apabila tidak dalam keadaan trend. Isyarat dihasilkan hanya apabila ADX di atas ambang.
Berbanding dengan strategi MA yang mudah, kelebihan terbesar strategi ini adalah pengenalan penunjuk momentum untuk menentukan pembalikan trend dengan lebih cepat dan tepat.
MAs sendiri menjangkiti perubahan harga, sementara penunjuk momentum dapat dengan cepat menangkap isyarat pembalikan untuk menghentikan kerugian tepat pada masanya atau perdagangan terbalik.
Isyarat pembalikan berdasarkan momentum lebih boleh dipercayai, mengelakkan pesanan terbuka/tutup yang tidak perlu semasa perdagangan trend.
ADX mengelakkan isyarat yang salah di pasaran bukan trend, menjaga strategi lebih tertumpu pada trend dengan peluang kemenangan yang lebih tinggi.
Logiknya mudah dan mudah difahami, sesuai untuk pemula perdagangan algo.
Ruang pengoptimuman yang besar dengan menyesuaikan tempoh MA, parameter momentum dan lain-lain untuk pasaran yang berbeza.
Risiko utama strategi ini berasal dari:
Sifat keterlambatan MAs, yang boleh menyebabkan isyarat tertunda, kehilangan titik masuk terbaik.
Penembusan palsu menyebabkan entri atau keluar yang tidak perlu. Memerlukan pengoptimuman parameter atau penapis tambahan.
Pengesanan pembalikan trend bergantung pada momentum, yang mungkin tergelincir semasa perubahan pasaran yang besar.
ADX tidak sempurna dalam mengesan trend dan penyatuan. tetapan ambang yang tidak betul boleh menyebabkan masalah.
Tiada pertimbangan kos dagangan. Stop loss yang betul harus ditetapkan apabila digunakan dalam dagangan sebenar.
Strategi ini boleh dioptimumkan lagi dalam aspek berikut:
Cuba jenis MA yang lain atau sesuaikan parameter MA untuk kesan pelincir yang lebih baik.
Mengoptimumkan panjang penunjuk momentum untuk kepekaan yang lebih tinggi untuk menangkap pembalikan harga.
Tetapkan penapis harga apabila momentum berbalik untuk mengelakkan ditipu oleh turun naik jangka pendek.
Meningkatkan penggunaan ADX dengan menggunakan parameter yang berbeza pada tahap ADX yang berbeza.
Memperkenalkan penunjuk kelantangan dan lain-lain untuk meningkatkan kualiti isyarat dan menapis pecah palsu.
Tambahkan mekanisme stop loss untuk mengawal kerugian perdagangan tunggal.
Strategi ini menggabungkan kelebihan MA dan penunjuk momentum untuk mengesan trend dan menangkap pembalikan. Berbanding dengan strategi trend yang murni, ia boleh menjadi lebih fleksibel dalam menangani peringkat pasaran yang berbeza, mengelakkan kerugian dari klimaks trend sambil mengekalkan perdagangan trend. Penambahbaikan lanjut boleh dibuat melalui pengoptimuman parameter dan pengenalan keadaan tambahan. Secara keseluruhan, strategi ini mempunyai logika yang jelas dan mudah, sangat sesuai untuk pemula perdagangan algo 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")