RSI 촛불 거래 전략

저자:차오장, 날짜: 2023-09-22 17:10:39
태그:

전반적인 설명

이 전략은 상대적 강도 지표 (RSI) 지표와 촛불 패턴을 결합하여 RSI가 과잉 구매 또는 과잉 판매 수준에 도달 할 때 트렌드를 따르는 입시 신호를 식별합니다.

어떻게 작동 합니까?

  1. RSI 값을 계산해 보세요. 70은 과잉 구매 라인이고 30은 과잉 판매 라인입니다.

  2. RSI가 30을 넘어서면 과잉판매 신호, RSI가 70을 넘어서면 과잉 구매 신호로 간주합니다.

  3. 위의 신호가 발생하면 현재 또는 이전 촛불이 흰색 / 검은색 marubozu, 망치 / 매달린 사람 등과 같은 특정 패턴을 형성하는지 확인하십시오.

  4. RSI 신호와 촛불 조건이 모두 충족되면 구매/판매 신호를 생성합니다.

  5. 이에 따라, 하머 같은 상승 패턴이 발생했을 때 과잉 판매 RSI를 구입하고, 쇼팅 스타 같은 하락 패턴이 발생했을 때 과잉 구매 RSI를 판매합니다.

  6. 입력 신호를 위해 핑세즈, 아침/ 저녁 별과 같은 복잡한 조합 패턴을 식별합니다.

  7. RSI가 중간선을 통과하면 출구 신호가 됩니다.

장점

  1. 지표와 패턴을 결합하면 가짜 신호를 필터링하고 입력 정확도를 향상시킵니다.

  2. 촛불 패턴은 중요한 트렌드 반전 지점을 보여줍니다.

  3. RSI가 과잉 구매/ 과잉 판매 신호를 표시하면 이기는 기회가 증가합니다.

  4. 더블/트리플 촛불 콤보는 더 강한 반전을 잡습니다.

  5. RSI는 중간선을 가로질러 수익을 올리는 데 도움이 됩니다.

위험성

  1. RSI 지연은 전환점을 놓칠 수 있습니다.

  2. 일부 촛불 신호는 약하고 잘못된 신호를 제공합니다.

  3. 최근 높은/저하를 기준으로 손해를 멈추지 않고, 통제되지 않은 손실을 위험합니다.

  4. 손해를 막지 않으면 큰 손해가 발생할 수 있습니다.

  5. 백테스트 데이터가 부족하면 매개 변수 최적화가 편향될 수 있습니다.

최적화

  1. MACD, 볼링거 밴드 같은 다른 필터를 추가합니다.

  2. 스톱 로스/프로프트 취득 트렌드 라인을 추가합니다.

  3. 백테스트 결과를 기반으로 RSI 매개 변수를 최적화합니다.

  4. 후속 정지, 구역 정지 등과 같은 정지를 강화합니다.

  5. 더 긴 데이터 세트를 테스트하여 매개 변수 안정성을 평가합니다.

  6. 다른 제품과 시장 체제에 대한 매개 변수를 조정합니다.

결론

이 전략은 트렌드 추종을 위해 과잉 구매 / 과잉 판매 전환점에 높은 품질의 신호를 입력하기 위해 RSI 및 촛불 패턴 인식의 강점을 통합합니다. 강력한 콤보 패턴은 확률을 향상시킵니다. 그러나 지연 및 잘못된 신호와 같은 위험이 남아 있으며 다른 기술과 추가 최적화를 필요로합니다. 전반적으로 여러 승리의 아이디어를 혼합하고 적절하게 매개 변수화되면 좋은 결과를 얻을 수 있습니다.


