
La estrategia de reversión de tendencia RSI es una estrategia de negociación cuantitativa basada en un índice relativamente débil (RSI) y una amplitud real promedio (ATR). La estrategia se adapta a las rápidas fluctuaciones del mercado mediante el ajuste dinámico de la parada de parada (TP / SL) para capturar oportunidades de reversión de tendencia. La estrategia tiene el RSI como núcleo, mide la volatilidad en combinación con el ATR, y construye los siguientes dos bandos dinámicos de adaptación como base para abrir posiciones de equilibrio.
El núcleo de la estrategia de reversión de la tendencia RSI está en la construcción de bandas de stop loss dinámicas. Primero, utiliza las funciones personalizadas de más alto_custom y más bajo_custom para encontrar el precio más alto y el precio más bajo desde el último cruce, formando la base de la banda. Luego, calcula el RSI y el ATR de longitud, respectivamente, y luego realiza el siguiente cálculo:
El multiplicador es un factor de expansión de la banda personalizada por el usuario. Si el precio se eleva hacia arriba, se hace más, y si se cae hacia abajo, se hace vacío. Además, el color de las dos bandas también cambia según la posición de la banda relativa del precio, para facilitar la observación.
La estrategia de reversión de tendencia RSI utiliza el RSI y el ATR para construir bandas de adaptación y puede ajustar dinámicamente los puntos de parada y pérdida para responder a los cambios en el mercado. La lógica de la estrategia es clara y tiene un amplio rango de aplicaciones, y puede ser una herramienta poderosa para los operadores cuantitativos.
/*backtest
start: 2023-04-22 00:00:00
end: 2024-04-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("RSI Trend Reversal", overlay=true, max_bars_back = 4999, calc_on_every_tick = false)
//INPUTS
rsi_length = input.int(title = "Lenght", defval = 8)
rsi_mult = input.float(title = "Multiplier", defval = 1.5, step = .05)
lookback = input.int(title = "Delay to prevent idealization", defval = 1)
sltp = input.float(title = "Minimum Difference", defval = 10)
src = input.source(title = "Source Input", defval = close)
//PARAMETERS INITILIZATION
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)
//FUNCTION INITILIZATION
highest_custom(src, length) =>
x = src
for i = 0 to length
if src[i] > x
x := src[i]
x
lowest_custom(src, length) =>
x = src
for i = 0 to length
if src[i] < x
x := src[i]
x
rsilev(src, length, mult, sltp) =>
sl = (100 - sltp) / 100
tp = (100 + sltp) / 100
var bool crossup = na
var bool crossdown = na
var float dir = na
dir_change = ta.change(dir)
var float BearGuy = 0
BullGuy = ta.barssince(crossup or crossdown)
if na(BullGuy)
BearGuy += 1
else
BearGuy := BullGuy
var float upper = na
var float lower = na
rsilower = ta.rsi(src, length)
rsiupper = math.abs(ta.rsi(src, length) - 100)
atr = ta.atr(length) / src
lower := highest_custom(math.max(highest_custom(highest_custom(src, BearGuy) * (1 - (atr + ((1 / (rsilower) * mult)))), BearGuy), src * sl), BearGuy)
upper := lowest_custom(math.min(lowest_custom(lowest_custom(src, BearGuy) * (1 + (atr + ((1 / (rsiupper) * mult)))), BearGuy), src * tp), BearGuy)
var float thresh = na
if na(thresh)
thresh := lower
if na(dir)
dir := 1
if crossdown
dir := -1
if crossup
dir := 1
if dir == 1
thresh := lower
if dir == -1
thresh := upper
crossup := ta.crossover(src, thresh)
crossdown := ta.crossunder(src, thresh)
thresh
rsiclose = rsilev(hclose, rsi_length, rsi_mult, sltp)
//PLOTTING
var color col = color.lime
if hclose > rsiclose
col := color.lime
if hclose < rsiclose
col := color.red
plot(rsiclose, linewidth = 2, color = col)
//STRATEGY
buy = ta.crossover(hclose, rsiclose)
sell = ta.crossunder(hclose, rsiclose)
if buy[lookback]
strategy.entry("long", strategy.long)
if sell[lookback]
strategy.entry("Short", strategy.short)