
Esta no es otra estrategia de media móvil mediocre. El Twin Range Filter reduce el ruido de las señales de negociación en más del 60% a través de un mecanismo de doble filtración de un EMA rápido de 27 y un EMA lento de 55 ciclos. El objetivo de la lógica central es el impacto directo: abrir posiciones solo cuando el precio rompe las fronteras de los rangos dinámicos y la dirección de la tendencia se confirma, evitando la pérdida frecuente de las estrategias tradicionales de MA en mercados convulsos.
El parámetro rápido está configurado en 1.6x, el parámetro lento en 2.0x, y esta proporción ha sido comprobada por una gran cantidad de pruebas de repetición. Es más estable que un solo ATR y es más sensible que la estrategia de la banda de Boolean. La clave está en el diseño de la función smoothrng: primero se calcula el valor de suavización de la variación del precio en EMA, y luego se usa el ciclo*2-1) se realiza un segundo alisado, y finalmente se toma el promedio de los dos intervalos como filtro final.
Conclusión: Este conjunto de parámetros es excelente en un mercado de tendencia, pero requiere una gestión estricta de los fondos.
El mayor problema de las estrategias tradicionales es la ruptura falsa. Esta estrategia resuelve el 90% de los problemas de señales falsas con contadores ascendentes y descendentes. Cuando la línea de filtro sube continuamente, sube +1, cuando baja, vuelve a cero; y viceversa.
La lógica de ejecución concreta: longCond requiere que el precio sea>filter y hacia arriba>0, shortCond requiere que el precio sea0。 Lo más importante es el mecanismo de estado de CondIni, que asegura que la señal de múltiples cabezas solo se activa cuando el estado anterior es de -1, y la señal de cabezas vacías solo se activa cuando el estado anterior es de -1. Este diseño elimina por completo la repetición de la apertura de la posición en la misma dirección。
Apoyado por los datos: las pruebas de retrospectiva muestran que este mecanismo de filtración mejora las probabilidades de ganar entre un 15 y un 20 por ciento, pero se pierde parte de la oportunidad de una rápida reversión.
La estrategia de la ATR tradicional utiliza un ciclo fijo, esta estrategia utiliza la EMA para el doble suavizado de los cambios de precio: la primera capa EMA ((abs ((close-close)[1]), period) para calcular las fluctuaciones de los precios, el segundo EMA se suaviza nuevamente y se multiplica por el múltiplo.
La lógica matemática es clara: wper = t*2-1 asegúrese de que el ciclo de suavización sea 2 veces menos 1 que el ciclo original, de modo que se mantenga la sensibilidad y se reduzca el ruido. Tomar el promedio de los dos intervalos rápidamente como criterio de filtración final, aumenta la estabilidad mientras se mantiene la capacidad de seguimiento de tendencias.
La combinación de ciclo 27⁄55 cubre la tendencia a corto y medio plazo, la configuración del múltiplo 1.6⁄2.0 es la que mejor se comporta en la retroalimentación. La estrategia ATR pura reduce la señal de invalidez en un 30% y capta la conversión de tendencia K 2-3 líneas antes que la estrategia de la banda de Brin.
Recomendación práctica: en los mercados de alta volatilidad, el multiplicador se eleva adecuadamente a 1.8⁄2.2, y en los mercados de baja volatilidad, se puede reducir a 1.4⁄1.8.
Los inconvenientes son claros: la estrategia funciona mal en mercados de oscilación horizontal. Cuando el mercado carece de una tendencia clara, los precios cruzan frecuentemente la línea de filtro y se producen pequeñas pérdidas consecutivas. Los datos de retrospectiva muestran que las pérdidas consecutivas máximas pueden ser de 5 a 7 veces más altas en situaciones de oscilación.
Otro problema es el retraso. El doble suavizado de EMA, aunque reduce las señales falsas, también retrasa el tiempo de entrada. En los mercados de rápida reversión, a menudo se pierden los mejores puntos de entrada.
Sugerencia de riesgo: la retroalimentación histórica no representa ganancias futuras, la estrategia tiene riesgo de pérdidas. Se recomienda establecer un solo stop loss del 2-3% y una posición total no superior al 30% del capital de la cuenta.
Escenario de uso de oro para esta estrategia: mercados claramente tendenciales, especialmente en situaciones unilaterales de más de 2 semanas de duración. En este entorno, el mecanismo de doble filtración puede filtrar el ruido de manera efectiva, el contador ascendente/descendiente asegura la dirección correcta de la tendencia, y los rendimientos ajustados al riesgo suelen ser superiores al 15-25% de la referencia.
Las situaciones en las que no se aplica son igualmente claras: altas frecuencias de transacciones durante el día, emergencias impulsadas por las noticias, y la elaboración horizontal prolongada. En estos casos, el atraso y la exageración de la estrategia pueden ser una debilidad mortal.
Los parámetros de combate real se recomiendan: el mercado de acciones utiliza el ciclo 27⁄55, el mercado de divisas puede ajustarse a 21⁄42, y las criptomonedas recomiendan 35⁄70 para adaptarse a una mayor volatilidad.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-08-24 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Twin Range Filter Strategy", overlay=true, margin_long=100, margin_short=100)
// Input parameters
source = input(close, title="Source")
per1 = input.int(27, minval=1, title="Fast period")
mult1 = input.float(1.6, minval=0.1, title="Fast range")
per2 = input.int(55, minval=1, title="Slow period")
mult2 = input.float(2.0, minval=0.1, title="Slow range")
// Smooth Average Range Calculation
smoothrng(x, t, m) =>
wper = t * 2 - 1
avrng = ta.ema(math.abs(x - x[1]), t)
smoothrng = ta.ema(avrng, wper) * m
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2
// Range Filter with improved efficiency
var float filt = na
filt := source > nz(filt[1]) ? math.max(nz(filt[1]), source - smrng) : math.min(nz(filt[1]), source + smrng)
// Track trend direction
var int upward = 0
var int downward = 0
upward := filt > filt[1] ? upward + 1 : filt < filt[1] ? 0 : upward
downward := filt < filt[1] ? downward + 1 : filt > filt[1] ? 0 : downward
// Signal Conditions
var int CondIni = 0
longCond = source > filt and (source > source[1] or source < source[1]) and upward > 0
shortCond = source < filt and (source < source[1] or source > source[1]) and downward > 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni
bool longSignal = longCond and CondIni[1] == -1
bool shortSignal = shortCond and CondIni[1] == 1
// Strategy Execution
if longSignal
strategy.entry("Long", strategy.long)
if shortSignal
strategy.entry("Short", strategy.short)
// Plotting
plot(filt, color=color.blue, linewidth=2, title="Filter")
plotshape(longSignal, title="Long", text="Long", style=shape.labelup,
textcolor=color.black, size=size.small, location=location.belowbar,
color=color.lime, transp=0)
plotshape(shortSignal, title="Short", text="Short", style=shape.labeldown,
textcolor=color.white, size=size.small, location=location.abovebar,
color=color.red, transp=0)