
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.
La estrategia se basa en la colaboración de tres componentes centrales:
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.
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).
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:
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
/*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)