MACD와 RSI를 결합한 단기 거래 전략


생성 날짜: 2023-09-13 14:59:32 마지막으로 수정됨: 2023-09-13 14:59:32
복사: 0 클릭수: 684
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

이 전략은 MACD와 RSI를 결합한 단선 거래 전략이라고 불린다. 이 전략은 MACD와 RSI의 두 지표의 신호를 통합적으로 사용하여 단선 주기 내의 시장 변화를 포착하여 이익을 얻는다.

MACD는 지수 평평한 이동 평균이다. 그것은 빠른 라인, 느린 라인 및 기둥형 차차 라인으로 구성된다. 빠른 라인을 통과하면 느린 라인을 통과하면 단기 가격 변화를 나타내는 동력이 증가하기 시작하여 구매 신호를 생성한다. 빠른 라인을 통과하면 느린 라인을 통과하면 동력이 쇠퇴하여 판매 신호를 생성한다.

RSI는 상대적으로 강한 지표이다. 그것은 가격의 오버 바이 오버 소를 반영한다. RSI는 20보다 낮으면 오버 소이며, 80보다 높으면 오버 소이다. 오버 바이 지역은 가격 하락의 예고 신호이며, 오버 소 지역은 가격 반발의 예고 신호이다.

이 전략의 거래 신호는 두 부분으로 이루어져 있습니다.

첫째, MACD 빠른 느린 선 교차와 격리 기둥 변화. 격리 기둥이 마이너스에서 긍정으로 전환하면, 가격이 단기간에 성장 동력이 있음을 나타냅니다. 구매할 수 있습니다. 격리 기둥이 긍정에서 부정으로 전환하면, 동력이 약화되어 판매되어야합니다.

둘째, RSI의 과매매 과매매. RSI와 결합하면 MACD에서 발생하는 가짜 신호를 필터링 할 수 있습니다. RSI가 낮을 때만 구매하고 RSI가 높을 때 판매하면 성공률을 높일 수 있습니다.

이 전략의 장점은 두 가지 지표의 장점을 통합하여 거래 신호의 정확성을 향상시키는 것입니다. 단기 변동을 신속하게 포착하고 민감합니다. 그러나 MACD 및 RSI 파라미터는 과도한 거래를 피하기 위해 최적화해야합니다.

요약하자면, 이 전략은 짧은 선주기의 역동적인 거래에 적합하며, 시장의 단기 반동으로 인한 수익 기회를 잡을 수 있습니다. 그러나 적극적인 위험 관리 조치의 보조가 필요하며, 전략 매개 변수를 적시에 조정하기 위해 시장 움직임을 면밀히 추적해야합니다.

전략 소스 코드
/*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)