
La estrategia de índice de fuerza relativa de promedio móvil es una estrategia de negociación cuantitativa que utiliza tanto promedios móviles como indicadores de fuerza relativa como señales de negociación. La estrategia genera señales de negociación para capturar oportunidades en las tendencias del mercado mediante la comparación de precios de promedios móviles y valores de indicadores de fuerza relativa.
La estrategia se basa principalmente en dos indicadores:
La lógica central de la estrategia es la siguiente:
Cuando la línea del indicador RSI está por debajo de la media móvil, es una zona de sobreventa, se considera que las acciones están infravaloradas y generan una señal de compra; cuando la línea del indicador RSI está por encima de la media móvil, es una zona de sobreventa, se considera que las acciones están sobrevaloradas y generan una señal de venta.
Es decir, el promedio móvil refleja el valor justo de las acciones hasta cierto punto, y el RSI representa la fortaleza y la debilidad actuales de las acciones. Si el RSI está por encima o por debajo del promedio móvil, significa que existe la posibilidad de una reversión.
En concreto, la estrategia genera señales de negociación a través de los siguientes pasos:
Esta estrategia combina la tendencia de los promedios móviles con la tendencia de las compras y ventas excesivas del RSI, aprovechando las ventajas de los diferentes indicadores para determinar con eficacia el punto de inflexión del mercado.
Las principales ventajas son:
La estrategia también tiene sus riesgos:
Para controlar el riesgo, se puede optimizar de la siguiente manera:
La estrategia también puede ser mejorada en otras áreas, como:
La estabilidad y la rentabilidad de la estrategia se pueden mejorar continuamente a través de optimización de parámetros, optimización de indicadores y optimización de la gestión de riesgos.
Las estrategias de medias móviles y indicadores relativamente fuertes utilizan al mismo tiempo el juicio de tendencias de precios y el juicio de sobreventa y sobreventa para determinar con eficacia los puntos de inflexión del mercado y aprovechar las oportunidades de reversión. La estrategia es sencilla, práctica, controlada por el riesgo y es una estrategia de comercio cuantitativa práctica.
/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-24 06:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy(title = "RSI versus SMA", shorttitle = "RSI vs SMA", overlay = false, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, currency = currency.GBP)
// Revision: 1
// Author: @JayRogers
//
// *** USE AT YOUR OWN RISK ***
// - Nothing is perfect, and all decisions by you are on your own head. And stuff.
//
// Description:
// - It's RSI versus a Simple Moving Average.. Not sure it really needs much more description.
// - Should not repaint - Automatically offsets by 1 bar if anything other than "open" selected as RSI source.
// === INPUTS ===
// rsi
rsiSource = input(defval = open, title = "RSI Source")
rsiLength = input(defval = 8, title = "RSI Length", minval = 1)
// sma
maLength = input(defval = 34, title = "MA Period", minval = 1)
// invert trade direction
tradeInvert = input(defval = false, title = "Invert Trade Direction?")
// risk management
useStop = input(defval = false, title = "Use Initial Stop Loss?")
slPoints = input(defval = 25, title = "Initial Stop Loss Points", minval = 1)
useTS = input(defval = true, title = "Use Trailing Stop?")
tslPoints = input(defval = 120, title = "Trail Points", minval = 1)
useTSO = input(defval = false, title = "Use Offset For Trailing Stop?")
tslOffset = input(defval = 20, title = "Trail Offset Points", minval = 1)
// === /INPUTS ===
// === BASE FUNCTIONS ===
// delay for direction change actions
switchDelay(exp, len) =>
average = len >= 2 ? sum(exp, len) / len : exp[1]
up = exp > average
down = exp < average
state = up ? true : down ? false : up[1]
// === /BASE FUNCTIONS ===
// === SERIES and VAR ===
// rsi
shunt = rsiSource == open ? 0 : 1
rsiUp = rma(max(change(rsiSource[shunt]), 0), rsiLength)
rsiDown = rma(-min(change(rsiSource[shunt]), 0), rsiLength)
rsi = (rsiDown == 0 ? 100 : rsiUp == 0 ? 0 : 100 - (100 / (1 + rsiUp / rsiDown))) - 50 // shifted 50 points to make 0 median
// sma of rsi
rsiMa = sma(rsi, maLength)
// self explanatory..
tradeDirection = tradeInvert ? 0 <= rsiMa ? true : false : 0 >= rsiMa ? true : false
// === /SERIES ===
// === PLOTTING ===
barcolor(color = tradeDirection ? green : red, title = "Bar Colours")
// hlines
medianLine = hline(0, title = 'Median', color = #996600, linewidth = 1)
limitUp = hline(25, title = 'Limit Up', color = silver, linewidth = 1)
limitDown = hline(-25, title = 'Limit Down', color = silver, linewidth = 1)
// rsi and ma
rsiLine = plot(rsi, title = 'RSI', color = purple, linewidth = 2, style = line, transp = 50)
areaLine = plot(rsiMa, title = 'Area MA', color = silver, linewidth = 1, style = area, transp = 70)
// === /PLOTTING ===
goLong() => not tradeDirection[1] and tradeDirection
killLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Buy", long = true, when = goLong())
strategy.close(id = "Buy", when = killLong())
goShort() => tradeDirection[1] and not tradeDirection
killShort() => not tradeDirection[1] and tradeDirection
strategy.entry(id = "Sell", long = false, when = goShort())
strategy.close(id = "Sell", when = killShort())
if (useStop)
strategy.exit("XSL", from_entry = "Buy", loss = slPoints)
strategy.exit("XSS", from_entry = "Sell", loss = slPoints)
// if we're using the trailing stop
if (useTS and useTSO) // with offset
strategy.exit("XSL", from_entry = "Buy", trail_points = tslPoints, trail_offset = tslOffset)
strategy.exit("XSS", from_entry = "Sell", trail_points = tslPoints, trail_offset = tslOffset)
if (useTS and not useTSO) // without offset
strategy.exit("XSL", from_entry = "Buy", trail_points = tslPoints)
strategy.exit("XSS", from_entry = "Sell", trail_points = tslPoints)