Strategi ini dinamakan
MACD bermaksud Moving Average Convergence Divergence. Ia terdiri daripada garisan pantas, garisan perlahan, dan histogram. Apabila garisan pantas melintasi di atas garisan perlahan, ia menandakan penguatan momentum harga jangka pendek dan menghasilkan isyarat beli. Apabila garisan pantas melintasi di bawah garisan perlahan, ia menandakan momentum melemah dan menghasilkan isyarat jual.
RSI bermaksud Indeks Kekuatan Relatif. Ia mencerminkan keadaan harga yang terlalu banyak dibeli dan terlalu banyak dijual. RSI di bawah 20 adalah terlalu banyak dijual, dan di atas 80 adalah terlalu banyak dibeli. Zon yang terlalu banyak dibeli adalah amaran penurunan harga yang berpotensi, sementara zon yang terlalu banyak dijual memberi amaran tentang potensi lompatan.
Isyarat perdagangan strategi ini datang dari dua aspek:
Pertama, persilangan garis MACD dan perubahan histogram. Apabila histogram berubah dari negatif menjadi positif, ia menunjukkan peningkatan momentum harga dalam jangka pendek, menunjukkan peluang untuk membeli. Apabila histogram berubah dari positif kepada negatif, ia menunjukkan momentum memudar dan mencadangkan penjualan.
Kedua, tahap RSI overbought/oversold. Menggabungkan RSI membantu menapis beberapa isyarat palsu dari MACD. Membeli hanya apabila RSI rendah dan menjual hanya apabila RSI tinggi meningkatkan ketepatan.
Kelebihan strategi ini adalah menggabungkan kekuatan kedua-dua penunjuk untuk isyarat perdagangan yang lebih tepat, dan menangkap turun naik jangka pendek dengan sensitif. Tetapi parameter MACD dan RSI memerlukan pengoptimuman untuk mengelakkan perdagangan berlebihan. Tahap stop loss juga perlu munasabah untuk mengawal kerugian perdagangan tunggal.
Ringkasnya, strategi ini sesuai dengan perdagangan jangka pendek yang lincah, menangkap peluang keuntungan dari pembalikan jangka pendek.
/*backtest start: 2022-09-06 00:00:00 end: 2023-09-12 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Uraynium V3", overlay=false, pyramiding = 0, calc_on_every_tick=true, precision=1, currency="USD", default_qty_value=10, default_qty_type=strategy.cash,initial_capital=100,commission_type=strategy.commission.percent,commission_value=0.1) // === INPUT BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2019, title = "From Year", minval = 2017) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 2020, title = "To Year", minval = 2017) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window inTimeframe() => true overSold = input( 20 , minval = 1, title = "RSI Oversold") overBought = input( 80 , minval = 1, title = "RSI Overbought") rsiLength = input(14, minval = 1, title = "RSI Length") fastLength = input(12, minval = 1, title = "MACD fast") slowlength = input(26, minval = 1, title = "MACD slow") MACDLength = input( 9, minval = 1, title = "MACD length") stopLoss = input( 10, minval = 1, title = "Stop Loss (price %)") takeProfit = input( 50, minval = 1, title = "Take Profit (price %)") triggerPosLvl = input( 2, minval = 1 ,title ="Take Position Threshold", type=input.float) src = close // === CALC === stopLossValue = close*(stopLoss/100)/syminfo.mintick takeProfitValue = close*(takeProfit/100)/syminfo.mintick vrsi = rsi(src, rsiLength) //avgRSI = vrsi*0.5 + vrsi[1]*0.25 + vrsi[2]*0.125 + vrsi[3]*0.0625 avgRSI = (4*vrsi + 3*vrsi + 2*vrsi[2] + vrsi[3])/10 [macdLine, signalLine, histLine] = macd(src, fastLength, slowlength, MACDLength) MACDdelta = signalLine - macdLine isMACDRunLong = signalLine > macdLine isMACDRunShort = macdLine < signalLine isMACDSwitchLong = crossover(MACDdelta, 0) isMACDSwitchShort = crossunder(MACDdelta, 0) isMACDCross = crossover(MACDdelta, 0) or crossunder(MACDdelta, 0) buySignal = (histLine-histLine[1]) + (avgRSI - avgRSI[1]) // === ACTION === isPosLong = strategy.position_size > 0 isPosShort = strategy.position_size < 0 isNoMarginPos= strategy.position_size == 0 entryLong = (isNoMarginPos or isPosShort) and ( buySignal > triggerPosLvl ) entryShort = (isNoMarginPos or isPosLong ) and ( buySignal < -triggerPosLvl ) if inTimeframe() strategy.entry("Long" , strategy.long, comment="Entry Long", when=entryLong ) strategy.entry("Short", strategy.short, comment="Entry Short", when=entryShort) strategy.entry("Long" , strategy.long, comment="Switch Long", when=entryLong) strategy.entry("Short", strategy.short, comment="Switch Short",when=entryShort) strategy.exit("Stop (long SL/TP)", loss=stopLossValue, profit=takeProfitValue, when=entryLong ) strategy.exit("Stop (short SL/TP)", loss=stopLossValue, profit=takeProfitValue, when=entryShort) strategy.close("Long" , when=entryShort) strategy.close("Short", when=entryLong) // === DRAW === posColor = isNoMarginPos ? color.black : isPosLong ? color.green : color.red plot(100, color=posColor,style=plot.style_area, transp=90, histbase=0) plot(buySignal+overBought, color=color.green) plot(50+macdLine/4, color=color.yellow) plot(50+signalLine/4, color=color.orange) histColor = histLine[1]-histLine > 0 ? color.red : color.green plot(overSold+histLine/2, color=histColor, style=plot.style_histogram, histbase=overSold, transp=50, linewidth=2) rsicolor = avgRSI>overBought ? color.red : avgRSI<overSold ? color.green : color.blue plot(avgRSI,color=rsicolor, linewidth=2) //plot(vrsi,color=color.purple, linewidth=2) hline(overBought, color=color.red) hline(overSold, color=color.green) hline(50, color=color.gray)