Estrategia de negociación a corto plazo de ruptura del filtro de rango

El autor:¿ Qué pasa?, Fecha: 2023-09-21 21:17:40
Las etiquetas:

Resumen general

Esta estrategia de negociación a corto plazo genera señales de compra y venta basadas en el rango de fluctuación de precios. Calcula el rango de movimiento de precios durante un período y lo utiliza como un filtro para las señales comerciales. Las señales se activan cuando el precio se rompe el rango.

Estrategia lógica

El indicador central es el rango de fluctuación de precios.

  1. Calcular el intervalo alto-bajo durante los últimos N períodos como la amplitud del precio

  2. Limpiar la amplitud utilizando promedios móviles para derivar el filtro de rango

  3. Una señal de compra se genera cuando el precio se eleva por encima del filtro de rango

  4. Una señal de venta se genera cuando el precio cae por debajo del filtro de rango

De esta manera, las rupturas del rango de precios se utilizan para determinar la dirección de la tendencia y filtrar el ruido para señales más limpias.

Ventajas

  • Rango de precios fácil de juzgar las rupturas
  • El rango suavizado filtra eficazmente el ruido
  • Las señales de ruptura detectan tendencias a corto plazo
  • Frecuencia de operaciones más alta adecuada para operaciones a corto plazo
  • Parámetros ajustables fáciles de optimizar

Los riesgos

  • Las rupturas de rango son propensas a las flechas.
  • Necesita datos históricos suficientes para calcular el rango
  • Los parámetros malos causan hipersensibilidad o lentitud
  • No hay paradas efectivas, grandes retiros
  • El rendimiento afectado por las tarifas debidas a la alta frecuencia

Los riesgos pueden mitigarse mediante:

  • Coeficiente de volatilidad del filtro de rango de relajación
  • Optimización de parámetros para ajustes ideales
  • Implementación de paradas de pérdida o paradas de seguimiento
  • Reducción de la frecuencia de las operaciones para reducir las tarifas
  • Pruebas de parámetros específicos del producto

Direcciones de mejora

La estrategia puede mejorarse mediante:

  1. Prueba de los diferentes períodos de cálculo del intervalo

  2. Optimización del coeficiente de volatilidad del filtro de rango

  3. Añadir indicadores de confirmación como el MACD

  4. Utilizando paradas móviles o traseras

  5. Parámetros de ajuste específicos para cada producto

  6. Optimización del sistema de dimensionamiento de la posición

Resumen de las actividades

Esta estrategia utiliza la ruptura de precios fuera de los rangos para generar señales a corto plazo, capturando efectivamente las tendencias temporales. Pero existen riesgos como los whipsaws. Se pueden hacer mejoras a través de la optimización de parámetros, stop losses, añadiendo filtros, etc. para controlar los riesgos mientras se conserva la efectividad.


/*backtest
start: 2023-08-21 00:00:00
end: 2023-09-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Range Filter Buy and Sell 5min [Strategy]", overlay=true, commission_type=strategy.commission.percent, commission_value=0.025, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, slippage=0)

// === INPUT BACKTEST RANGE ===
useDate = input(true,     title='---------------- Use Date ----------------', type=bool)
FromMonth = input(defval = 7, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 25, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true  // create function "within window of time"
// === INPUT BACKTEST RANGE ===


sources = input(defval=close, title="Source")
isHA = input(false, "Use HA Candles", bool)
src = isHA ? security(heikenashi(tickerid), period, sources) : sources
// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters

per = input(defval=50, minval=1, title="Sampling Period")

// Range Multiplier

mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range

smoothrng(x, t, m)=>
    wper      = (t*2) - 1
    avrng     = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper)*m
    smoothrng
smrng = smoothrng(src, per, mult)

// 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(src, smrng)

// Filter Direction

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

// Target Bands

hband = filt + smrng
lband = filt - smrng

// Colors

filtcolor = upward > 0 ? lime : downward > 0 ? red : orange
barcolor  = (src > filt) and (src > src[1]) and (upward > 0) ? lime : (src > filt) and (src < src[1]) and (upward > 0) ? green : 
   (src < filt) and (src < src[1]) and (downward > 0) ? red : (src < filt) and (src > src[1]) and (downward > 0) ? maroon : orange

filtplot = plot(filt, color=filtcolor, linewidth=3, title="Range Filter")

// Target

hbandplot = plot(hband, color=aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=fuchsia, transp=100, title="Low Target")

// Fills

fill(hbandplot, filtplot, color=aqua, title="High Target Range")
fill(lbandplot, filtplot, color=fuchsia, title="Low Target Range")

// Bar Color

//barcolor(barcolor)

// Break Outs 

longCond = na
shortCond = na
longCond := ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0)) 
shortCond := ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > 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

//Alerts

plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = white, style=shape.labelup, size = size.normal, location=location.belowbar, color = green, transp = 0)
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = red, transp = 0)

//strategy.entry("Long", strategy.long, stop = hband, when = window() , comment="Long")
//strategy.entry("Short", strategy.short, stop = lband, when = window() , comment="Short")

strategy.entry("Long", strategy.long, when = longCondition and window() , comment="Long")
strategy.entry("Short", strategy.short, when = shortCondition and window() , comment="Short")



// === Stop LOSS ===
useStopLoss = input(false, title='----- Use Stop Loss / Take profit -----', type=bool)
sl_inp = input(100, title='Stop Loss %', type=float, step=0.25)/100
tp_inp = input(1.5, title='Take Profit %', type=float, step=0.25)/100
stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)
stop_level_short = strategy.position_avg_price * (1 + sl_inp)
take_level_short = strategy.position_avg_price * (1 - tp_inp)
// === Stop LOSS ===

if useStopLoss
    strategy.exit("Stop Loss/Profit Long","Long", stop=stop_level, limit=take_level)
    strategy.exit("Stop Loss/Profit Short","Short", stop=stop_level_short, limit=take_level_short)


Más.