Estrategia de negociación de reversión de seguimiento de señales RSI

El autor:¿ Qué pasa?, Fecha: 2023-09-28 10:54:24
Las etiquetas:

Resumen general

Esta estrategia implementa el comercio de reversión mediante el seguimiento de las señales de sobrecompra y sobreventa perdidas del indicador RSI. Las señales de compra se generan cuando el RSI cae desde los niveles de sobrecompra y las señales de venta cuando el RSI rebota desde los niveles de sobreventa, con el objetivo de capturar oportunidades de reversión.

Estrategia lógica

Identificación de la señal

El indicador RSI identifica los niveles de sobrecompra/sobreventa.

overbought = rsi > uplimit
oversold = rsi < dnlimit

Si el RSI fue sobrecomprado última barra y salidas sobrecomprado esta barra, una señal de compraup1Si RSI fue sobrevendido última barra y sale sobrevendido esta barra, una señal de ventadn1es generado.

up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false

Lógico de salida

Si la dirección de la barra se alinea con la dirección de posición y el cuerpo de la barra excede la mitad de su promedio de 10 períodos, se activa una señal de salida.

exit = (((strategy.position_size > 0 and bar == 1) or  
         (strategy.position_size < 0 and bar == -1)) and  
        body > abody / 2)

Ventajas

  1. Rastrear las señales de reversión del RSI perdidas, evitando la necesidad de capturar puntualmente los puntos de sobrecompra / sobreventa.

  2. Aprovechar la propiedad de reversión del RSI para capturar los puntos de inflexión.

  3. Incorporar la dirección y el tamaño de la barra en la lógica de salida para evitar un seguimiento posterior después de los retrocesos.

Riesgos y soluciones

  1. Riesgo de falsas señales de los indicadores de riesgo

    • Solución: confirmar las señales con otros indicadores para evitar señales falsas
  2. Los precios ya pueden haberse retirado significativamente al rastrear la señal, aumentando el riesgo de pérdida

    • Solución: Reducir el tamaño de la posición en la entrada, o optimizar el tiempo de entrada
  3. El riesgo de una salida prematura antes de la reversión total de la rentabilidad

    • Solución: mejorar la lógica de salida para aumentar las posibilidades de obtener ganancias

Oportunidades de mejora

  1. Optimizar los parámetros como los niveles de sobrecompra / sobreventa, período de revisión, etc. basado en diferentes mercados

  2. Ajustar el tamaño de la posición, como bajar el tamaño al rastrear señales

  3. Mejorar el tiempo de entrada, añadiendo filtros más allá de las señales de seguimiento

  4. Mejorar las salidas para aumentar la rentabilidad, como las paradas de ganancias

  5. Optimice las paradas para reducir las pérdidas, como las paradas traseras o las paradas cónicas

Resumen de las actividades

Esta estrategia implementa el comercio de reversión mediante el seguimiento de las señales de sobrecompra / sobreventa de RSI. Tiene la ventaja de detectar señales de reversión, pero también tiene riesgos de falsas señales y pérdidas.


/*backtest
start: 2023-09-20 00:00:00
end: 2023-09-27 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Anti RSI Strategy v1.0", shorttitle = "Anti RSI str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
rsiperiod1 = input(14, defval = 14, minval = 2, maxval = 50, title = "RSI Period")
rsilimit1 = input(25, defval = 25, minval = 1, maxval = 100, title = "RSI limit")
showarr = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//RSI
uprsi1 = rma(max(change(close), 0), rsiperiod1)
dnrsi1 = rma(-min(change(close), 0), rsiperiod1)
rsi = dnrsi1 == 0 ? 100 : uprsi1 == 0 ? 0 : 100 - (100 / (1 + uprsi1 / dnrsi1))
uplimit = 100 - rsilimit1
dnlimit = rsilimit1

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
overbought = rsi > uplimit
oversold = rsi < dnlimit

up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false
up2 = bar == -1 and strategy.position_size > 0 and overbought == false
dn2 = bar == 1 and strategy.position_size < 0 and oversold == false

norma = overbought == false and oversold == false
exit = (((strategy.position_size > 0 and bar == 1) or (strategy.position_size < 0 and bar == -1)) and body > abody / 2)

//Arrows
col = exit ? black : up1 or dn1 or up2 or dn2 ? blue : na
needup = up1 or up2
needdn = dn1 or dn2
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Más.