
La estrategia de filtración de señales de compra y venta basadas en el rango de fluctuación de precios es una estrategia de negociación cuantitativa muy práctica. Utiliza el rango de fluctuación de los precios para filtrar las señales de compra y venta, reduciendo las falsas señales en mercados de baja volatilidad y mejorando la calidad de la señal en mercados de alta volatilidad. El nombre de la estrategia resume con precisión las principales funciones de la estrategia.
La estrategia primero calcula el rango de fluctuación de los precios de los activos en un período determinado. En concreto, calcula la diferencia entre el precio más alto y el precio más bajo en un período determinado para determinar la amplitud de la fluctuación de los precios.
Luego, genera señales de compra y venta. Sin embargo, no todas las señales son activadas, sino que se requiere que se cumplan las condiciones de filtrado de la gama de fluctuaciones de precios. Por ejemplo, la señal de compra solo se emite cuando el precio rompe la gama de fluctuaciones.
De esta manera, la estrategia puede filtrar la mayoría de las señales falsas en un entorno de mercado de baja volatilidad y evitar entradas innecesarias. En cambio, en un entorno de alta volatilidad, puede capturar movimientos de mayor dirección y beneficiarse de ellos.
La mayor ventaja de esta estrategia es que se puede ajustar dinámicamente la intensidad de filtración de la señal. Cuando la fluctuación es baja, se selecciona solo la señal de alta calidad; y cuando la fluctuación es alta, se puede aprovechar más oportunidades que ofrece el mercado.
Esta estrategia es más inteligente y adaptable que los filtros de parámetros fijos. Sin importar el estado del mercado, ofrece un rendimiento de riesgo superior.
Además, esta estrategia combina el juicio de la dirección de la tendencia, proporcionando una señal de negociación más confiable que las condiciones de operación individuales. Al mismo tiempo, también tiene una función de parada de pérdidas que controla el riesgo de las operaciones individuales.
El principal riesgo de esta estrategia reside en la configuración de parámetros de rango de fluctuación. Si se establece un rango demasiado grande o demasiado pequeño, tendrá un efecto negativo en la calidad de la señal y en las oportunidades de obtener ganancias.
Además, en mercados con una fuerte tendencia a la volatilidad de los precios en el corto plazo, las oportunidades de ganancias de esta estrategia son relativamente menores. La combinación de diferentes sistemas de ciclo puede ayudar a mitigar este problema.
La estrategia se puede optimizar en los siguientes aspectos:
Utiliza algoritmos de parámetros adaptativos para optimizar automáticamente los parámetros del rango de oscilación, lo que lo hace más inteligente y dinámico.
Aumentar las reglas de filtración basadas en tendencias de grandes ciclos para evitar ser atrapados en mercados convulsivos.
Esta estrategia, combinada con diferentes ciclos, forma un sistema que mejora la estabilidad general.
Agrega algoritmos de aprendizaje automático para mejorar la configuración de parámetros y el efecto de las reglas de filtrado.
La estrategia de filtración de señales de compra y venta basada en el rango de fluctuación de los precios es una estrategia de negociación cuantitativa muy práctica y efectiva. Puede ajustar dinámicamente la intensidad de la filtración y ofrecer un rendimiento de riesgo óptimo en diferentes entornos de mercado. Al mismo tiempo, la estrategia tiene un gran espacio para la optimización, especialmente en la optimización de los parámetros y la optimización de las reglas.
/*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')