Dual MA Trend Breakout adalah strategi perdagangan kuantitatif yang menggunakan dua rata-rata bergerak dari periode yang berbeda untuk menentukan tren dan menghasilkan sinyal masuk. Strategi ini terutama menilai arah tren keseluruhan melalui MA lambat dan menggunakan MA cepat untuk penyaringan entri.
Strategi ini terdiri dari bagian-bagian utama berikut:
Penghakiman Tren: Menghitung MA 21 periode, didefinisikan sebagai MA lambat. Posisinya relatif stabil dan dapat digunakan untuk menilai arah tren keseluruhan. Ketika harga naik dekat dengan MA ini, itu adalah tren naik. Ketika harga turun dekat dengan MA ini, itu adalah tren menurun.
Filter entri: Menghitung MA 5 periode, didefinisikan sebagai MA cepat. Hanya ketika harga menembus baik MA lambat dan MA cepat, sinyal perdagangan dipicu. Desain ini terutama lebih lanjut menyaring kemungkinan pecah palsu.
Filter Lilin: Strategi ini hanya berjalan panjang ketika lilin saat ini menurun, atau berjalan pendek ketika lilin saat ini naik. Ini menganggap bahwa menggunakan batang pembalikan untuk masuk dapat memperoleh tingkat keberhasilan yang lebih tinggi. Ini juga menggabungkan indikator RSI cepat untuk menghindari memasuki daerah yang terlalu banyak dibeli atau terlalu banyak dijual.
Filter Piramida: Untuk pasar kripto, strategi ini juga mencakup kondisi volatilitas tiga kali lipat untuk menangkap peluang oversold dalam tren penurunan yang signifikan.
Hentikan KerugianSetelah membuka posisi, stop loss akan diperbarui secara real-time berdasarkan persentase yang ditetapkan.
Keuntungan dari strategi ini meliputi:
Strategi ini juga memiliki beberapa risiko:
Untuk mengatasi risiko ini, optimasi dapat dilakukan dalam aspek berikut:
Aspek utama untuk mengoptimalkan strategi ini meliputi:
Optimasi Parameter: Melakukan backtest secara sistematis untuk menemukan kombinasi periode MA cepat dan lambat yang optimal untuk meningkatkan pengembalian yang disesuaikan dengan risiko.
Pengakuan Pola: Tambahkan indikator lain seperti KDJ, MACD untuk mengidentifikasi sinyal pembalikan yang lebih andal.
Optimasi Stop Loss: Mengembangkan algoritma stop loss yang mengambang atau tertinggal untuk mengurangi kemungkinan dihentikan.
Pembelajaran Mesin: Mengumpulkan dan memberi label data historis untuk secara otomatis menghasilkan aturan perdagangan menggunakan ML.
Ukuran Posisi: Sesuaikan ukuran posisi secara dinamis berdasarkan kondisi pasar.
Dual MA Trend Breakout Strategy umumnya merupakan strategi trend following yang sederhana dan praktis. Dibandingkan dengan algoritma pembelajaran mesin yang kompleks, strategi ini lebih mudah ditafsirkan dan dikuasai, dengan keandalan yang lebih tinggi. Dengan penyesuaian parameter, perluasan fitur dan augmentasi ML, strategi ini memiliki potensi peningkatan yang besar dan merupakan titik awal yang bagus untuk perdagangan kuantitatif.
/*backtest start: 2023-12-31 00:00:00 end: 2024-01-07 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy(title = "Noro's Trend MAs Strategy v2.0 +CB", shorttitle = "Trend MAs str 2.0", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0) //Settings needlong = input(true, "long") needshort = input(true, "short") needstops = input(false, "stops") stoppercent = input(5, defval = 5, minval = 1, maxval = 50, title = "Stop, %") useohlc4 = input(false, defval = false, title = "Use OHLC4") usefastsma = input(true, "Use fast MA Filter") fastlen = input(5, defval = 5, minval = 1, maxval = 50, title = "fast MA Period") slowlen = input(21, defval = 20, minval = 2, maxval = 200, title = "slow MA Period") bars = input(2, defval = 2, minval = 0, maxval = 3, title = "Bars Q") needbg = input(false, defval = false, title = "Need trend Background?") needarr = input(false, defval = false, title = "Need entry arrows?") needex = input(true, defval = true, title = "Need extreme? (crypto/fiat only!!!)") src = useohlc4 == true ? ohlc4 : close //PriceChannel 1 lasthigh = highest(src, slowlen) lastlow = lowest(src, slowlen) center = (lasthigh + lastlow) / 2 //PriceChannel 2 lasthigh2 = highest(src, fastlen) lastlow2 = lowest(src, fastlen) center2 = (lasthigh2 + lastlow2) / 2 //Trend trend = low > center and low[1] > center[1] ? 1 : high < center and high[1] < center[1] ? -1 : trend[1] //Bars bar = close > open ? 1 : close < open ? -1 : 0 redbars = bars == 0 ? 1 : bars == 1 and bar == -1 ? 1 : bars == 2 and bar == -1 and bar[1] == -1 ? 1 : bars == 3 and bar == -1 and bar[1] == -1 and bar[2] == -1 ? 1 : 0 greenbars = bars == 0 ? 1 : bars == 1 and bar == 1 ? 1 : bars == 2 and bar == 1 and bar[1] == 1 ? 1 : bars == 3 and bar == 1 and bar[1] == 1 and bar[2] == 1 ? 1 : 0 //Fast RSI fastup = rma(max(change(close), 0), 2) fastdown = rma(-min(change(close), 0), 2) fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown)) //CryptoBottom mac = sma(close, 10) len = abs(close - mac) sma = sma(len, 100) max = max(open, close) min = min(open, close) up3 = close < open and len > sma * 3 and min < min[1] and fastrsi < 10 ? 1 : 0 //Signals up = trend == 1 and (low < center2 or usefastsma == false) and (redbars == 1) ? 1 : 0 dn = trend == -1 and (high > center2 or usefastsma == false) and (greenbars == 1) ? 1 : 0 up2 = high < center and high < center2 and bar == -1 ? 1 : 0 dn2 = low > center and low > center2 and bar == 1 ? 0 : 0 //Lines plot(center, color = blue, linewidth = 3, transp = 0, title = "Slow MA") plot(center2, color = red, linewidth = 3, transp = 0, title = "PriceChannel 2") //Arrows plotarrow(up == 1 and needarr == true ? 1 : 0, colorup = black, colordown = black, transp = 0) plotarrow(dn == 1 and needarr == true ? -1 : 0, colorup = black, colordown = black, transp = 0) //Background col = needbg == false ? na : trend == 1 ? lime : red bgcolor(col, transp = 90) //Alerts alertcondition(up == 1, title='buy', message='Uptrend') alertcondition(dn == 1, title='sell', message='Downtrend') //Trading stoplong = up == 1 and needstops == true ? close - (close / 100 * stoppercent) : stoplong[1] stopshort = dn == 1 and needstops == true ? close + (close / 100 * stoppercent) : stopshort[1] longCondition = up == 1 or (up2 == 1 and needex == true) or up3 == 1 if (longCondition) strategy.entry("Long", strategy.long, needlong == false ? 0 : na) strategy.exit("Stop Long", "Long", stop = stoplong) shortCondition = dn == 1 if (shortCondition) strategy.entry("Short", strategy.short, needshort == false ? 0 : na) strategy.exit("Stop Short", "Short", stop = stopshort)