Estrategia de compra y venta de filtros de rango a corto plazo


Fecha de creación: 2023-09-21 21:17:40 Última modificación: 2023-09-21 21:17:40
Copiar: 0 Número de Visitas: 854
1
Seguir
1617
Seguidores

Descripción general

Esta estrategia se basa en el rango de fluctuación de los precios para determinar el momento de comprar y vender. Calcula el rango de fluctuación de los precios en un período determinado y genera una señal de negociación con ese rango como condición de filtro.

Principio de estrategia

El indicador central de esta estrategia es el rango de fluctuación de los precios. El proceso de cálculo es el siguiente:

  1. Calcula la diferencia entre el precio más alto y el precio más bajo en los últimos N períodos como aumento de precios

  2. El movimiento del precio se suaviza de forma lineal para obtener un filtro de rango

  3. Cuando el precio sube más allá del rango de filtro, se genera una señal de compra

  4. Cuando el precio cae más allá del rango de filtro, genera una señal de venta

De esta manera, se puede usar el precio para romper el rango de fluctuación para determinar la dirección de la tendencia, filtrar el ruido de la negociación y obtener una señal de negociación más clara.

Ventajas estratégicas

  • El uso de un rango de precios físicos para juzgar brechas
  • Rango de fluctuación de tratamiento suave, filtrando eficazmente el ruido
  • Las señales de ruptura son fáciles de capturar en las tendencias de línea corta.
  • La frecuencia de las transacciones es más alta y es adecuada para operaciones de línea corta.
  • Parámetros ajustables, fáciles de optimizar para diferentes variedades

Riesgo estratégico

  • Las rupturas de rango son propensas a un repunte
  • Necesidad de un mayor rango de cálculo de datos históricos
  • Los parámetros mal configurados pueden ser demasiado sensibles o lentos
  • No hay un control efectivo de los pérdidas y hay un gran retroceso
  • La eficacia puede verse afectada por las tarifas de transacción

Los siguientes pasos pueden ayudar a reducir el riesgo:

  • Coeficiente de fluctuación de la gama de filtración de la ampliación adecuada
  • Optimización de parámetros para encontrar la combinación óptima de parámetros
  • Detener el límite de pérdidas o detener el límite de pérdidas móvil
  • Reducir adecuadamente la frecuencia y los costos de las transacciones
  • Parámetros de prueba según las diferentes variedades

Dirección de optimización

La estrategia puede ser optimizada en los siguientes aspectos:

  1. Diferentes parámetros de periodicidad en el rango de cálculo de la prueba

  2. Coeficiente de fluctuación de los filtros de rango optimizados

  3. Adición de indicadores como el MACD para una segunda confirmación

  4. Utiliza el stop móvil o el stop de seguimiento

  5. Parámetros de ajuste según la variedad

  6. Considerar la optimización de los sistemas de gestión de posiciones

Resumir

La estrategia utiliza el rango de ruptura de precios para generar señales de negociación en línea corta. Esto permite identificar oportunidades de tendencia a corto plazo. Pero también es susceptible al riesgo de rebote. Podemos mejorar el sistema de estrategia mediante la optimización de parámetros, la configuración de reglas de stop loss, la adición de filtros de indicadores, etc.

Código Fuente de la Estrategia
/*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)