Estrategia de seguimiento de tendencias cuantitativas

El autor:¿ Qué pasa?, fecha: 2024-02-01 11:42:22
Las etiquetas:

img

Resumen general

Esta estrategia adopta múltiples indicadores como Bollinger Bands, RSI, ADX, MACD para juzgar las tendencias del mercado y tiene una fuerte capacidad de identificación de tendencias.

Principio de la estrategia

  • Utilice bandas de Bollinger para juzgar si el precio está cerca de la línea superior o inferior para determinar si se forma una tendencia
  • Combinar con el indicador RSI para evitar áreas de sobrecompra y sobreventa para evitar falsos breakouts
  • Usar ADX para determinar la fuerza de la tendencia y sólo señalar cuando la fuerza de la tendencia es fuerte
  • Adoptar el MACD para evaluar la coherencia de las tendencias a corto y largo plazo
  • Limitación a las sesiones de negociación para evitar los riesgos a un día

A través del juicio combinado de múltiples indicadores, puede identificar con precisión las tendencias de precios y realizar un seguimiento oportuno de ellas cuando se produce una tendencia para lograr rendimientos excesivos.

Análisis de ventajas

La mayor ventaja de esta estrategia es que el juicio de la combinación de indicadores es más completo y preciso, lo que permite identificar eficazmente las tendencias de precios y evitar señales falsas causadas por indicadores individuales.

En concreto, las ventajas son:

  1. Las bandas de Bollinger pueden determinar el rango y la fuerza de la fluctuación de precios
  2. RSI evita comprar en áreas de sobrecompra y vender en áreas de sobreventa
  3. ADX determina la fuerza de la tendencia, sólo sigue tendencias fuertes
  4. El MACD juzga la coherencia de los valores a corto y largo plazo
  5. Limitaciones de las sesiones de negociación para evitar los riesgos a un día

A través del juicio de combinación de indicadores, puede maximizar reducir las señales falsas y mejorar la estabilidad de la estrategia.

Análisis de riesgos

Los principales riesgos de esta estrategia provienen de:

  1. Eventos de mercado que provocan el fallo del indicador
  2. Las señales falsas frecuentes en los mercados de rango

En el caso del riesgo 1, la dependencia de múltiples indicadores puede mitigar en cierta medida el problema del fallo de un solo indicador, pero aún es necesario mejorar los mecanismos de gestión del riesgo.

Para el riesgo 2, los parámetros pueden ajustarse adecuadamente a un rango de operaciones estrecho y reducir la frecuencia de operaciones para mitigar los riesgos.

Direcciones de optimización

Los principales aspectos que pueden optimizarse de esta estrategia incluyen:

  1. Añadir mecanismos de stop loss como trailing stop loss, time stop loss, breakout stop loss, etc. para evitar retroceder demasiado profundamente
  2. Optimizar los parámetros, ajustar la combinación de parámetros del indicador para encontrar óptimo
  3. Añadir filtros como el filtro de volumen para evitar fallas falsas en un volumen bajo
  4. Incorporar más indicadores como KDJ, OBV para mejorar la precisión de la señal
  5. Adoptar métodos de aprendizaje automático para optimizar los parámetros

Mediante la optimización continua, mejorar continuamente la robustez de los parámetros y reducir las probabilidades de falsas señales.

Resumen de las actividades

En general, esta estrategia tiene una capacidad relativamente fuerte para identificar señales de tendencia a través de juicios de combinación de indicadores que pueden identificar eficazmente las tendencias de precios.

Pero también tiene ciertos riesgos, la gestión de riesgos y la optimización de parámetros deben mejorarse continuamente para operaciones estables a largo plazo.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 5h
basePeriod: 15m
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/
// © abilash.s.90


dIMinusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementMinus = 0.0
    dIMinus = 0.0
    trueRange = 0.0
    directionalMovementMinus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementMinus := nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementMinus := nz(smoothedDirectionalMovementMinus[1]) - (nz(smoothedDirectionalMovementMinus[1])/adxLen) + directionalMovementMinus
    
    dIMinus := smoothedDirectionalMovementMinus / smoothedTrueRange * 100
    
    dIMinus

dIPlusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementPlus = 0.0
    dIPlus =  0.0
    trueRange = 0.0
    directionalMovementPlus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementPlus := high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementPlus := nz(smoothedDirectionalMovementPlus[1]) - (nz(smoothedDirectionalMovementPlus[1])/adxLen) + directionalMovementPlus
    
    dIPlus := smoothedDirectionalMovementPlus / smoothedTrueRange * 100
    
    dIPlus
    
    
Adx(adxLen) =>
    dIPlus =  0.0
    dIMinus = 0.0
    dX = 0.0
    aDX = 0.0
    dIPlus := dIPlusCalc(adxLen)
    dIMinus := dIMinusCalc(adxLen)
    dX := abs(dIPlus-dIMinus) / (dIPlus+dIMinus)*100
    aDX := sma(dX, adxLen)
    
    aDX
    
BarInSession(sess) => time(timeframe.period, sess) != 0


//@version=4
strategy("Bollinger Band + RSI + ADX + MACD", overlay=true)

//Session

session = input(title="Trading Session", type=input.session, defval="0930-1500")

sessionColor = BarInSession(session) ? color.green : na

bgcolor(color=sessionColor, transp=95)

// Bollinger Bands
src = input(high, title="Bollinger Band Source", type=input.source)
length = input(3, minval=1, type=input.integer, title="Bollinger Band Length")
mult = input(4.989, minval=0.001, maxval=50, step=0.001, type=input.float, title="Bollinger Band Std Dev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev


plot(upper, title="Bollinger Band Upper", color=color.red)
plot(lower, title="Bollinger Band Lower", color=color.green)

// RSI
rsiSrc = input(close, title="RSI Source", type=input.source)
rsiLength = input(16, minval=1, type=input.integer, title="RSI Length")
rsiComparator = input(39.2, title="RSI Comparator", type=input.float, step=0.1)

rsi = rsi(rsiSrc, rsiLength)

// ADX
adxLength = input(14, minval=1, type=input.integer, title="ADX Length")
adxComparator = input(14, minval=1, type=input.integer, title="ADX Comparator")

adx = Adx(adxLength)

// Heikinashi

haClose = security(heikinashi(syminfo.ticker), timeframe.period, close)
haOpen = security(heikinashi(syminfo.ticker), timeframe.period, open)

nextHaOpen = (haOpen + haClose) / 2

//MACD

macdCalcTypeProcessed = input(title="MACD Source", type=input.source, defval=high)
fast = input(12, title="MACD Fast")
slow = input(20, title="MACD Slow")
signalLen = input(15, title="MACD Signal")

fastMA = ema(macdCalcTypeProcessed, fast)
slowMA = ema(macdCalcTypeProcessed, slow)
macd = fastMA - slowMA
signal = sma(macd, signalLen)



longCondition() =>
    (low < lower) and (rsi[0] > rsiComparator) and (adx > adxComparator) and (close > nextHaOpen) and BarInSession(session) and macd > signal

stop = (close - max((low - (low * 0.0022)), (close - (close * 0.0032)))) / syminfo.mintick
target = (max(upper, (close + (close * 0.0075))) - close) / syminfo.mintick


strategy.entry("SX,LE", strategy.long, when=longCondition(), comment="SX,LE")
strategy.close_all(when=(not BarInSession(session)))
strategy.exit("LX", from_entry="SX,LE", profit=target, loss=stop)


Más.