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

EMA MA RF VOL SMA HA
Fecha de creación: 2024-12-17 14:31:11 Última modificación: 2024-12-17 14:31:11
Copiar: 4 Número de Visitas: 420
1
Seguir
1617
Seguidores

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

Descripción general

La estrategia es un sistema de comercio cuantitativo avanzado que combina una media móvil y un filtro de rango dinámico. Identifica las tendencias del mercado principalmente mediante el análisis de la relación entre los cambios en los precios y el volumen de transacciones, mientras que utiliza un filtro de rango para filtrar falsas señales y mejorar la precisión de las transacciones. La estrategia utiliza métodos de cálculo adaptados para determinar los límites de la liquidez del mercado y combina una media móvil rápida y lenta para confirmar la dirección de la tendencia.

Principio de estrategia

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

  1. Análisis de la liquidez: para evaluar la liquidez del mercado mediante el cálculo de la relación entre el volumen de transacciones y los cambios en los precios, y establecer límites de liquidez dinámicos.
  2. Confirmación de tendencias: Utiliza una media móvil indexada de 50 y 100 ciclos (EMA) para confirmar la dirección de la tendencia.
  3. Filtrado de rango: Se utiliza un ciclo de muestreo de 50 ciclos y un multiplicador de rango de 3 veces para construir un rango de comercio dinámico.
  4. Generación de señales: genera una señal de negociación cuando el precio rompe el filtro de rango y el indicador EMA muestra una tendencia consistente.

Ventajas estratégicas

  1. Adaptabilidad: La estrategia puede ajustar los parámetros de forma dinámica en función de las condiciones del mercado para adaptarse a diferentes entornos de mercado.
  2. La fiabilidad de la señal: La combinación de varios indicadores técnicos y filtros reduce efectivamente la señal falsa.
  3. Gestión de riesgos: integra el cálculo automático de las posiciones de stop loss, lo que permite controlar el riesgo de manera efectiva.
  4. Función de retroalimentación completa: contiene configuraciones de retroalimentación detalladas para facilitar la optimización de la estrategia.

Riesgo estratégico

  1. Sensibilidad a los parámetros: los parámetros de una estrategia necesitan un ajuste preciso y son susceptibles a una optimización excesiva.
  2. Efectos del deslizamiento: En mercados con mucha volatilidad, puede haber un mayor riesgo de deslizamiento.
  3. Adaptabilidad del mercado: Las falsas señales pueden ser frecuentes en el mercado horizontal.
  4. Administración de fondos: La distribución de fondos fijos puede no ser adecuada para todas las condiciones del mercado.

Dirección de optimización de la estrategia

  1. Adaptación de parámetros: Se puede introducir un mecanismo de ajuste de parámetros de adaptación para que los parámetros se ajusten automáticamente según la situación del mercado.
  2. Identificación del estado del mercado: agregar módulos para juzgar el estado del mercado y adoptar diferentes estrategias de negociación en diferentes condiciones de mercado.
  3. Optimización de la gestión de fondos: Introducción de la gestión dinámica de posiciones, ajustando el tamaño de las operaciones según la volatilidad del mercado.
  4. Mejora de la filtración de señales: Se pueden agregar más indicadores técnicos para filtrar señales falsas.

Resumir

La estrategia combina análisis de liquidez, seguimiento de tendencias y filtros de rango para construir un sistema de negociación cuantitativo completo. Su ventaja reside en su capacidad para adaptarse a los cambios en el mercado y proporcionar señales de negociación confiables, pero también requiere atención a la optimización de parámetros y la gestión de riesgos.

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