Estrategia de las señales de venta y compra del filtro de rango

El autor:¿ Qué pasa?, Fecha: 2024-03-08 17:06:50
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

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.

Ventajas

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.

Los riesgos

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.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. 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.

  2. Aumentar las normas de filtrado basadas en grandes tendencias del ciclo para evitar trampas de consolidación.

  3. Combinar diferentes ciclos de la estrategia para formar un sistema y mejorar la estabilidad general.

  4. Añadir algoritmos de aprendizaje automático para mejorar el efecto de la configuración de parámetros y las reglas de filtrado.

Conclusión

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')





Más.