Strategi ini dipanggil strategi perdagangan garis pendek yang menggabungkan MACD dan RSI. Strategi ini menggunakan gabungan isyarat kedua-dua indikator MACD dan RSI untuk menangkap perubahan pasaran dalam tempoh garis pendek untuk mendapatkan keuntungan.
MACD adalah rata-rata bergerak indeks yang lancar. Ia terdiri daripada garis cepat, garis perlahan, dan garis pemisahan pilar. Apabila ia melintasi garis perlahan pada garis cepat, tenaga bergerak yang mewakili perubahan harga jangka pendek mula meningkat, menghasilkan isyarat beli; apabila ia melintasi garis perlahan di bawah garis cepat, tenaga bergerak menurun, menghasilkan isyarat jual.
RSI adalah penunjuk kekuatan dan kelemahan relatif. Ia mencerminkan keadaan harga yang lebih baik daripada harga yang lebih baik. RSI di bawah 20 adalah lebih baik daripada harga yang lebih baik, dan di atas 80 adalah lebih baik daripada harga yang lebih baik.
Isyarat perdagangan dalam strategi ini berasal dari dua bahagian:
Pertama, MACD cepat perlahan garis bersilang dan selang dari tiang perubahan. Apabila selang dari tiang bertukar dari negatif ke positif, menunjukkan harga dalam jangka pendek terdapat pertumbuhan tenaga, boleh dibeli. Apabila selang dari tiang bertukar dari positif ke negatif, menunjukkan tenaga berkurang, harus dijual.
Kedua, RSI overbuy oversell. Dengan menggabungkan RSI, anda boleh menyaring sebahagian daripada isyarat palsu yang dihasilkan oleh MACD. Hanya membeli ketika RSI rendah dan menjual ketika RSI tinggi dapat meningkatkan kadar kejayaan.
Kelebihan strategi ini adalah menggabungkan kelebihan kedua-dua petunjuk, meningkatkan ketepatan isyarat perdagangan. Ia menangkap perubahan jangka pendek tepat pada masanya dan mempunyai kepekaan. Tetapi parameter MACD dan RSI perlu dioptimumkan untuk mengelakkan perdagangan berlebihan.
Ringkasnya, strategi ini sesuai untuk perdagangan dinamik dalam kitaran garis pendek, yang dapat menangkap peluang keuntungan yang dibawa oleh perubahan jangka pendek di pasaran. Namun, langkah-langkah pengurusan risiko yang aktif diperlukan untuk membantu dan mengikuti pergerakan pasaran dengan teliti, untuk menyesuaikan parameter strategi tepat pada masanya.
/*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)