Strategi crossover rata-rata bergerak ganda adalah strategi trend-mengikuti yang menggunakan crossover dua rata-rata bergerak dari periode yang berbeda sebagai sinyal perdagangan. Ini memasuki posisi panjang atau pendek ketika MA cepat melintasi di atas atau di bawah MA lambat dan menentukan arah tren setelah crossover.
Strategi ini menggunakan dua rata-rata bergerak: MA cepat dengan periode yang lebih pendek (misalnya 15 periode) untuk menangkap pergerakan harga jangka pendek, dan MA lambat dengan periode yang lebih lama (misalnya 21 periode) untuk mengidentifikasi arah tren utama.
Dengan menyesuaikan kombinasi periode MA, strategi dapat menyesuaikan kerangka waktu tren untuk menangkap.
Strategi ini juga menggabungkan modul manajemen risiko termasuk mengambil keuntungan, stop loss dan trailing stop loss.
Strategi MA ganda memiliki keunggulan berikut:
Ada juga beberapa risiko yang harus dipertimbangkan:
Kelemahan ini dapat diatasi melalui optimasi seperti penyaringan sinyal, trailing stop loss dll.
Strategi dapat ditingkatkan dalam aspek seperti:
Peningkatan signifikan dalam tingkat kemenangan, pengembalian yang disesuaikan dengan risiko diharapkan dari peningkatan ini.
Secara keseluruhan, strategi crossover rata-rata bergerak ganda menawarkan kesederhanaan, fleksibilitas dan risiko yang dapat dikendalikan. Kemudahan implementasi dan optimalisasi membuatnya menjadi strategi kuantitas awal yang ideal. Dengan pengujian dan penyesuaian berulang, ia memiliki kredensial untuk berkembang menjadi sistem yang kuat dari waktu ke waktu.
/*backtest start: 2022-12-10 00:00:00 end: 2023-06-16 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true) maFastSource = input(defval = ohlc4, title = "Fast MA Source") maFastLength = input(defval = 15, title = "Fast MA Period", minval = 1) maSlowSource = input(defval = ohlc4, title = "Slow MA Source") maSlowLength = input(defval = 21, title = "Slow MA Period", minval = 1) tradeInvert = input(defval = false, title = "Invert Trade Direction?") inpTakeProfit = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0) inpStopLoss = input(defval = 100, title = "Stop Loss", minval = 0) inpTrailStop = input(defval = 0, title = "Trailing Stop Loss", minval = 0) inpTrailOffset = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0) useTakeProfit = inpTakeProfit >= 1 ? inpTakeProfit : na useStopLoss = inpStopLoss >= 1 ? inpStopLoss : na useTrailStop = inpTrailStop >= 1 ? inpTrailStop : na useTrailOffset = inpTrailOffset >= 1 ? inpTrailOffset : na useTimeLimit = input(defval = true, title = "Use Start Time Limiter?") startYear = input(defval = 2018, title = "Start From Year", minval = 0, step = 1) startMonth = input(defval = 05, title = "Start From Month", minval = 0,step = 1) startDay = input(defval = 01, title = "Start From Day", minval = 0,step = 1) startHour = input(defval = 00, title = "Start From Hour", minval = 0,step = 1) startMinute = input(defval = 00, title = "Start From Minute", minval = 0,step = 1) startTimeOk() => inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute) timeOk = time > inputTime ? true : false r = (useTimeLimit and timeOk) or not useTimeLimit maFast = ema(maFastSource, maFastLength) maSlow = sma(maSlowSource, maSlowLength) fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50) slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50) aboveBelow = maFast >= maSlow ? true : false tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false if( startTimeOk() ) enterLong = not tradeDirection[1] and tradeDirection exitLong = tradeDirection[1] and not tradeDirection strategy.entry( id = "Long", long = true, when = enterLong ) //strategy.close( id = "Long", when = exitLong ) enterShort = tradeDirection[1] and not tradeDirection exitShort = not tradeDirection[1] and tradeDirection strategy.entry( id = "Short", long = false, when = enterShort ) //strategy.close( id = "Short", when = exitShort ) strategy.exit("Exit Long", from_entry = "Long", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick) strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)