/*backtest
start: 2022-09-15 00:00:00
end: 2023-09-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

/////////////////////////////////////
//@version=2
//@author=sb
strategy("RSI-candlestick Strategy", overlay=true)
src = hlc3, len = input(14, minval=1, title="Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
//plot(rsi, color=purple)
//band1 = hline(70)
//band0 = hline(30)
//band2 = hline(50,linestyle=dotted,color=silver)
//fill(band1, band0, color=#cc99ff, transp=70)
//end premade RSI
oversold = rsi < 30
overbought = rsi > 70
barcolor(oversold? #7fff00 : overbought? red : na )
//
//
level_70 = 70
level_70rsi = rsi > level_70 ? rsi : level_70
level_30 = 30
level_30rsi = rsi < 30 ? rsi : level_30

level_50 = 50
//


//p1 = plot(series=level_70, color=red, linewidth=1, transp=100)
//p2 = plot(series=level_70rsi, color=red, linewidth=1, transp=100)
//p3 = plot(series=level_30, color=green, linewidth=1, transp=100)
//p4 = plot(series=level_30rsi, color=green, linewidth=1, transp=100)
//fill(p1, p2, color=red, transp=50)
//fill(p3, p4, color=#7fff00, transp=50)




/////////////////////////////////////


bullishcriteria = input(title="RSI Bullish Criteria",  defval=55, minval=50, maxval=100)
bearishcriteria = input(title="RSI Bearish Criteria",  defval=45, minval=0, maxval=50)

range = high - low
body = abs(close - open)
oc2 = min(close, open) + body/2
upperwick = high - max(open, close)
lowerwick = min(open, close) - low

isUp = close > open
isTrendUp = rsi(close, 14) >= bullishcriteria
isTrendDown = rsi(close, 14) <= bearishcriteria
isDoji = abs(close-open)/(high-low) < 0.05

// Single Candlestick Pattern
// white marubozu
wm = (isUp) and (upperwick <= 0.05*body) and (lowerwick <= 0.05*body) and isTrendDown
plotshape(wm, color=green, style=shape.triangleup, location=location.belowbar, title='white marubozu',text='wm')
if (not na(rsi))
    if (crossover(rsi, level_30) and (wm or wm[1]))
        strategy.entry("RsiLE", strategy.long, comment="RsiLE")
// black marubozu
bm = (not isUp) and (upperwick <= 0.05*body) and (lowerwick <= 0.05*body) and isTrendUp
plotshape(bm, color=red, style=shape.triangledown, location=location.abovebar, title='black marubozu',text='bm')

if (not na(rsi))
    if (crossunder(rsi, level_70)and (bm or bm[1]))
        strategy.entry("RsiSE", strategy.short, comment="RsiSE")
// hammer
h = (isUp) and (lowerwick >= 2*body) and (upperwick <= 0.1*body) and isTrendDown
plotshape(h, color=green, style=shape.triangleup, location=location.belowbar, title='hammer',text='h')

if (not na(rsi))
    if (crossover(rsi, level_30) and (h or h[1]))
        strategy.entry("RsiLE", strategy.long, comment="RsiLE")
// hanging man
hm = (not isUp) and (lowerwick >= 2*body) and (upperwick <= 0.1*body) and isTrendUp
plotshape(hm, color=red, style=shape.triangledown, location=location.abovebar, title='hanging man',text='hm')

if (not na(rsi))
    if (crossunder(rsi, level_70)and (hm or hm[1]))
        strategy.entry("RsiSE", strategy.short, comment="RsiSE")
        
// inverted hammer
ih = (isUp) and (upperwick >= 2*body) and (lowerwick <= 0.1*body) and isTrendDown
plotshape(ih, color=green, style=shape.triangleup, location=location.belowbar, title='inverted hammer',text='ih')

//if (not na(rsi))
//    if (crossover(rsi, level_30) and (ih or ih[1]))
//        strategy.entry("RsiLE", strategy.long, comment="RsiLE")
        
// shooting star
ss = (not isUp) and (upperwick >= 2*body) and (lowerwick <= 0.1*body) and isTrendUp
plotshape(ss, color=red, style=shape.triangledown, location=location.abovebar, title='shooting star',text='ss')

if (not na(rsi))
    if (crossunder(rsi, level_70)and (ss or ss[1]))
        strategy.entry("RsiSE", strategy.short, comment="RsiSE")
        
// Double Candlestick Pattern
// bullish engulfing
bulle = not isDoji[1] and (not isUp[1] and isUp) and (close > open[1] and open < close[1]) and isTrendDown
plotshape(bulle, color=green, style=shape.triangleup, location=location.belowbar, title='bullish engulfing', text='e')

// bearish engulfing
beare = not isDoji[1] and (isUp[1] and not isUp) and (open > close[1] and close < open[1]) and isTrendUp
plotshape(beare, color=red, style=shape.triangledown, location=location.abovebar, title='bearish engulfing',text='e')

// tweezer bottom
twb = (not isUp[1] and isUp) and (min(lowerwick,lowerwick[1])/max(lowerwick,lowerwick[1]) >= 0.99) and (min(low,low[1])/max(low,low[1]) >= 0.99) and isTrendDown
plotshape(twb, color=green, style=shape.triangleup, location=location.belowbar, title='tweezer bottom', text='tb')

if (not na(rsi))
    if (crossover(rsi, level_30) and (twb or twb[1]))
        strategy.entry("RsiLE", strategy.long, comment="RsiLE")
        
// tweezer top
twt = (isUp[1] and not isUp) and (min(upperwick,upperwick[1])/max(upperwick,upperwick[1]) >= 0.99) and (min(high,high[1])/max(high,high[1]) >= 0.99) and isTrendUp
plotshape(twt, color=red, style=shape.triangledown, location=location.abovebar, title='tweezer top',text='tt')

if (not na(rsi))
    if (crossunder(rsi, level_70)and (twt or twt[1]))
        strategy.entry("RsiSE", strategy.short, comment="RsiSE")
// Trible Candlestick Pattern
// three white soldier
tws = (not isUp[3] and isUp[2] and isUp[1] and isUp) and (body[1]>body[2]) and (upperwick<0.1*body and lowerwick<0.1*body) and isTrendDown
plotshape(tws, color=green, style=shape.triangleup, location=location.belowbar, title='three white soldiers',text='tws')

if (not na(rsi))
    if (crossover(rsi, level_30) and (tws or tws[1]))
        strategy.entry("RsiLE", strategy.long, comment="RsiLE")
        
// three black crows
tbc = (isUp[3] and not isUp[2] and not isUp[1] and not isUp) and (body[1]>body[2]) and (upperwick<0.1*body and lowerwick<0.1*body) and isTrendUp
plotshape(tbc, color=red, style=shape.triangledown, location=location.abovebar, title='three black crows',text='tbc')

if (not na(rsi))
    if (crossunder(rsi, level_70)and (tbc or tbc[1]))
        strategy.entry("RsiSE", strategy.short, comment="RsiSE")
        
// morning star
ms = (not isUp[1]) and (abs(close[1]-open[1])/(high[1]-low[1]) < 0.1) and (close > oc2[2] and close < open[2]) and isTrendDown
plotshape(ms, color=green, style=shape.triangleup, location=location.belowbar, title='morning star',text='ms')

if (not na(rsi))
    if (crossover(rsi, level_30) and (ms or ms[1]))
        strategy.entry("RsiLE", strategy.long, comment="RsiLE")
        
// evening star
es = (isUp[1]) and (abs(close[1]-open[1])/(high[1]-low[1]) < 0.1) and (close < oc2[2] and close > open[2]) and isTrendUp
plotshape(es, color=red, style=shape.triangledown, location=location.abovebar, title='evening star',text='es')

//if (not na(rsi))
//    if (crossunder(rsi, level_70)and (es or es[1]))
//        strategy.entry("RsiSE", strategy.short, comment="RsiSE")
        
// three inside up
tiu = (not isUp[2]) and (close[1] > oc2[2] and close[1] < open[2]) and (close > high[2]) and isTrendDown
plotshape(tiu, color=green, style=shape.triangleup, location=location.belowbar, title='three inside up',text='tiu')

if (not na(rsi))
    if (crossover(rsi, level_30) and (tiu or tiu[1]))
        strategy.entry("RsiLE", strategy.long, comment="RsiLE")
        
// three inside down
tid = (isUp[2]) and (close[1] < oc2[2] and close[1] > open[2]) and (close < low[2]) and isTrendUp
plotshape(tid, color=red, style=shape.triangledown, location=location.abovebar, title='three inside down',text='tid')

if (not na(rsi))
    if (crossunder(rsi, level_70)and (tid or tid[1]))
        strategy.entry("RsiSE", strategy.short, comment="RsiSE")
        
if (not na(rsi))
    if (crossover(rsi, level_70))
        //strategy.exit("RsiSE")
        //if(chk[1]==0 or chk[2]==0 or chk[3]==0 or chk[4]==0 or chk[5]==0 or chk[6]==0 or chk[7]==0 or chk[8]==0 or chk[9]==0 or chk[10]==0)
        //if(crossover(col[1],zero) or crossover(col[2],zero) or crossover(col[3],zero) or crossover(col[4],zero) or crossover(col[5],zero) or crossover(col[6],zero) or crossover(col[7],zero) or crossover(col[8],zero))
        //strategy.entry("RsiLE", strategy.long,0, comment="RsiLE")
        strategy.entry("RsiSE", strategy.short,0, comment="RsiSE")

    if (crossunder(rsi, level_30))
        //strategy.entry("RsiSE", strategy.short,0, comment="RsiSE")
        strategy.entry("RsiLE", strategy.long,0, comment="RsiLE")

//if (not na(rsi))
//    if (crossover(rsi, level_50))
        //strategy.exit("RsiSE")
        //if(chk[1]==0 or chk[2]==0 or chk[3]==0 or chk[4]==0 or chk[5]==0 or chk[6]==0 or chk[7]==0 or chk[8]==0 or chk[9]==0 or chk[10]==0)
        //if(crossover(col[1],zero) or crossover(col[2],zero) or crossover(col[3],zero) or crossover(col[4],zero) or crossover(col[5],zero) or crossover(col[6],zero) or crossover(col[7],zero) or crossover(col[8],zero))
//        strategy.entry("RsiSE", strategy.short,0, comment="RsiSE")
//    else
//        strategy.exit("RsiSE")
//    if (crossunder(rsi, level_50))
//        strategy.entry("RsiLE", strategy.long,0, comment="RsiLE")
//    else
//        strategy.exit("RsiLE")

더 많은