Estrategia de trading con rango de precios dinámico y divergencia RSI: filtrado de tendencias de media móvil multiperiodo y optimización de la gestión dinámica de posiciones

RSI MA DIVERGENCE DYNAMIC POSITION SIZING TREND FILTERING BOX RANGE
Fecha de creación: 2025-05-15 16:07:47 Última modificación: 2025-05-15 16:07:47
Copiar: 3 Número de Visitas: 306
2
Seguir
319
Seguidores

Estrategia de trading con rango de precios dinámico y divergencia RSI: filtrado de tendencias de media móvil multiperiodo y optimización de la gestión dinámica de posiciones Estrategia de trading con rango de precios dinámico y divergencia RSI: filtrado de tendencias de media móvil multiperiodo y optimización de la gestión dinámica de posiciones

Descripción general

La estrategia de comercio de distancia entre el rango de precios dinámicos y el RSI es un sistema de comercio cuantitativo integral que combina las tres tecnologías centrales de detección de la distancia entre los precios, la señal de distancia entre los indicadores RSI y el análisis de la tendencia de las medias móviles. La estrategia está especialmente diseñada para la plataforma de robots de señales OKX, con funciones avanzadas de ajuste de posición dinámica y ciertas posiciones en posición de equilibrio.

La singularidad de esta estrategia reside en su sistema de gestión de posiciones dinámicas, que permite ajustar dinámicamente el tamaño de las transacciones en función de la diferencia entre el precio actual y el precio promedio de la posición, lo que permite a la estrategia aumentar las posiciones cuando los precios continúan en una dirección favorable, y reducir gradualmente las posiciones cuando los precios comienzan a revertirse, optimizando así la eficiencia del capital y la rentabilidad del riesgo.

Principio de estrategia

La estrategia se basa en la colaboración de tres componentes centrales:

  1. Detección de la gama de precios: estrategia para determinar el rango de precios mediante el cálculo de los precios más altos y más bajos en un período determinado (con la configuración de los parámetros boxLength). Estos niveles de precios se dibujan en el gráfico como líneas de borde superior y inferior, lo que proporciona un rango de referencia de precios visual para el comercio.

  2. El RSI se desvía de la detecciónLa estrategia utiliza el índice de fuerza y debilidad relativa (RSI) para calcular la dinámica del mercado y detectar el desvío entre el precio y el RSI. Cuando el precio marca un nuevo bajo y el RSI marca un mínimo más alto, se forma un desvío de la postura; cuando el precio marca un nuevo alto y el RSI marca un máximo más bajo, se forma un desvío de la postura. La estrategia identifica con precisión los extremos locales mediante la configuración de ciclos de retroceso izquierdo y derecho (leftLookback y rightLookback).

  3. Análisis de tendencias de las medias móviles: La estrategia calcula varios tipos de promedios móviles en un marco de tiempo personalizado (MA20, MA50, MA100 y MA200) para determinar la tendencia del mercado mediante el análisis de la disposición de estas medias y la posición del precio con respecto a la media. La estrategia solo activa múltiples señales en la tendencia descendente para garantizar que las operaciones estén en consonancia con el entorno general del mercado.

La lógica de la transacción es la siguiente:

  • Haz más señales.: se activa cuando el precio se rompe el límite inferior y se detecta un desvío de los pescadores del RSI, asegurando al mismo tiempo que se ejecuta solo en condiciones de tendencia descendente. El sistema ajusta dinámicamente el tamaño de la posición en función de la diferencia entre el precio actual y el precio de la posición promedio.
  • Señales de baja: se activa cuando el precio se rompe el límite superior y se detecta que el RSI se desvía de los bajistas, asegurándose de ejecutar solo en condiciones de tendencia alcista. El sistema cerrará algunas posiciones en función de la dinámica de los precios con respecto al precio de la posición promedio.

