Indicador RSI Estrategia doble

El autor:¿ Qué pasa?, Fecha: 2023-09-19 19:43:19
Las etiquetas:

Resumen general

Esta estrategia utiliza el indicador de índice de fuerza relativa (RSI) para determinar los niveles de sobrecompra y sobreventa para los cortos y largos.

Estrategia lógica

La lógica central incluye:

  1. Calcular el valor del RSI
  2. Establecimiento de los límites superiores e inferiores del RSI
  3. Cambio de posición cuando el RSI supera el límite superior
  4. Ventajas de los valores de referencia de los instrumentos financieros
  5. Establecimiento de los niveles de toma de ganancias y parada de pérdidas
  6. Posiciones de salida cuando el RSI se invierte o se alcanza el beneficio/stop loss

El indicador RSI muestra sobrecompras por encima de 70 y sobreventa por debajo de 30 condiciones de mercado. La estrategia utiliza esta lógica clásica para determinar entradas largas / cortas basadas en el valor del RSI contra límites preestablecidos. Los parámetros personalizables también permiten optimizar límites, stop loss, etc. para la adaptación del mercado.

Ventajas

  • El RSI identifica eficazmente los estados de mercado sobrecomprados/sobrevendidos
  • El RSI tiene una base teórica sólida
  • Los parámetros personalizables se adaptan a todos los instrumentos y condiciones
  • En caso de que el riesgo de riesgo no se haya calculado, se aplicará el método de cálculo del riesgo de riesgo.

Riesgos y mitigación

  • Potencial de señales falsas de RSI que conduzcan a pérdidas
  • Requiere una optimización continua de los niveles de RSI
  • Las paradas se pueden alcanzar con frecuencia durante la acción de precios agitados

Mitigantes:

  1. Factores adicionales para confirmar las señales y evitar las falsas
  2. Optimizar los niveles de RSI en función de las características del instrumento
  3. Ajustar la colocación de pérdidas de parada para reducir los riesgos de la horquilla

Oportunidades de mejora

La estrategia puede reforzarse mediante:

  1. Aprendizaje automático para la optimización automática del nivel de RSI

  2. Confirmación del volumen para evitar errores

  3. Factores adicionales como las medias móviles para la confirmación multifactorial

  4. Se aplican las condiciones siguientes:

  5. Análisis de volumen para medir las entradas/salidas de fondos

  6. Combinación con estrategias no correlacionadas para reducir el aprovechamiento de la cartera

Conclusión

Se trata de una estrategia de reversión de la media simple y práctica que utiliza el RSI para la detección de sobrecompra/sobreventa. Los parámetros personalizables permiten la adaptación a los mercados cambiantes.


/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("4All V3", shorttitle="Strategy", overlay=true)

/////////////// Component Code Start ///////////////
testStartYear = input(2011, "Backtest Start Year") 
testStartMonth = input(8, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(9, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
// testStopDay = testStartDay + 1
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/////////////// Component Code Stop ///////////////

src = close
len = input(4, 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))

rsin = input(5)
sn = 100 - rsin
ln = 0 + rsin

/////////////// STRATEGY ///////////////
ts = input(99999, "Trailing Stop") / 10000
tp = input(15, "Take Profit") / 10000
sl = input(23, "Stop Loss") / 10000

pyr = input(1, "Pyramiding")

short = crossover(rsi, sn)
long = crossunder(rsi, ln)

totalLongs = 0
totalLongs := nz(totalLongs[1])
totalShorts = 0
totalShorts := nz(totalShorts[1])

totalLongsPrice = 0
totalLongsPrice := nz(totalLongsPrice[1])
totalShortsPrice = 0
totalShortsPrice := nz(totalShortsPrice[1])

sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])

if long
    sectionLongs := sectionLongs + 1
    sectionShorts := 0

if short
    sectionLongs := 0
    sectionShorts := sectionShorts + 1

longCondition = long and sectionLongs >= pyr
shortCondition = short and sectionShorts >= pyr

last_long = na
last_short = na
last_long := longCondition ? time : nz(last_long[1])
last_short := shortCondition ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = na
last_open_short_signal = na
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = na
last_short_signal = na
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = na
last_low = na
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal

long_tp = high >= (last_open_long_signal + tp)
short_tp = low <= (last_open_short_signal - tp)

long_sl = low <= (last_open_long_signal - sl)
short_sl = high >= (last_open_short_signal + sl)

leverage = input(1, "Leverage")
long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal
short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal
long_call_signal = low <= long_call
short_call_signal = high >= short_call

if testPeriod()
    strategy.entry("Long", strategy.long, when=longCondition)
    strategy.entry("Short", strategy.short, when=shortCondition)
    
    strategy.close("Long", when=long_call_signal)
    strategy.close("Short", when=short_call_signal)
    strategy.close("Long", when=long_tp)
    strategy.close("Short", when=short_tp)
    strategy.close("Long", when=long_sl)
    strategy.close("Short", when=short_sl)
    strategy.close("Long", when=long_ts)
    strategy.close("Short", when=short_ts)

Más.