Esta estrategia combina el indicador del índice de fortaleza relativa (RSI) con patrones de velas para identificar señales de entrada de tendencia cuando el RSI alcanza niveles de sobrecompra o sobreventa.
Calcule los valores del RSI, con 70 como línea de sobrecompra y 30 como línea de sobreventa.
Considere el cruce del RSI por encima de 30 como una señal de sobreventa, y el cruce del RSI por debajo de 70 como una señal de sobrecompra.
Cuando ocurran las señales anteriores, compruebe si la vela actual o anterior forma patrones específicos como marubozu blanco / negro, martillo / hombre colgado, etc.
Si se cumplen tanto la señal RSI como la condición del candelero, se generan señales de compra/venta.
En consecuencia, comprar en RSI sobrevendido cuando se producen patrones alcistas como martillo, y vender en RSI sobrecomprado cuando se producen patrones bajistas como estrella fugaz.
Identificar patrones de combinación complejos como pinza, estrellas de la mañana / noche para las señales de entrada.
El RSI cruzando la línea media actúa como señal de salida.
La combinación de indicador y patrón filtra señales falsas y mejora la precisión de entrada.
El patrón de velas captura puntos significativos de inversión de tendencia.
Las señales de sobrecompra/sobreventa de RSI aumentan las oportunidades de ganar.
Las combinaciones de doble / triple candlestick atrapan inversiones más fuertes.
RSI cruza la línea media ayuda a bloquear las ganancias.
El retraso del RSI puede perder puntos de reversión.
Algunas señales del candelabro son débiles y dan señales falsas.
No hay stop loss basado en el reciente alto/bajo, riesgos de pérdida incontrolada.
No hay un stop loss, un gran movimiento adverso puede aumentar la pérdida.
Los datos de backtest insuficientes pueden sesgar la optimización de parámetros.
Añadir otros filtros como MACD, Bandas de Bollinger.
Añadir la línea de tendencia para la toma de pérdidas / ganancias.
Optimizar los parámetros de RSI basados en los resultados de las pruebas de retroceso.
Mejorar las paradas como paradas de trailing, paradas de zona, etc.
Prueba conjuntos de datos más largos para evaluar la robustez de los parámetros.
Ajustar los parámetros de los diferentes productos y regímenes de mercado.
Esta estrategia integra las fortalezas del RSI y el reconocimiento de patrones de velas para ingresar en señales de alta calidad en puntos de inflexión sobrecomprados / sobrevendidos para seguir la tendencia. Los patrones de combinación fuertes también mejoran las 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")