Ventajas estratégicas

  1. Mecanismo de confirmación multidimensionalCombinando breakouts de barras de precios, filtros de tendencia de RSI fuera de la señal y de las medias móviles, se crea un sistema de confirmación de transacciones multidimensional que mejora significativamente la fiabilidad y la precisión de las señales de negociación.

  2. Gestión de posiciones dinámicasEstrategia: ajuste dinámico del tamaño de las posiciones en función de las condiciones del mercado y los cambios en los precios, en lugar de adoptar una asignación de posiciones fija. Esto permite a la estrategia maximizar el potencial de ganancias en un entorno de mercado favorable y controlar el riesgo en condiciones adversas.math.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1), 100), minEnterPercent)Asegurar que los ajustes de posición sean flexibles y limitados.

  3. Adaptación a las condiciones del mercadoLa estrategia se adapta a diferentes condiciones de mercado mediante el análisis de cruces y conjuntos de medias móviles, ejecutando operaciones solo cuando la forma técnica coincide con la tendencia general.

  4. Puntos de entrada y salida precisos: La señal de desviación más la ruptura de la franja de precios proporcionan puntos de entrada y salida precisos, lo que reduce la posibilidad de señales falsas. Los parámetros de retrospección (leftLookback y rightLookback) aumentan la precisión de la identificación de los puntos extremos.

  5. Visualización de comentariosLa estrategia consiste en trazar las bandas de precios, los promedios móviles y las etiquetas de las señales de negociación en los gráficos, proporcionando una retroalimentación visual intuitiva para que los operadores puedan comprender y validar sus decisiones comerciales.

  6. Configuración de parámetros flexibleUna variedad de parámetros ajustables permite a la estrategia adaptarse a diferentes mercados y estilos de negociación, como la longitud del RSI, el ciclo de los intervalos de precios y el ciclo de retroceso.

Riesgo estratégico

  1. Riesgo de una falsa brechaLa brecha de la barrera de precios puede ser a veces breve y no el comienzo de una tendencia real. Esto puede conducir a transacciones innecesarias y generar pérdidas. La forma de reducir el riesgo es agregar factores de confirmación, como ampliar el ciclo de retroceso o aumentar la confirmación de la transacción.

  2. El riesgo de sobrecomercialización: Los ajustes dinámicos de posiciones pueden causar exceso de operaciones y aumentar el costo de las operaciones. Se recomienda establecer un mínimo mínimo de ajustes razonables (minEnterPercent y minExitPercent) para evitar que las fluctuaciones de precios minúsculas desencadenen operaciones frecuentes.

  3. Riesgo de retraso en la línea mediaLos promedios móviles tienen un retraso, especialmente en mercados que cambian rápidamente. Este riesgo se puede mitigar mediante el ajuste del tipo de promedio utilizado (como el cambio de SMA a EMA) o el ajuste del ciclo de promedio.

  4. Sensibilidad de los parámetrosLa estrategia depende de varios parámetros, como el RSI, el ciclo de la media, etc. Los pequeños cambios en estos parámetros pueden afectar significativamente el rendimiento de la estrategia. Se recomienda buscar una configuración sólida mediante el análisis de las diferentes combinaciones de parámetros y volver a optimizar los parámetros periódicamente para adaptarse a las condiciones cambiantes del mercado.

  5. Dependencia del mercado único: La estrategia puede funcionar bien en ciertas condiciones de mercado y mal en otras. Se recomienda probar la estrategia en diferentes entornos de mercado y en diferentes marcos de tiempo, y considerar agregar filtros de estado de mercado para suspender la negociación en condiciones de mercado inadecuadas.

Dirección de optimización

  1. Confirmación de aumento de volumenLa estrategia actual se basa únicamente en el precio y el RSI para tomar decisiones comerciales. A través de la adición de análisis de volumen de transacciones, se puede verificar la efectividad de las rupturas entre los rangos de precios y evitar falsas rupturas de volumen de transacciones insuficientes. La implementación concreta puede realizarse mediante la comprobación de si el volumen de transacciones en el momento de la ruptura es superior al promedio de transacciones de los ciclos anteriores.

  2. Introducción de un mecanismo de ajuste de las tasas de fluctuaciónEn períodos de alta volatilidad, agregue un filtro de señal o ajuste la fórmula de tamaño de posición para reducir el riesgo de señales falsas y controlar el umbral de riesgo máximo. Se puede usar el indicador ATR para cuantificar la volatilidad y ajustar dinámicamente los parámetros de negociación.

  3. Añadir un filtro de ganancias y pérdidasEstimar el potencial riesgo-rendimiento antes de cada transacción y ejecutar solo las operaciones que alcancen el mínimo valor de pérdidas y ganancias, optimizando así los beneficios esperados de la estrategia general. Esto se puede lograr mediante la configuración de niveles de stop loss y stop loss dinámicos basados en ATR.

  4. Introducción al análisis de múltiples marcos de tiempo: La calidad de la señal se puede mejorar mediante la adición de confirmación de tendencia en un marco de tiempo más alto. Por ejemplo, ejecutar operaciones solo cuando la tendencia de la línea del sol coincide con la tendencia del marco de tiempo de negociación actual.

  5. Mejoras en los algoritmos de posiciones dinámicasLa función de la brecha actual puede producir ajustes excesivos o menores en casos extremos. Se pueden considerar algoritmos más complejos, como fórmulas de adaptación basadas en la volatilidad del mercado y la situación de pérdidas y ganancias actuales, o introducir límites de la brecha de riesgo para garantizar que una sola transacción no afecte excesivamente a la cartera general.

  6. Añadir optimización automática de parámetros: Realizar un ciclo de optimización automática de parámetros, ajustando periódicamente los parámetros de la estrategia en función de los datos de mercado más recientes, para que la estrategia se adapte mejor a las condiciones cambiantes del mercado. Esto se puede hacer a través de un marco de retroalimentación o un algoritmo de aprendizaje automático.

