Esta estratégia combina o indicador Relative Strength Index (RSI) com padrões de velas para identificar sinais de entrada de tendência quando o RSI atinge níveis de sobrecompra ou sobrevenda.
Calcule os valores do RSI, com 70 como linha de sobrecompra e 30 como linha de sobrevenda.
Considere o cruzamento do RSI acima de 30 como sinal de sobrevenda e o cruzamento do RSI abaixo de 70 como sinal de sobrecompra.
Quando ocorrem os sinais acima, verifique se a vela atual ou anterior forma padrões específicos como marubozu branco/preto, martelo/homem pendurado etc.
Se ambos os sinais RSI e condição do candelabro estiverem preenchidos, gerar sinais de compra/venda.
Correspondentemente, compre no RSI sobrevendido quando ocorrem padrões de alta, como martelo, e venda no RSI sobrecomprado quando ocorrem padrões de baixa, como estrela cadente.
Identificar padrões de combinação complexos como pinça, estrelas da manhã/noite para sinais de entrada.
O RSI atravessando a linha média atua como sinal de saída.
Combinar indicador e padrão filtra sinais falsos e melhora a precisão de entrada.
O padrão do candelabro capta pontos significativos de reversão da tendência.
Os sinais de sobrecompra/supervenda do RSI aumentam as oportunidades de ganhar.
Combinações de candelabro duplo/triplo captam inversões mais fortes.
O RSI cruza a linha média e ajuda a garantir lucros.
O atraso do RSI pode perder pontos de reversão.
Alguns sinais de candelabro são fracos e dão sinais falsos.
Não haverá stop loss com base em altas/baixas recentes, riscos de perda descontrolada.
Sem stop loss, um grande movimento adverso pode aumentar a perda.
Os dados insuficientes dos backtests podem prejudicar a otimização dos parâmetros.
Adicione outros filtros como MACD, Bollinger Bands.
Adicionar a linha de tendência para o stop loss/take profit.
Otimizar os parâmetros do RSI com base nos resultados dos backtests.
Melhorar as paradas, como paradas traseiras, paradas de zona, etc.
Teste conjuntos de dados mais longos para avaliar a robustez dos parâmetros.
Ajustar parâmetros para diferentes produtos e regimes de mercado.
Esta estratégia integra os pontos fortes do RSI e do reconhecimento de padrões de velas para entrar em sinais de alta qualidade em pontos de virada de sobrecompra / sobrevenda para seguir a tendência. Padrões de combinação fortes também melhoram as probabilidades.
/*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")