Indicador de estrategia cuantitativa de divergencia de precios RSI, sistema de optimización adaptativa y monitoreo dinámico

RSI TP SL
Fecha de creación: 2025-01-10 16:20:25 Última modificación: 2025-01-10 16:20:25
Copiar: 5 Número de Visitas: 421
1
Seguir
1617
Seguidores

Indicador de estrategia cuantitativa de divergencia de precios RSI, sistema de optimización adaptativa y monitoreo dinámico

Descripción general

Esta estrategia es un sistema de trading inteligente basado en el RSI y la divergencia de precios. Capta señales de reversión del mercado mediante el seguimiento dinámico de la relación de divergencia entre el indicador RSI y las tendencias de precios. La estrategia integra fractales como confirmación auxiliar y está equipada con un mecanismo de stop-profit y stop-loss adaptativo para lograr una ejecución de transacciones totalmente automatizada. El sistema admite aplicaciones de múltiples variedades y ciclos y tiene una gran flexibilidad y practicidad.

Principio de estrategia

La lógica central de la estrategia se basa en los siguientes elementos clave:

  1. Identificación de divergencias RSI: identifique posibles divergencias comparando los máximos y mínimos del indicador RSI y la acción del precio. Cuando el precio alcanza un nuevo máximo pero el RSI no alcanza un nuevo máximo, se forma una señal de venta de divergencia superior; cuando el precio alcanza un nuevo mínimo pero el RSI no alcanza un nuevo mínimo, se forma una señal de compra de divergencia inferior.
  2. Confirmación fractal: utilice fractales para analizar la estructura de precios, confirmar la validez de la divergencia detectando máximos y mínimos locales y mejorar la confiabilidad de las señales.
  3. Adaptación de parámetros: El sistema introduce el parámetro de sensibilidad para ajustar dinámicamente el intervalo de juicio fractal para lograr la adaptación a diferentes entornos de mercado.
  4. Control de Riesgo: Integra mecanismos de Stop Loss y Take Profit basados ​​en porcentajes para garantizar que el riesgo de cada transacción sea controlable.

Ventajas estratégicas

  1. Alta confiabilidad de la señal: el mecanismo de doble confirmación de la divergencia RSI y la teoría fractal mejora enormemente la precisión de las señales comerciales.
  2. Fuerte adaptabilidad: La estrategia puede ajustar los parámetros de manera flexible según las diferentes condiciones del mercado y tiene buena adaptabilidad ambiental.
  3. Gestión perfecta del riesgo: integra mecanismos dinámicos de stop-profit y stop-loss para controlar eficazmente la exposición al riesgo de cada transacción.
  4. Alto grado de automatización: todo el proceso, desde el reconocimiento de señales hasta la ejecución de la transacción, está automatizado, lo que reduce el impacto emocional de la intervención humana.
  5. Buena escalabilidad: el marco de estrategia admite aplicaciones de múltiples variedades y múltiples ciclos, lo que facilita la inversión de cartera.

Riesgo estratégico

  1. Dependencia del entorno del mercado: en un mercado con tendencias obvias, la confiabilidad de las señales de divergencia puede disminuir y es necesario agregar un mecanismo de filtrado de tendencias.
  2. Sensibilidad de los parámetros: los parámetros clave de la estrategia, como el umbral RSI y el intervalo de evaluación fractal, deben depurarse cuidadosamente. La configuración incorrecta de los parámetros puede afectar el rendimiento de la estrategia.
  3. Retraso de la señal: dado que es necesario esperar a que el patrón de divergencia se forme completamente antes de que se pueda confirmar la señal, puede haber un cierto retraso en el tiempo de entrada.
  4. Interferencia de ruido del mercado: en un mercado volátil, pueden generarse señales de divergencia falsas y es necesario agregar condiciones de filtrado adicionales.

Dirección de optimización de la estrategia

  1. Aumentar el filtrado de tendencias: introducir indicadores de juicio de tendencias para filtrar señales inversas en mercados de tendencia fuerte y mejorar la adaptabilidad de las estrategias en diferentes entornos de mercado.
  2. Optimizar la adaptación de parámetros: Desarrollar un mecanismo de ajuste dinámico de parámetros basado en la volatilidad del mercado para mejorar la capacidad de respuesta de la estrategia a los cambios del mercado.
  3. Mejorar el control de riesgos: introducir un mecanismo dinámico de stop-loss para ajustar automáticamente la posición de stop-loss según las fluctuaciones del mercado y optimizar los efectos de la gestión de fondos.
  4. Confirmación de señales mejorada: combine indicadores de microestructura del mercado, como el volumen de operaciones y la volatilidad, para establecer un sistema de confirmación de señales más completo.

Resumir

