La estrategia Twin Range Filter es una estrategia de trading basada en la volatilidad de precios. Utiliza dos indicadores de rango promedio con diferentes configuraciones de parámetros, combinados con la relación entre precio y rango, para generar señales de trading.
Esta estrategia utiliza dos indicadores de rango suave con diferentes períodos de duración: un indicador de rango rápido (período predeterminado 27) y un indicador de rango lento (período predeterminado 55).
La estrategia Twin Range Filter compara el precio con los dos indicadores de rango para determinar si se encuentra actualmente dentro de un cierto rango de oscilación.
Específicamente, la estrategia utiliza una línea mediana como punto de referencia, que es el promedio de los dos indicadores de rango.
Para filtrar señales falsas, también agrega una condición: una señal solo se genera cuando el movimiento del precio actual es consistente con el período anterior.
En resumen, esta estrategia identifica el rango de oscilación con indicadores de rango gemelo y genera órdenes cuando el precio rompe el rango.
Las ventajas de la estrategia del filtro de doble alcance:
Utiliza características de volatilidad de precios, adaptables a activos altamente volátiles como Bitcoin. Los indicadores de rango gemelo pueden localizar rangos de precios con mayor precisión.
Los indicadores gemelos contienen diferentes marcos de tiempo: el rápido capta oportunidades a corto plazo, mientras que el lento considera tendencias a largo plazo.
La adición de filtros de dirección de precios reduce las señales falsas de las fluctuaciones a corto plazo.
Lógica simple y clara, fácil de entender e implementar, adecuada para el comercio de algo.
Algunos riesgos de la estrategia a tener en cuenta:
Se basa en indicadores de volatilidad y puede tener un rendimiento inferior en entornos de baja volatilidad.
Los parámetros del rango deben optimizarse para diferentes productos, de lo contrario se pueden perder oportunidades comerciales o ocurrir señales falsas.
No se considera la divergencia entre el precio y la volatilidad.
Los niveles de stop loss pueden necesitar ajuste en entornos de alta volatilidad.
La estrategia puede mejorarse en varios aspectos:
Prueba y optimiza los parámetros del rango para encontrar combinaciones óptimas para diferentes productos y plazos.
Añadir mecanismos dinámicos de stop loss basados en la volatilidad reciente, para optimizar la estrategia de stop loss.
Añadir filtros basados en la divergencia de volatilidad de precios para evitar señales falsas.
Incorporar otros indicadores como los cambios de volumen para aumentar la certeza de la entrada.
Prueba y añade los mecanismos de salida apropiados para la estrategia.
En general, el filtro de rango gemelo es una estrategia de negociación efectiva para activos altamente volátiles. Utiliza bien las características de volatilidad de precios y genera una lógica de negociación simple y clara. Con mejoras adicionales como la optimización de parámetros y la gestión de riesgos, puede convertirse en un componente valioso en un sistema de negociación cuántica. También proporciona información sobre el comercio algorítmico basado en las características de volatilidad del mercado.
/*backtest start: 2023-11-05 00:00:00 end: 2023-11-12 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © colinmck, greenmask9 //@version=4 strategy(title="Twin Range Filter Algo", overlay=true) source = input(defval=close, title="Source") // Smooth Average Range per1 = input(defval=27, minval=1, title="Fast period") mult1 = input(defval=1.6, minval=0.1, title="Fast range") per2 = input(defval=55, minval=1, title="Slow period") mult2 = input(defval=2, minval=0.1, title="Slow range") smoothrng(x, t, m) => wper = t * 2 - 1 avrng = ema(abs(x - x[1]), t) smoothrng = ema(avrng, wper) * m smoothrng smrng1 = smoothrng(source, per1, mult1) smrng2 = smoothrng(source, per2, mult2) smrng = (smrng1 + smrng2) / 2 // Range Filter rngfilt(x, r) => rngfilt = x rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r rngfilt filt = rngfilt(source, smrng) upward = 0.0 upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1]) downward = 0.0 downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1]) hband = filt + smrng lband = filt - smrng longCond = bool(na) shortCond = bool(na) longCond := source > filt and source > source[1] and upward > 0 or source > filt and source < source[1] and upward > 0 shortCond := source < filt and source < source[1] and downward > 0 or source < filt and source > source[1] and downward > 0 CondIni = 0 CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1] long = longCond and CondIni[1] == -1 short = shortCond and CondIni[1] == 1 // Plotting // Strategy // From this part on, programmer is greenmaks9 // Separator = input(title="Following conditions and backtest algorithm are added by @greenmask9 🎯, original script is written by @colinmck 👍. Read both of their's release notes for more info on how this script works.", type=input.bool, defval=false) disabler = input(title="Disable greenmask9's ATR conditions", type=input.bool, defval=false) //second l2 = input(title="ATR1", defval=32, minval=1) s2 = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"]) atr2(source, l2) => if s2 == "SMA" sma(source, l2) else if s2 == "RMA" rma(source, l2) else if s2 == "EMA" ema(source, l2) else wma(source, l2) //third l3 = input(title="ATR2", defval=64, minval=1) s3 = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"]) atr3(source, l3) => if s3 == "RMA" rma(source, l3) else if s3 == "SMA" sma(source, l3) else if s3 == "EMA" ema(source, l3) else wma(source, l3) atr20=atr2(tr(true), l2) atr30=atr3(tr(true), l3) strategy.initial_capital = 50000 ordersize=floor(strategy.initial_capital/close) profit = input(title="Ticks profit", type=input.integer, defval=900) stop = input(title="Ticks stoploss", type=input.integer, defval=300) maxcandles_till_close = input(title="Time stoploss", type=input.integer, defval=17) bull = long and (atr20<atr30 or disabler) bear = short and (atr20<atr30 or disabler) bullclock = barssince(bull) bearclock = barssince(bear) if (bull) strategy.entry("Twin Long", strategy.long, ordersize) strategy.exit("Exit", from_entry = "Twin Long", profit = profit, loss = stop) if (bear) strategy.entry("Twin Short", strategy.short, ordersize) strategy.exit("Exit", from_entry = "Twin Short", profit = profit, loss = stop) //time stoploss strategy.close("Twin Long", when = bullclock == maxcandles_till_close, comment = "Timed out") strategy.close("Twin Short", when = bearclock == maxcandles_till_close, comment = "Timed out")