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.
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.
Strategi MA berganda mempunyai kelebihan berikut:
Terdapat juga beberapa risiko yang perlu dipertimbangkan:
Kelemahan ini boleh dikurangkan melalui pengoptimuman seperti penapisan isyarat, penangguhan stop loss dll.
Strategi ini boleh ditingkatkan dalam aspek seperti:
Peningkatan ketara dalam kadar kemenangan, pulangan yang diselaraskan risiko dijangka dari peningkatan ini.
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)