En la carga de los recursos... Cargando...

Estrategia avanzada de captura de tendencias cuantitativas con filtro de rango dinámico

El autor:¿ Qué pasa?, fecha: 2024-12-17 14:31:11
Las etiquetas:El EMA- ¿Qué es?RFVOLLa SMAH.A.

img

Resumen general

Esta estrategia es un sistema de negociación cuantitativo avanzado que combina promedios móviles con un filtro de rango dinámico. Identifica las tendencias del mercado analizando la relación entre los movimientos de precios y el volumen de negociación, mientras utiliza un filtro de rango para eliminar señales falsas y mejorar la precisión de la negociación. La estrategia emplea métodos de cálculo adaptativos para determinar los límites de liquidez del mercado y combina promedios móviles rápidos y lentos para confirmar las direcciones de la tendencia.

Principios de estrategia

La lógica central de la estrategia se basa en los siguientes cálculos clave:

  1. Análisis de liquidez: evalúa la liquidez del mercado calculando la relación entre el volumen y el movimiento de precios y establece límites dinámicos de liquidez.
  2. Confirmación de tendencia: utiliza promedios móviles exponenciales (EMA) de 50 y 100 períodos para confirmar la dirección de la tendencia.
  3. Filtración de rango: emplea un período de muestreo de 50 períodos y un multiplicador de rango de 3x para construir rangos de negociación dinámicos.
  4. Generación de señales: genera señales comerciales cuando el precio rompe el filtro de rango y los indicadores EMA muestran tendencias consistentes.

Ventajas estratégicas

  1. Gran adaptabilidad: la estrategia puede ajustar dinámicamente los parámetros en función de las condiciones del mercado, adaptándose a diferentes entornos de mercado.
  2. Señales fiables: reduce eficazmente las señales falsas mediante la combinación de múltiples indicadores técnicos y filtros.
  3. Gestión integral del riesgo: integra el cálculo automático de las posiciones de stop-loss para un control eficaz del riesgo.
  4. Funcionalidad completa de backtesting: incluye configuraciones detalladas de backtesting para la optimización de la estrategia.

Riesgos estratégicos

  1. Sensibilidad de parámetros: múltiples parámetros requieren ajuste fino y son propensos a la sobre-optimización.
  2. Impacto del deslizamiento: puede enfrentar un riesgo significativo de deslizamiento en mercados altamente volátiles.
  3. Adaptabilidad al mercado: puede generar frecuentes señales falsas en mercados variados.
  4. Gestión de capital: el método de asignación de capital fijo puede no adaptarse a todas las condiciones del mercado.

Direcciones para la optimización de la estrategia

  1. Adaptación de parámetros: introducir mecanismos de ajuste de parámetros adaptativos para el ajuste automático de parámetros basados en las condiciones del mercado.
  2. Reconocimiento del estado del mercado: añadir módulos de identificación del estado del mercado para aplicar diferentes estrategias comerciales en diferentes condiciones de mercado.
  3. Optimización de la gestión de capital: Implementar el tamaño dinámico de las posiciones basado en la volatilidad del mercado.
  4. Mejora del filtro de señal: añadir más indicadores técnicos para filtrar señales falsas.

Resumen de las actividades

La estrategia construye un sistema comercial cuantitativo completo mediante la combinación de análisis de liquidez, seguimiento de tendencias y filtrado de rango. Sus fortalezas se encuentran en su capacidad para adaptarse a los cambios del mercado y proporcionar señales comerciales confiables, al tiempo que requiere atención a la optimización de parámetros y gestión de riesgos. A través de la optimización y mejora continuas, la estrategia muestra promesa en el mantenimiento de un rendimiento estable en diferentes entornos de mercado.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Killer Coin V2 + Range Filter Strategy", shorttitle="KC-RF Strategy", overlay=true
         )

