Strategi Dagangan Jangka Pendek Mengintegrasikan MACD dan RSI

Penulis:ChaoZhang, Tarikh: 2023-09-13 14:59:32
Tag:

Strategi ini dinamakan Strategi Dagangan Jangka Pendek Mengintegrasikan MACD dan RSI. Ia menggabungkan isyarat dari penunjuk MACD dan RSI untuk menangkap turun naik pasaran dalam jangka masa pendek untuk keuntungan.

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)


Lebih lanjut