Esta estrategia construye un sistema de trading robusto a través de la innovadora combinación de divergencia RSI y teoría fractal. Las ventajas de la estrategia radican en su alta confiabilidad de la señal, su fuerte adaptabilidad y un mecanismo completo de control de riesgos. A través de la optimización y mejora continuas, se espera que la estrategia mantenga un rendimiento estable en diferentes entornos de mercado. Se recomienda que, al aplicar en tiempo real, los parámetros se prueben y optimicen completamente en función de las características del mercado y se implementen estrictamente medidas de control de riesgos.

Código Fuente de la Estrategia
/*backtest
start: 2025-01-02 00:00:00
end: 2025-01-09 00:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//FRACTALS
//@version=5

//last : 30m 70 68 22 25 0 0 4.7 11.5

//init
capital=1000
percent=100
fees=0//in percent for each entry and exit

//Inputs
start = input(timestamp("1 Feb 2002"), "Start Time", group = "Date")
end = input(timestamp("1 Feb 2052"), "End Time", group = "Date")

//Strategy
strategy("Divergence Finder (RSI/Price) Strategy with Options", overlay = true, initial_capital=capital, default_qty_value=percent, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, calc_on_order_fills=false,process_orders_on_close=true , commission_value=fees, currency=currency.EUR, calc_on_every_tick=true, use_bar_magnifier=false)
//indicator("Divergence Finder (RSI/Price) with Options", overlay=true, max_boxes_count=200, max_bars_back=500,max_labels_count=500)


srcUp=input.source(close, "Source for Price Buy Div", group="sources")
srcDn=input.source(close, "Source for Price Sell Div", group="sources")
srcRsi=input.source(close, "Source for RSI Div", group="sources")


HighRSILimit=input.int(70, "Min RSI for Sell divergence (p1:pre last)", group="signals", inline="1", step=1)
HighRSILimit2=input.int(68, "Min RSI for Sell divergence (p2):last", group="signals", inline="1", step=1)
LowRSILimit=input.int(22, "Min RSI for Buy divergence (p1:pre last)", group="signals", inline="2", step=1)
LowRSILimit2=input.int(25, "Min RSI for Buy divergence (p2:last)", group="signals", inline="2", step=1)


minMarginP=input.float(0, "Min margin between price for displaying divergence (%)", group="signals", step=0.01)
minMarginR=input.float(0, "Min margin between RSI for displaying divergence (%)", group="signals", step=1)

nb=input.int(2, "Sensivity: Determine how many candle will be used to determine last top or bot (too high cause lag, too low cause repaint)", group="Sensivity", inline="3", step=1)


stopPer= input.float(4.7, title='Stop %', group = "Per", inline="3", step=0.01)
tpPer = input.float(11.5, title='TP %', group = "Per", inline="4", step=0.01)

//nb=2
leftBars = nb
rightBars=nb


labels=input.bool(true, "Display Divergence labels", group="Display")
draw=input.bool(true, "Display tops/bottoms")



dnFractal = (close[nb-2] < close[nb]) and (close[nb-1] < close[nb]) and (close[nb+1] < close[nb]) and (close[nb+2] < close[nb])
upFractal = (close[nb-2] > close[nb]) and (close[nb-1] > close[nb]) and (close[nb+1] > close[nb]) and (close[nb+2] > close[nb])
ph=dnFractal
pl=upFractal

plot(dnFractal and draw ? close[nb] : na, style=plot.style_line,offset=-2, color=color.lime, title="tops")
plot(upFractal and draw ? close[nb] : na,  style=plot.style_line, offset=-2, color=color.red, title="botts")

plotchar(dnFractal ? high[nb] : na, char='⮝',location=location.absolute,offset=-2, color=color.rgb(236, 255, 63), title="Down Fractal")
plotchar(upFractal ? low[nb] : na, char='⮟', location=location.absolute, offset=-2, color=color.rgb(67, 227, 255), title="Up Fractal")


float myRSI=ta.rsi(srcRsi, 14)

bool divUp=false
bool divDn=false

//compare lasts bots
p2=ta.valuewhen( ph,srcDn[nb], 0 ) //last price
p1=ta.valuewhen( ph,srcDn[nb], 1 ) //pre last price

r2=ta.valuewhen( ph,myRSI[nb], 0 )  //last rsi
r1=ta.valuewhen( ph,myRSI[nb], 1 )  //pre last rsi


if ph
    if p1 < p2// - (p2 * minMarginP)/100
        if r1 > HighRSILimit and r2 > HighRSILimit2
            if r1 > r2 + (r2 * minMarginR)/100
                divDn:=true

plot(divDn ? close:na, style=plot.style_cross, linewidth=3, color= color.red, offset=-rightBars, title="Sell Div")
if labels and divDn and strategy.position_size >= 0
    label.new(bar_index-nb,high, "Sell Divergence "+str.tostring(p1)+"   "+str.tostring(math.round(r1, 2))+"  "+str.tostring(p2)+"   "+str.tostring(math.round(r2, 2)),xloc=xloc.bar_index,yloc=yloc.abovebar, color = color.red, style = label.style_label_down)
else if divDn and strategy.position_size >= 0
    label.new(bar_index-nb,high, "Sell Divergence",xloc=xloc.bar_index,yloc=yloc.abovebar, color = color.red, style = label.style_label_down)



p2:=ta.valuewhen( pl,srcUp[nb], 0 )
p1:=ta.valuewhen( pl,srcUp[nb], 1 )

r2:=ta.valuewhen( pl,myRSI[nb], 0 )
r1:=ta.valuewhen( pl,myRSI[nb], 1 )


if pl
    if p1 > p2 + (p2 * minMarginP)/100
        if r1 < LowRSILimit and r2 < LowRSILimit2
            if r1 < r2 - (r2 * minMarginR)/100
                divUp:=true
               
plot(divUp ? close:na, style=plot.style_cross, linewidth=3, color= color.green, offset=-rightBars, title="Buy Div")
if labels and divUp and strategy.position_size <= 0
    label.new(bar_index-nb,high, "Buy Divergence "+str.tostring(p1)+"   "+str.tostring(math.round(r1, 2))+"  "+str.tostring(p2)+"   "+str.tostring(math.round(r2, 2)),xloc=xloc.bar_index,yloc=yloc.belowbar, color = color.green, style = label.style_label_up)
else if divUp and strategy.position_size <= 0
    label.new(bar_index-nb,high, "Buy Divergence",xloc=xloc.bar_index,yloc=yloc.belowbar, color = color.green, style = label.style_label_up)


//strat LONG
longEntry = divUp//  and strategy.position_size == 0
longExit = divDn//  and strategy.position_size == 0

//strat SHORT
shortEntry = divDn
shortExit = divUp

LongActive=input(true, title='Activate Long', group = "Directions", inline="2")
ShortActive=input(true, title='Activate Short', group = "Directions", inline="2")
//StopActive=input(false, title='Activate Stop', group = "Directions", inline="2")


//tpActive =  input(false, title='Activate Take Profit', group = "TP", inline="4")
//RR=input(0.5, title='Risk Reward Multiplier', group = "TP")
//QuantityTP = input(100.0, title='Trade Ammount %', group = "TP")


//calc stop
//longStop = strategy.position_avg_price * (1 - stopPer)
//shortStop = strategy.position_avg_price * (1 + stopPer)

longStop = strategy.position_avg_price - (strategy.position_avg_price * stopPer/100)
shortStop = strategy.position_avg_price + (strategy.position_avg_price * stopPer/100)

longTP = strategy.position_avg_price + (strategy.position_avg_price * tpPer/100)
shortTP = strategy.position_avg_price - (strategy.position_avg_price * tpPer/100)

//Calc TP
//longTP = ((strategy.position_avg_price-longStop)*RR+strategy.position_avg_price)
//shortTP = (strategy.position_avg_price-((shortStop-strategy.position_avg_price)*RR))


//display stops
plot(strategy.position_size > 0 ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 ? shortStop : na, style=plot.style_linebr, color=color.purple, linewidth=1, title="Short Fixed SL")


//display TP
plot(strategy.position_size > 0 ? longTP : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Fixed TP")
plot(strategy.position_size < 0 ? shortTP : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Fixed TP")

//do
if true
    //check money available
    if strategy.equity > 0
        //if tpActive //Need to put TP before Other exit
        strategy.exit("Close Long", from_entry="Long", limit=longTP,stop=longStop, comment="Close Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ", qty_percent=100)
        strategy.exit("Close Short", from_entry="Short", limit=shortTP,stop=shortStop, comment="Close Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ", qty_percent=100)
        //Set Stops
        //if StopActive
        //    strategy.exit("Stop Long", from_entry="Long", stop=longStop, comment="Stop Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
        //    strategy.exit("Stop Short", from_entry="Short", stop=shortStop, comment="Stop Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
        if longEntry
            if ShortActive
                strategy.close("Short",comment="Close Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Close Short")
            if LongActive
                strategy.entry("Long", strategy.long, comment="Open Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Open Long")
        if longExit
            if LongActive
                strategy.close("Long",comment="Close Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Close Long")
            if ShortActive
                strategy.entry("Short", strategy.short, comment="Open Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Open Short")


//alertcondition(longEntry and LongActive, title="Buy Divergence Open", message="Buy Divergence Long Opened!")
//alertcondition(longExit and ShortActive, title="Sell Divergence Open", message="Buy Divergence Short Opened!")

//alertcondition(longExit and LongActive, title="Buy Divergence Closed", message="Buy Divergence Long Closed!")
//alertcondition(longEntry and ShortActive, title="Sell Divergence Closed", message="Buy Divergence Short Closed!")