Resumir

La estrategia de trading con movimiento de rango de precios dinámicos y desviación del RSI es un sistema de comercio cuantitativo avanzado que integra varios métodos de análisis técnico, que se combina con las tendencias de los rangos de precios, el desvío del RSI y las medias móviles para proporcionar un marco de decisión de comercio robusto. Su mayor ventaja es que el sistema de gestión de posiciones dinámicas puede ajustar automáticamente el tamaño de las operaciones según las condiciones del mercado, optimizando la eficiencia de los fondos mientras se mantiene el control del riesgo.

Si bien las estrategias presentan algunos riesgos inherentes, como falsas brechas y sensibilidad a los parámetros, la estabilidad y adaptabilidad de las estrategias se pueden aumentar aún más mediante la orientación de optimización sugerida, como el aumento de la confirmación de la transacción, la introducción de ajustes de la volatilidad y el análisis de múltiples marcos de tiempo. Para los comerciantes que desean implementar estrategias avanzadas en plataformas de negociación automatizadas (como los robots de señales OKX), esto ofrece un marco básico flexible y potente que se puede personalizar y ampliar según el estilo de negociación personal y las preferencias del mercado.

Código Fuente de la Estrategia
/*backtest
start: 2025-05-07 00:00:00
end: 2025-05-14 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
// Strategy: Box Range with RSI Divergence (Dynamic Adjustment - OKX Signal Format)
// © aws2333
//I'm chinese 
strategy("Kaito  Box with RSI Div(Dynamic Adjustment + MA + Long)", overlay=true,default_qty_type=strategy.percent_of_equity, default_qty_value=10)


rsiOverbought = 80 
rsiOversold = 13   
boxLength = input.int(3, title="Box Length", minval=1) 
rsiLength = input.int(2, title="RSI Length", minval=1) 
divergenceLookback = input.int(2, title="Divergence Lookback Period", minval=1) 
leftLookback = input.int(2, title="Left Lookback", minval=1)  
rightLookback = input.int(2, title="Right Lookback", minval=1) 
var float avgPrice = na       
//var float position_size = 0     

signalToken = input.string("**********", "Signal Token")
enterOrderType = input.string("limit", "Order Type", options=["market", "limit"])
enterOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
enterInvestmentType = input.string("percentage_investment", "Investment Type", options=["margin", "contract", "percentage_balance", "percentage_investment"])
exitOrderType = input.string("limit", "Order Type", options=["market", "limit"])
exitOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
exitInvestmentType = input.string("percentage_position", "Investment Type", options=["percentage_position"])
maxLag = input.float(30, "maxLag")

minEnterPercent = 1.3  
minExitPercent = 0.09  


highestHigh = ta.highest(high, boxLength) 
lowestLow = ta.lowest(low, boxLength)  


plot(highestHigh, title="Upper Box", color=color.new(color.green, 0), linewidth=1, style=plot.style_line)
plot(lowestLow, title="Lower Box", color=color.new(color.red, 0), linewidth=1, style=plot.style_line)


rsi = ta.rsi(low, rsiLength)


isLowestLeft = low < ta.lowest(low[1], leftLookback)  
isLowestRight = low <= ta.lowest(low, rightLookback) 
isLowestClose = isLowestLeft and isLowestRight      

isHighestLeft = low > ta.highest(low[1], leftLookback) 
isHighestRight = low >= ta.highest(low, rightLookback) 
isHighestClose = isHighestLeft and isHighestRight      

lowestClose = ta.lowest(low, divergenceLookback)
lowestRsi = ta.lowest(rsi, divergenceLookback)
highestClose = ta.highest(low, divergenceLookback)
highestRsi = ta.highest(rsi, divergenceLookback)


lowestClosePrev = ta.lowest(low[1], leftLookback)
lowestRsiPrev = ta.lowest(rsi[1], leftLookback)
highestClosePrev = ta.highest(low[1], leftLookback)
highestRsiPrev = ta.highest(rsi[1], leftLookback)



bullishDivergence = isLowestClose and (low < lowestClosePrev) and (rsi > lowestRsiPrev) and (rsi < rsiOversold)
bearishDivergence = isHighestClose and (low > highestClosePrev) and (rsi < highestRsiPrev) and (rsi > rsiOverbought)


ma(source, length, type) =>
    type == "SMA" ? ta.sma(source, length) :type == "EMA" ? ta.ema(source, length) :type == "SMMA (RMA)" ? ta.rma(source, length) :type == "WMA" ? ta.wma(source, length) :type == "VWMA" ? ta.vwma(source, length) :na


custom_timeframe = input.timeframe("3", "Custom time period (leave blank for current period)")


ma_type = input.string("SMA", "Moving average type", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])


ma20_period = input.int(20, "MA20 ", minval=1)
ma50_period = input.int(50, "MA50 ", minval=1)
ma100_period = input.int(100, "MA100 ", minval=1)
ma200_period = input.int(200, "MA200 ", minval=1)


source_close = request.security(syminfo.tickerid, custom_timeframe, close)


ma20 = ma(source_close, ma20_period, ma_type)
ma50 = ma(source_close, ma50_period, ma_type)
ma100 = ma(source_close, ma100_period, ma_type)
ma200 = ma(source_close, ma200_period, ma_type)


up_signal_1 = ma20 > ma200  
up_signal_2 = ma50 > ma200  
up_signal_3 = ma100 > ma200 
up_signal_4 = (high > ma20 and high > ma50 and high > ma100 and high > ma200)
up_trend = (up_signal_1 and up_signal_2 and up_signal_3 and (source_close > ma200)) or up_signal_4 


down_signal_1 = ma20 < ma200  
down_signal_2 = ma50 < ma200  
down_signal_3 = ma100 < ma200 
down_signal_4 = (low < ma20 and low < ma50 and low < ma100 and low < ma200)
down_trend = (down_signal_1 and down_signal_2 and down_signal_3 and (source_close < ma200)) or down_signal_4 




plot(ma20, color=color.yellow, title="MA20")
plot(ma50, color=color.orange, title="MA50")
plot(ma100, color=color.red, title="MA100")
plot(ma200, color=color.maroon, title="MA200")


var float longAddPercent = na 
var float shortAddPercent = na 
roundToFourDecimals(value) => math.round(value * 10000) / 10000

if not na(avgPrice)
    if close < avgPrice
        longAddPercent := roundToFourDecimals(math.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1)  , 100), minEnterPercent)) 
    if close > avgPrice
        longAddPercent := 1
 
    if close == avgPrice
        longAddPercent := 1


if not na(avgPrice)
    if close < avgPrice
        shortAddPercent := 0.01
 
    if close > avgPrice
        shortAddPercent := roundToFourDecimals(math.max(math.min(math.pow((close - avgPrice)*1000,1.1), 100), minExitPercent)) 
    if close == avgPrice
        longAddPercent := 1


longSignal = (close <= lowestLow) and bullishDivergence
shortSignal = (close >= highestHigh) and bearishDivergence
plotLongSignal = down_trend and longSignal and close < avgPrice
plotShortSignal = up_trend and shortSignal and close > avgPrice  

if plotLongSignal
    label.new(bar_index, avgPrice, "average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_up, color=color.green, textcolor=color.white )
if plotShortSignal
    label.new(bar_index, avgPrice,"average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_down, color=color.red, textcolor=color.white)




if plotLongSignal
    label.new(
         bar_index, 
         close, 
         "LONG :" + str.tostring(longAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"), 
         style=label.style_label_up, 
         color=color.new(color.green, 80), 
         textcolor=color.white
         )

if plotShortSignal
    label.new(
             bar_index, 
             close, 
             "EXIT LONG :" + str.tostring(shortAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"), 
             style=label.style_label_down, 
             color=color.new(color.red, 80), 
             textcolor=color.white
             )


if longSignal

    avgPrice := na(avgPrice) ? close : (avgPrice + close) / 2 







  
if down_trend and longSignal
     
    strategy.entry("Long",strategy.long,qty=longAddPercent )
    
var float close_size = na

if up_trend and shortSignal 

    if strategy.position_size > 0
        close_size := strategy.position_size * (shortAddPercent/100)  
        strategy.order("Partial Close Long", strategy.short, close_size)