// === INPUT BACKTEST RANGE ===
useDate = input(true, title='---------------- Use Date ----------------', group="Backtest Settings")
FromMonth = input.int(7, title="From Month", minval=1, maxval=12, group="Backtest Settings")
FromDay = input.int(25, title="From Day", minval=1, maxval=31, group="Backtest Settings")
FromYear = input.int(2019, title="From Year", minval=2017, group="Backtest Settings")
ToMonth = input.int(1, title="To Month", minval=1, maxval=12, group="Backtest Settings")
ToDay = input.int(1, title="To Day", minval=1, maxval=31, group="Backtest Settings")
ToYear = input.int(9999, title="To Year", minval=2017, group="Backtest Settings")
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() => time >= start and time <= finish

// === KILLER COIN V2 INPUTS ===
outlierThreshold = input.int(10, "Outlier Threshold Length", group="Killer Coin Settings")
fastMovingAverageLength = input.int(50, "Fast MA length", group="Killer Coin Settings")
slowMovingAverageLength = input.int(100, "Slow MA length", group="Killer Coin Settings")

// === RANGE FILTER INPUTS ===
sources = input(close, "Source", group="Range Filter Settings")
isHA = input(false, "Use HA Candles", group="Range Filter Settings")
per = input.int(50, "Sampling Period", minval=1, group="Range Filter Settings")
mult = input.float(3.0, "Range Multiplier", minval=0.1, group="Range Filter Settings")

// === KILLER COIN V2 CALCULATIONS ===
priceMovementLiquidity = volume / math.abs(close - open)
liquidityBoundary = ta.ema(priceMovementLiquidity, outlierThreshold) + ta.stdev(priceMovementLiquidity, outlierThreshold)
var liquidityValues = array.new_float(5)

if ta.crossover(priceMovementLiquidity, liquidityBoundary)
    array.insert(liquidityValues, 0, close)

fastEMA = ta.ema(array.get(liquidityValues, 0), fastMovingAverageLength)
slowEMA = ta.ema(array.get(liquidityValues, 0), slowMovingAverageLength)

// === RANGE FILTER CALCULATIONS ===
src = isHA ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, sources) : sources

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t*2) - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.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

// === PLOTTING ===
// Killer Coin V2 Plots
bullColor = color.new(#00ffbb, 50)
bearColor = color.new(#800080, 50)
fastPlot = plot(fastEMA, "Fast EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
slowPlot = plot(slowEMA, "Slow EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
fill(fastPlot, slowPlot, color = fastEMA > slowEMA ? bullColor : bearColor)

// Range Filter Plots
filtcolor = upward > 0 ? color.new(color.lime, 0) : downward > 0 ? color.new(color.red, 0) : color.new(color.orange, 0)
filtplot = plot(filt, "Range Filter", color=filtcolor, linewidth=3)
hbandplot = plot(hband, "High Target", color=color.new(color.aqua, 90))
lbandplot = plot(lband, "Low Target", color=color.new(color.fuchsia, 90))
fill(hbandplot, filtplot, color=color.new(color.aqua, 90))
fill(lbandplot, filtplot, color=color.new(color.fuchsia, 90))

// === STRATEGY CONDITIONS ===
// Range Filter Conditions
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

// Combined Conditions
finalLongSignal = longCondition and fastEMA > slowEMA and window()
finalShortSignal = shortCondition and fastEMA < slowEMA and window()

// === PLOTTING SIGNALS ===
plotshape(finalLongSignal, "Buy Signal", text="BUY", textcolor=color.white, 
         style=shape.labelup, size=size.normal, location=location.belowbar, 
         color=color.new(color.green, 0))
         
plotshape(finalShortSignal, "Sell Signal", text="SELL", textcolor=color.white, 
         style=shape.labeldown, size=size.normal, location=location.abovebar, 
         color=color.new(color.red, 0))

// === STRATEGY ENTRIES ===
if finalLongSignal
    strategy.entry("Long", strategy.long, stop=hband)
    
if finalShortSignal
    strategy.entry("Short", strategy.short, stop=lband)

// === ALERTS ===
alertcondition(finalLongSignal, "Strong Buy Signal", "🚨 Buy - Both Indicators Aligned!")
alertcondition(finalShortSignal, "Strong Sell Signal", "🚨 Sell - Both Indicators Aligned!")

Relacionados

Más.