La estrategia de señales de compra y venta de filtro de rango es una estrategia de negociación cuantitativa muy práctica. Utiliza el rango de fluctuación de precios para filtrar las señales de compra y venta, reduciendo las señales falsas en mercados de baja volatilidad y mejorando la calidad de la señal en mercados de alta volatilidad.
La estrategia primero calcula el rango de fluctuación del precio del activo durante un determinado período, específicamente, calcula la diferencia entre el precio más alto y el precio más bajo dentro del período especificado para determinar la amplitud de la fluctuación de precios.
Después de eso, generará señales de compra y venta. Sin embargo, no todas las señales desencadenarán la entrada, sino que deben cumplir con las condiciones de filtrado del rango de fluctuación de precios. Por ejemplo, una señal de compra se emite solo cuando el precio rompe el rango de fluctuación.
De esta manera, la estrategia filtra la mayoría de las señales falsas en entornos de mercado de baja volatilidad, evitando la entrada innecesaria.
La mayor ventaja de esta estrategia es que puede ajustar dinámicamente la fuerza de filtración de las señales.
En comparación con los filtros de parámetros fijos, esta estrategia es más inteligente y adaptable.
Además, en comparación con una sola condición de operación, esta estrategia incorpora un juicio direccional de tendencia para proporcionar señales comerciales más confiables.
El principal riesgo de la estrategia radica en la fijación de parámetros de rango de volatilidad: si el rango establecido es demasiado grande o demasiado pequeño, afectará negativamente a la calidad de la señal y a las oportunidades de ganancia.
Además, la estrategia tiene relativamente menos oportunidades de beneficios en mercados con fuertes tendencias oscilantes a corto plazo.
La estrategia se puede optimizar en los siguientes aspectos:
Utilice algoritmos de parámetros adaptativos para optimizar automáticamente los parámetros del rango de volatilidad para hacerlos más inteligentes y dinámicos.
Aumentar las normas de filtrado basadas en grandes tendencias del ciclo para evitar trampas de consolidación.
Combinar diferentes ciclos de la estrategia para formar un sistema y mejorar la estabilidad general.
Añadir algoritmos de aprendizaje automático para mejorar el efecto de la configuración de parámetros y las reglas de filtrado.
La estrategia de señales de compra y venta de filtro de rango es una estrategia de comercio cuantitativa muy práctica y efectiva. Puede ajustar dinámicamente la intensidad de filtrado y proporcionar una recompensa de riesgo superior en diferentes entornos de mercado. Al mismo tiempo, todavía hay un gran potencial en la optimización de esta estrategia, especialmente en la optimización de parámetros y optimización de reglas. En general, esta estrategia proporciona una excelente solución base para los operadores cuantitativos que buscan retornos excedentes constantes.
/*backtest start: 2023-03-02 00:00:00 end: 2024-03-07 00:00:00 period: 1d basePeriod: 1h 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/ // Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/ // This version is the old version of the Range Filter with less settings to tinker with //@version=5 strategy(title='Range Filter - B&S Signals', shorttitle='[Doan]_RF-B&S Signals', overlay=true) //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Functions //----------------------------------------------------------------------------------------------------------------------------------------------------------------- longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01 shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01 longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01 shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01 emaLength = input.int(200, title="EMA Length") // Determine stop loss price //Range Size Function rng_size(x, qty, n) => wper = n * 2 - 1 avrng = ta.ema(math.abs(x - x[1]), n) AC = ta.ema(avrng, wper) * qty rng_size = AC //Range Filter Function rng_filt(x, rng_, n) => r = rng_ var rfilt = array.new_float(2, x) array.set(rfilt, 1, array.get(rfilt, 0)) if x - r > array.get(rfilt, 1) array.set(rfilt, 0, x - r) if x + r < array.get(rfilt, 1) array.set(rfilt, 0, x + r) rng_filt1 = array.get(rfilt, 0) hi_band = rng_filt1 + r lo_band = rng_filt1 - r rng_filt = rng_filt1 [hi_band, lo_band, rng_filt] //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Inputs //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Range Source rng_src = input(defval=close, title='Swing Source') //Range Period rng_per = input.int(defval=20, minval=1, title='Swing Period') //Range Size Inputs rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier') //Bar Colors use_barcolor = input(defval=false, title='Bar Colors On/Off') //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Definitions //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Range Filter Values [h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per) //Direction Conditions var fdir = 0.0 fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir upward = fdir == 1 ? 1 : 0 downward = fdir == -1 ? 1 : 0 //Trading Condition longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0 shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0 CondIni = 0 CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1] longCondition = longCond and CondIni[1] == -1 shortCondition = shortCond and CondIni[1] == 1 //Colors filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc bar_color = upward and rng_src > filt ? rng_src > rng_src[1] ? #05ff9b : #00b36b : downward and rng_src < filt ? rng_src < rng_src[1] ? #ff0583 : #b8005d : #cccccc ema = ta.ema(close, emaLength) //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Outputs //----------------------------------------------------------------------------------------------------------------------------------------------------------------- longStopPrice = strategy.position_avg_price * (1 - longLossPerc) shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc) longTakePrice = strategy.position_avg_price * (1 + longTakePerc) shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc) //Filter Plot filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67) //Band Plots h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title='High Band') l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title='Low Band') //Band Fills fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title='High Band Fill') fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title='Low Band Fill') //Bar Color barcolor(use_barcolor ? bar_color : na) // Entry strategy.entry("Long", strategy.long, when=longCondition) strategy.entry("Short", strategy.short, when=shortCondition) plot(ema) //Plot Buy and Sell Labels plotshape(longCondition, title='Buy Signal', text='BUY', textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0)) plotshape(shortCondition, title='Sell Signal', text='SELL', textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0)) //Alerts alertcondition(longCondition, title='Buy Alert', message='BUY') alertcondition(shortCondition, title='Sell Alert', message='SELL')