Esta estrategia determina posiciones largas y cortas mediante el cálculo del indicador RSI y los cruces entre las líneas RSI EMA, combinados con divergencias entre el RSI y el precio para encontrar señales comerciales potenciales.
Calcular el indicador RSI de 14 períodos, el RSI que cruza por encima de 50 es señal de compra y el cruce por debajo de 50 es señal de venta.
Calcular la EMA de 20 períodos y la EMA de 14 períodos del RSI, cruzar la EMA rápida por encima de la EMA lenta es señal de compra y cruzar por debajo es señal de venta.
Detectar divergencias entre el RSI y el precio:
Divergencia alcista regular: el precio alcanza un nuevo mínimo pero el RSI no, señal de compra
Divergencia alcista oculta: el precio alcanza un nuevo máximo, pero el RSI no, compra señal
Divergencia bajista regular: el precio alcanza un nuevo máximo, pero el RSI no, señal de venta
Divergencia bajista oculta: el precio alcanza un nuevo mínimo pero el RSI no, señal de venta
El indicador RSI es bueno para detectar situaciones de sobrecompra y sobreventa.
Las divergencias entre el RSI y el precio pueden proporcionar señales tempranas de reversión.
La combinación de señales de dos indicadores puede validarse mutuamente y mejorar la estabilidad de la estrategia.
Los mecanismos de stop loss controlan las pérdidas de una sola operación.
Como indicador de impulso, el RSI puede tener un rendimiento inferior cuando el precio fluctúa violentamente.
Las EMA tienen un retraso de tiempo y no pueden localizar con precisión los puntos de inflexión.
Las señales de divergencia pueden producir señales falsas cuando la tendencia continúa.
La configuración incorrecta de stop loss puede causar pérdidas innecesarias.
La reducción puede ser grande, se necesita suficiente capital.
Prueba diferentes parámetros para el cálculo del RSI y de la EMA para encontrar combinaciones óptimas.
Considere la posibilidad de reemplazar la EMA por otros indicadores como el MACD para optimizar el conjunto.
Añadir mecanismos de confirmación para evitar divergencias falsas, por ejemplo, que requieren señales consecutivas.
Agregue estrategias de toma de ganancias para bloquear las ganancias.
Incorporar señales a corto plazo como patrones de candlestick para la entrada, combinado con el juicio de tendencia de esta estrategia.
Esta estrategia integra la detección de sobrecompra / sobreventa de RSI, el seguimiento de tendencias con EMA y la predicción de la inversión de divergencias en un sistema sistemático de seguimiento de tendencias. Con el ajuste de parámetros y la optimización del conjunto, se pueden lograr buenos resultados.
/*backtest start: 2023-11-08 00:00:00 end: 2023-11-15 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="RSI Divergence Indicator", overlay=false,pyramiding=2, default_qty_value=2, default_qty_type=strategy.fixed, initial_capital=10000, currency=currency.USD) len = input(title="RSI Period", minval=1, defval=14) src = input(title="RSI Source", defval=close) lbR = input(title="Pivot Lookback Right", defval=3) lbL = input(title="Pivot Lookback Left", defval=1) takeProfitRSILevel = input(title="Take Profit at RSI Level", minval=70, defval=80) rangeUpper = input(title="Max of Lookback Range", defval=60) rangeLower = input(title="Min of Lookback Range", defval=5) plotBull = input(title="Plot Bullish", defval=true) plotHiddenBull = input(title="Plot Hidden Bullish", defval=true) plotBear = input(title="Plot Bearish", defval=true) plotHiddenBear = input(title="Plot Hidden Bearish", defval=false) sl_type = input("NONE", title="Trailing StopLoss Type", options=['ATR','PERC', 'NONE']) stopLoss = input(title="Stop Loss%", defval=5, minval=1) atrLength=input(14, title="ATR Length (for Trailing stop loss)") atrMultiplier=input(3.5, title="ATR Multiplier (for Trailing stop loss)") bearColor = color.red bullColor = color.green hiddenBullColor = color.new(color.green, 80) hiddenBearColor = color.new(color.red, 80) textColor = color.white noneColor = color.new(color.white, 100) osc = rsi(src, len) plot(osc, title="RSI", linewidth=2, color=color.white) hline(50, title="Middle Line", linestyle=hline.style_dotted) obLevel = hline(70, title="Overbought", linestyle=hline.style_dotted) osLevel = hline(30, title="Oversold", linestyle=hline.style_dotted) fill(obLevel, osLevel, title="Background", color=color.gray, transp=90) plFound = na(pivotlow(osc, lbL, lbR)) ? false : true phFound = na(pivothigh(osc, lbL, lbR)) ? false : true _inRange(cond) => bars = barssince(cond == true) rangeLower <= bars and bars <= rangeUpper //------------------------------------------------------------------------------ // Regular Bullish // Osc: Higher Low oscHL = osc[lbR] > valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1]) // Price: Lower Low priceLL = low[lbR] < valuewhen(plFound, low[lbR], 1) bullCond = plotBull and priceLL and oscHL and plFound plot( plFound ? osc[lbR] : na, offset=-lbR, title="Regular Bullish", linewidth=2, color=(bullCond ? bullColor : noneColor), transp=0 ) plotshape( bullCond ? osc[lbR] : na, offset=-lbR, title="Regular Bullish Label", text=" Bull ", style=shape.labelup, location=location.absolute, color=bullColor, textcolor=textColor, transp=0 ) //------------------------------------------------------------------------------ // Hidden Bullish // Osc: Lower Low oscLL = osc[lbR] < valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1]) // Price: Higher Low priceHL = low[lbR] > valuewhen(plFound, low[lbR], 1) hiddenBullCond = plotHiddenBull and priceHL and oscLL and plFound plot( plFound ? osc[lbR] : na, offset=-lbR, title="Hidden Bullish", linewidth=2, color=(hiddenBullCond ? hiddenBullColor : noneColor), transp=0 ) plotshape( hiddenBullCond ? osc[lbR] : na, offset=-lbR, title="Hidden Bullish Label", text=" H Bull ", style=shape.labelup, location=location.absolute, color=bullColor, textcolor=textColor, transp=0 ) longCondition=bullCond or hiddenBullCond //? osc[lbR] : na //hiddenBullCond strategy.entry(id="RSIDivLE", long=true, when=longCondition) //Trailing StopLoss ////// Calculate trailing SL ///////////////////////////////////////////////////// sl_val = sl_type == "ATR" ? stopLoss * atr(atrLength) : sl_type == "PERC" ? close * stopLoss / 100 : 0.00 trailing_sl = 0.0 trailing_sl := strategy.position_size>=1 ? max(low - sl_val, nz(trailing_sl[1])) : na //draw initil stop loss //plot(strategy.position_size>=1 ? trailing_sl : na, color = color.blue , style=plot.style_linebr, linewidth = 2, title = "stop loss") //plot(trailing_sl, title="ATR Trailing Stop Loss", style=plot.style_linebr, linewidth=1, color=color.purple, transp=30) //Trailing StopLoss ////// Calculate trailing SL ///////////////////////////////////////////////////// //------------------------------------------------------------------------------ // Regular Bearish // Osc: Lower High oscLH = osc[lbR] < valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1]) // Price: Higher High priceHH = high[lbR] > valuewhen(phFound, high[lbR], 1) bearCond = plotBear and priceHH and oscLH and phFound plot( phFound ? osc[lbR] : na, offset=-lbR, title="Regular Bearish", linewidth=2, color=(bearCond ? bearColor : noneColor), transp=0 ) plotshape( bearCond ? osc[lbR] : na, offset=-lbR, title="Regular Bearish Label", text=" Bear ", style=shape.labeldown, location=location.absolute, color=bearColor, textcolor=textColor, transp=0 ) //------------------------------------------------------------------------------ // Hidden Bearish // Osc: Higher High oscHH = osc[lbR] > valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1]) // Price: Lower High priceLH = high[lbR] < valuewhen(phFound, high[lbR], 1) hiddenBearCond = plotHiddenBear and priceLH and oscHH and phFound plot( phFound ? osc[lbR] : na, offset=-lbR, title="Hidden Bearish", linewidth=2, color=(hiddenBearCond ? hiddenBearColor : noneColor), transp=0 ) plotshape( hiddenBearCond ? osc[lbR] : na, offset=-lbR, title="Hidden Bearish Label", text=" H Bear ", style=shape.labeldown, location=location.absolute, color=bearColor, textcolor=textColor, transp=0 ) longCloseCondition=crossover(osc,takeProfitRSILevel) or bearCond strategy.close(id="RSIDivLE", comment="Close All="+tostring(close - strategy.position_avg_price, "####.##"), when= abs(strategy.position_size)>=1 and sl_type == "NONE" and longCloseCondition) //close all on stop loss strategy.close(id="RSIDivLE", comment="TSL="+tostring(close - strategy.position_avg_price, "####.##"), when=abs(strategy.position_size)>=1 and (sl_type == "PERC" or sl_type == "ATR" ) and crossunder(close, trailing_sl) ) //close<ema55 and rsi5Val<20 //ema34<ema55 //close<ema89 src1 = close, len6 = input(14, minval=1, title="RSI Length") len7 = input(20, minval=1, title="EMA of RSI Length") len8 = input(14,minval=1, title="Fast EMA") up = rma(max(change(src1), 0), len6) down = rma(-min(change(src1), 0), len6) rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down)) emaRSI = ema(rsi,len7) fastEmaRSI=ema(rsi,len8) plot(emaRSI, title="EMA of RSI", linewidth=1, color=color.red) plot(fastEmaRSI,title="Fast EMA of RSI", linewidth=1,color = color.lime) band1 = hline(80, title="Upper Line", linewidth=1, color=color.red) band0 = hline(20, title="Lower Line", linewidth=1, color=color.lime) fill(band1, band0, color=color.purple)