Estrategia cuantitativa de seguimiento de tendencias


Fecha de creación: 2024-02-01 11:42:22 Última modificación: 2024-02-01 11:42:22
Copiar: 0 Número de Visitas: 524
1
Seguir
1617
Seguidores

Estrategia cuantitativa de seguimiento de tendencias

Descripción general

La estrategia utiliza varios indicadores para juzgar la tendencia del mercado, como el Brin, el RSI, el ADX y el MACD, con una mayor capacidad de identificación de tendencias. Cuando la señal del indicador es al mismo tiempo alcista, se adopta una estrategia de seguimiento; cuando la señal del indicador es al mismo tiempo bajista, se detiene la posición.

Principio de estrategia

  • El uso de la banda de Brin para determinar si el precio está cerca de la banda de Brin para subir o bajar como base para determinar si se está formando una tendencia
  • Combine el RSI para determinar si está en una zona de sobrecompra y sobreventa para evitar falsas rupturas
  • Utiliza ADX para determinar la intensidad de la tendencia y emite señales solo cuando la tendencia es fuerte
  • El uso del MACD para determinar la consistencia de tendencias a corto y largo plazo
  • Combinado con el horario del día, solo se negocia en el horario de negociación especificado

Identificar con precisión las tendencias de los precios a través de una combinación de indicadores, rastrearlas a tiempo cuando se produzcan y obtener ganancias excedentarias.

Análisis de las ventajas

La mayor ventaja de esta estrategia es que la combinación de indicadores es más completa y precisa, lo que permite identificar de manera efectiva las tendencias de los precios y evitar falsas señales causadas por un solo indicador.

En concreto, las ventajas son:

  1. Las bandas de Brin pueden determinar el alcance y la fuerza de las fluctuaciones de los precios
  2. El RSI evita las zonas de sobrecompra y las zonas de sobreventa
  3. El ADX mide la intensidad de la tendencia, solo sigue la tendencia fuerte
  4. El MACD determina la coherencia de las líneas largas y cortas
  5. Limitar las horas de negociación para evitar riesgos nocturnos

La combinación de indicadores puede reducir al máximo las señales falsas y aumentar la estabilidad de la estrategia.

Análisis de riesgos

Los principales riesgos de esta estrategia provienen de:

  1. Un incidente hace que el indicador no funcione
  2. El terremoto generó muchas falsas señales.

Para el riesgo 1, debido a la dependencia de varios indicadores, se puede evitar en cierta medida el fallo de un solo indicador, pero aún se necesita mejorar el mecanismo de control de riesgos.

Para el riesgo 2, se pueden ajustar los parámetros de manera adecuada para reducir el intervalo de negociación, reducir la frecuencia de negociación y reducir el riesgo.

Dirección de optimización

Las principales áreas de optimización de la estrategia incluyen:

  1. Aumentar los mecanismos de deterioro, como el deterioro de movimiento, el deterioro de tiempo, el deterioro de ruptura, etc., para evitar el retroceso demasiado profundo
  2. Optimización de parámetros, ajuste de la combinación de parámetros indicadores y búsqueda de los mejores parámetros
  3. Aumentar las condiciones de filtración, como la filtración por volumen, para evitar falsas rupturas de pequeño volumen
  4. Combinación de más indicadores, como KDJ, OBV, etc., para mejorar la precisión de la señal
  5. Optimización automática de parámetros con métodos de aprendizaje automático

La robustez de los parámetros de la estrategia se mejora continuamente a través de la optimización continua, reduciendo la probabilidad de falsas señales.

Resumir

La estrategia en su conjunto tiene una gran capacidad para identificar señales de tendencia y, a través de una combinación de indicadores, puede identificar con eficacia las tendencias de los precios.

Sin embargo, también existe un cierto riesgo, que requiere la mejora continua del mecanismo de control de viento, la optimización continua de los parámetros, para que el funcionamiento estable a largo plazo. Si en el futuro se puede introducir métodos como el aprendizaje de máquina para lograr la optimización automática de los parámetros, se aumentará considerablemente la robustez y la capacidad de obtener ganancias de la estrategia.

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