Strategi Crossover Rata-rata Bergerak Ganda

Penulis:ChaoZhang, Tanggal: 2023-12-11 15:21:58
Tag:

img

Gambaran umum

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.

Logika Strategi

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.

Keuntungan

Strategi MA ganda memiliki keunggulan berikut:

  1. Logika sederhana dan mudah dipahami/diimplementasikan;
  2. Fleksibilitas untuk beradaptasi dengan kondisi pasar dengan menyesuaikan periode MA;
  3. Stabilitas dari sinyal perdagangan yang lebih sedikit;
  4. Pengendalian risiko yang efektif melalui stop loss;
  5. Kemudahan optimasi pada MA, parameter risiko dll.

Risiko

Ada juga beberapa risiko yang harus dipertimbangkan:

  1. Crossover yang berlebihan dan frekuensi perdagangan selama pasar yang terikat rentang;
  2. MAs yang tertinggal mungkin melewatkan titik pembalikan harga dan gagal menghentikan kerugian tepat waktu;
  3. Kerentanan terhadap kebocoran palsu yang mengakibatkan kerugian yang tidak perlu;
  4. Ketidakakuratan pelacakan harga umum karena keterlambatan AS.

Kelemahan ini dapat diatasi melalui optimasi seperti penyaringan sinyal, trailing stop loss dll.

Peluang Peningkatan

Strategi dapat ditingkatkan dalam aspek seperti:

  1. Menambahkan filter pada volume atau volatilitas untuk menghindari whipsaws;
  2. Memeriksa lebih banyak jenis MA dan periode/rumus penyempurnaan yang tepat agar sesuai dengan produk dan kerangka waktu yang berbeda;
  3. Memeriksa jenis MA seperti EMA, LWMA untuk pelacakan harga tercepat;
  4. Mengotomatiskan MA tuning dan stop loss sizing dengan machine learning;
  5. Teknik stop loss alternatif misalnya gap, harga rata-rata, lampu gantung.

Peningkatan signifikan dalam tingkat kemenangan, pengembalian yang disesuaikan dengan risiko diharapkan dari peningkatan ini.

Kesimpulan

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)

Lebih banyak