Strategi Crossover Purata Bergerak Berganda

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

img

Ringkasan

Strategi crossover purata bergerak berganda adalah strategi yang mengikuti trend yang menggunakan persilangan dua purata bergerak dari tempoh yang berbeza sebagai isyarat perdagangan. Ia memasuki kedudukan panjang atau pendek apabila MA cepat melintasi di atas atau di bawah MA perlahan dan menentukan arah trend selepas persilangan. Ia boleh menangkap trend jangka menengah sambil mengurangkan kekerapan perdagangan yang tidak perlu dari turun naik yang berlebihan.

Logika Strategi

Strategi ini menggunakan dua purata bergerak: MA pantas dengan tempoh yang lebih pendek (contohnya 15 tempoh) untuk menangkap pergerakan harga jangka pendek, dan MA perlahan dengan tempoh yang lebih lama (contohnya 21 tempoh) untuk mengenal pasti arah trend utama. Isyarat perdagangan dihasilkan dari persilangan antara kedua-dua MA: penyeberangan MA pantas di atas MA perlahan memberikan isyarat beli, sementara penyeberangan MA pantas di bawah memberikan isyarat jual.

Dengan menyesuaikan kombinasi tempoh MA, strategi dapat menyesuaikan jangka masa trend untuk ditangkap. combo MA yang lebih pendek menyasarkan osilasi jangka pendek sementara combo MA yang lebih lama menapis bunyi bising dan memberi tumpuan kepada trend jangka panjang sahaja.

Strategi ini juga menggabungkan modul pengurusan risiko termasuk mengambil keuntungan, hentikan kerugian dan hentikan kerugian. Ini membantu mengehadkan keuntungan maksimum / kerugian perdagangan individu dan mengandungi risiko keseluruhan.

Kelebihan

Strategi MA berganda mempunyai kelebihan berikut:

  1. Logik yang mudah dan mudah difahami / dilaksanakan;
  2. Fleksibiliti untuk menyesuaikan diri dengan keadaan pasaran dengan menyesuaikan tempoh MA;
  3. Kestabilan daripada lebih sedikit isyarat perdagangan;
  4. Pengendalian risiko yang berkesan melalui stop loss;
  5. Kemudahan pengoptimuman pada MA, parameter risiko dll.

Risiko

Terdapat juga beberapa risiko yang perlu dipertimbangkan:

  1. Crossover yang berlebihan dan kekerapan dagangan semasa pasaran terhad julat;
  2. PEM yang tertinggal mungkin terlepas titik pembalikan harga dan gagal menghentikan kerugian tepat pada masanya;
  3. Kerentanan terhadap pembocoran palsu yang mengakibatkan kerugian yang tidak perlu;
  4. Ketidaktepatan pengesanan harga umum disebabkan oleh kelewatan MA.

Kelemahan ini boleh dikurangkan melalui pengoptimuman seperti penapisan isyarat, penangguhan stop loss dll.

Peluang Peningkatan

Strategi ini boleh ditingkatkan dalam aspek seperti:

  1. Menambah penapis pada jumlah atau volatiliti untuk mengelakkan whipsaws;
  2. Ujian lebih banyak jenis MA dan tempoh/rumus penyuntingan halus untuk menyesuaikan produk dan jangka masa yang berbeza;
  3. Memeriksa jenis MA seperti EMA, LWMA untuk penjejakan harga yang paling pantas;
  4. Mengotomatiskan penyesuaian MA dan pengukuran kehilangan berhenti dengan pembelajaran mesin;
  5. Teknik stop loss alternatif contohnya jurang, harga purata, candelier.

Peningkatan ketara dalam kadar kemenangan, pulangan yang diselaraskan risiko dijangka dari peningkatan ini.

Kesimpulan

Secara keseluruhan, strategi crossover purata bergerak berganda menawarkan kesederhanaan, fleksibiliti dan risiko yang boleh dikawal. Kemudahan pelaksanaannya dan pengoptimumannya menjadikannya strategi kuantiti awal yang ideal. Dengan ujian dan penyesuaian berulang, ia mempunyai kelayakan untuk berkembang menjadi sistem yang kukuh dari masa ke masa.


/*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 lanjut