Chiến lược giao dịch ngắn hạn kết hợp MACD và RSI


Ngày tạo: 2023-09-13 14:59:32 sửa đổi lần cuối: 2023-09-13 14:59:32
sao chép: 0 Số nhấp chuột: 684
1
tập trung vào
1617
Người theo dõi

Chiến lược này được gọi là chiến lược giao dịch đường ngắn kết hợp MACD và RSI. Chiến lược này sử dụng tổng hợp các tín hiệu của cả hai chỉ số MACD và RSI để nắm bắt sự thay đổi của thị trường trong chu kỳ đường ngắn để kiếm lợi nhuận.

MACD là đường trung bình di chuyển trơn chỉ số. Nó bao gồm đường nhanh, đường chậm và đường chênh lệch cột. Khi đường nhanh đi qua đường chậm, động lực đại diện cho biến động giá ngắn hạn bắt đầu tăng lên, tạo ra tín hiệu mua; khi đường nhanh đi qua đường chậm, động lực suy giảm, tạo ra tín hiệu bán.

RSI là một chỉ số tương đối mạnh mẽ. Nó phản ánh tình trạng mua và bán quá mức của giá. RSI thấp hơn 20 là bán quá mức, cao hơn 80 là mua quá mức. Vùng mua quá mức là cảnh báo giá giảm; Vùng bán quá mức là cảnh báo giá sẽ tăng.

Các tín hiệu giao dịch của chiến lược này có hai phần:

Thứ nhất, MACD nhanh chậm dòng giao nhau và chênh lệch từ cột thay đổi. Khi chênh lệch từ cột chuyển từ âm sang dương, cho thấy giá có động lực tăng trưởng trong thời gian ngắn, có thể mua. Khi chênh lệch từ cột chuyển từ dương sang âm, cho thấy động lực giảm, nên bán.

Thứ hai, RSI mua quá mức bán quá mức. Kết hợp với RSI có thể lọc một số tín hiệu giả tạo bởi MACD. Chỉ mua khi RSI thấp, bán khi RSI cao, có thể tăng tỷ lệ thành công.

Lợi thế của chiến lược này là tích hợp lợi thế của hai chỉ số, cải thiện độ chính xác của tín hiệu giao dịch. Chụp chuyển động ngắn hạn kịp thời, có độ nhạy. Tuy nhiên, các tham số MACD và RSI cần được tối ưu hóa để tránh giao dịch quá mức.

Tóm lại, chiến lược này phù hợp với giao dịch động trong chu kỳ ngắn, có thể nắm bắt cơ hội lợi nhuận từ sự đảo ngược ngắn hạn của thị trường. Tuy nhiên, cần có các biện pháp quản lý rủi ro tích cực và theo dõi chặt chẽ xu hướng thị trường để điều chỉnh các tham số chiến lược kịp thời.

Mã nguồn chiến lược
/*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)