
El indicador RSI de divergencia por vacío es una estrategia de negociación cuantitativa basada en un indicador relativamente fuerte (RSI). Se utiliza para analizar la divergencia entre el indicador RSI y el precio y encontrar oportunidades de reversión de la tendencia de los precios, con el objetivo de comprar y vender.
El indicador central de esta estrategia es el RSI. Analiza la divergencia entre el indicador RSI y el precio. La divergencia entre el indicador RSI y el precio es una señal inversa.
En concreto, cuando el RSI forma bajos más bajos y los precios forman bajos más altos, es la divergencia de varios extremos entre el RSI y el precio. Esto indica que el precio puede revertir hacia arriba. La estrategia establece posiciones de varios extremos en este momento.
Por el contrario, cuando el RSI forma un punto alto más alto y el precio forma un punto alto más bajo, es la divergencia de cabeza entre el RSI y el precio. Esto indica que el precio puede revertir la caída. La estrategia establece una posición de cabeza en este momento.
Al capturar estos puntos de discrepancia entre el RSI y el precio, la estrategia puede detectar oportunidades de reversión de precios a tiempo y lograr una venta baja y alta.
Las estrategias de diferenciación de la RSI con más vacío tienen las siguientes ventajas:
La captura de los puntos de inflexión de precios es muy eficaz. El RSI y la divergencia de los precios suelen ser señales de una inminente reversión de la tendencia.
Realización de compras bajas y ventas altas. Construir posiciones a través de puntos de divergencia, para poder comprar en puntos relativamente bajos y vender en puntos relativamente altos, de acuerdo con las mejores prácticas de operaciones cuantitativas.
La estrategia RSI tradicional se enfoca en las zonas de sobreventa y sobrecompra. La estrategia RSI tradicional utiliza el carácter inverso del indicador RSI para capturar los puntos de inflexión con mayor precisión. La eficiencia de la estrategia ha aumentado considerablemente.
La configuración de los parámetros es sencilla. Los parámetros principales son solo el ciclo RSI y el intervalo de retrospectiva, dos, muy simples y fáciles de optimizar.
La estrategia de discrepancia en el RSI también tiene ciertos riesgos:
Las señales de dispersión pueden ser falsas. La divergencia entre el RSI y el precio no necesariamente conduce a una verdadera reversión del precio. A veces también se forma una falsa reversión.
Cuando el precio de las acciones se mueve en una dirección clara, el espacio de ganancia de la estrategia es relativamente pequeño. En este caso, es mejor suspender la estrategia y esperar a que se produzca una nueva situación de crisis.
Riesgo de recuperación. La estrategia establece parámetros de recuperación que pueden acelerar la pérdida de la cuenta si se enfrentan a varias operaciones perdedoras. Esto requiere el control del tamaño de la posición y el punto de parada para reducir el riesgo.
La estrategia también puede ser optimizada en los siguientes aspectos:
En combinación con otros indicadores de filtración de señales. Se pueden agregar otros indicadores como MACD, KDJ, etc., para verificar los puntos de divergencia del RSI, filtrar algunas señales falsas y mejorar la tasa de victoria de la estrategia.
Optimización de los parámetros del RSI. Se pueden probar diferentes parámetros del ciclo del RSI para encontrar la configuración del ciclo del RSI que mejor coincida con las características de la variedad. Generalmente, entre 6 y 15 es el mejor resultado.
Optimización del intervalo de revisiones. El intervalo de revisiones afecta directamente a la frecuencia de las operaciones de la estrategia. Se pueden probar diferentes parámetros para encontrar la frecuencia óptima.
Aumentar la estrategia de parada de pérdidas. Se puede establecer una lógica de parada de pérdidas razonable de acuerdo con el ATR, la parada móvil, etc. La parada rápida en caso de pérdidas puede controlar eficazmente el riesgo de la estrategia.
La estrategia de divergencia de RSI de varios huecos capta con precisión los puntos de inflexión de los cambios de precio mediante el análisis de la inversin de los indicadores de RSI mismos. Implementa una estrategia de negociación de compra y venta baja. En comparación con la estrategia de compra y venta de RSI en el sentido tradicional, utiliza características de RSI más refinadas y primitivas, lo que mejora considerablemente la eficiencia de la estrategia.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//study(title="Divergence Indicator", format=format.price)
//GOOGL setting 5 , close, 3 , 1 profitLevel at 75 shows win rate 87.21 % profit factor 7.059
//GOOGL setting 8 , close, 3 , 1 profitLevel at 80 shows win rate 86.57 % profit factor 18.96
//SPY setting 5, close , 3, 3 profitLevel at 70 , shows win rate 80.34% profit factor 2.348
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=9)
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)
//useTrailStopLoss = input(false, title="Use Trailing Stop Loss")
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.purple
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=#8D1699)
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=#9915FF, 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
// Calculate start/end date and time condition
startDate = input(timestamp("2019-01-01T00:00:00"), type = input.time)
finishDate = input(timestamp("2021-01-01T00:00:00"), type = input.time)
time_cond = time >= startDate and time <= finishDate