Estrategia de negociación de impulso recurrente

El autor:¿ Qué pasa?, fecha: 2024-01-31 16:56:31
Las etiquetas:

img

Resumen general

Esta estrategia es una estrategia de seguimiento de tendencias y ruptura basada en el indicador de bandas recursivas desarrollado por alexgrover.

Estrategia lógica

Cálculo del indicador de bandas recursivas

El indicador de bandas recursivas consta de una banda superior, una banda inferior y una línea media.

Bandas superiores = Max ((Bar anterior bandas superiores, precio de cierre + nLa volatilidad Bandas inferiores = Min(Banda inferior de la barra anterior, precio de cierre - nLa volatilidad Línea media = (banda superior + banda inferior) / 2

Aquí n es un coeficiente de escala, y la volatilidad se puede elegir entre ATR, desviación estándar, rango verdadero medio o un método especial de RFV. El parámetro de longitud controla la sensibilidad, los valores más grandes hacen que el indicador se active con menos frecuencia.

Reglas de negociación

La estrategia comprueba primero si la banda inferior y la banda superior están en tendencia en la misma dirección para evitar fallas.

Cuando el precio se rompe por debajo de la banda inferior, ir largo. Cuando el precio se rompe por encima de la banda superior, ir corto.

Además, se implementa la lógica de stop loss.

Análisis de ventajas

Las ventajas de esta estrategia son:

  1. Cálculo eficiente de los indicadores utilizando un marco recursivo, evitando el cálculo repetido
  2. Ajuste flexible de los parámetros para adaptarse a los diferentes regímenes de mercado
  3. Combinar tendencia y ruptura, evitando las falsas rupturas
  4. Los filtros de estado de impulso aseguran la calidad de la señal

Análisis de riesgos

También hay algunos riesgos con esta estrategia:

  1. La configuración inadecuada de los parámetros puede dar lugar a un exceso de operaciones o a una mala calidad de la señal.
  2. Puede sufrir grandes pérdidas cuando se producen cambios importantes en la tendencia
  3. El control insuficiente del deslizamiento en movimientos extremos puede amplificar las pérdidas

Estos riesgos se pueden gestionar mediante la optimización de parámetros, la aplicación de stop loss, el aumento del umbral de deslizamiento, etc.

Direcciones de optimización

Algunas direcciones para optimizar la estrategia:

  1. Incorporar indicadores a través de múltiples plazos para la robustez
  2. Añadir módulo de aprendizaje automático para la optimización de parámetros adaptativos
  3. Realizar análisis de correlación cuantitativa para encontrar combinaciones óptimas de parámetros
  4. Utilice el aprendizaje profundo para predecir las trayectorias de precios y mejorar la precisión de la señal

Conclusión

En resumen, esta es una estrategia de seguimiento de tendencias muy práctica y eficiente. Combina el marco recursivo para la eficiencia computacional, utiliza soporte/resistencia de tendencia para determinar tendencias principales, agrega condiciones de impulso para filtrar fallas y garantizar la calidad de la señal. Con el ajuste adecuado de parámetros y el control de riesgos, puede lograr buenos resultados. Merece más investigación y optimización para adaptarse a regímenes de mercado más complejos.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=5
// Original indicator by alexgrover
strategy('Extended Recursive Bands Strategy', overlay=true, commission_type=strategy.commission.percent,commission_value=0.06,default_qty_type =strategy.percent_of_equity,default_qty_value = 100,initial_capital =1000)
length = input.int(260, step=10, title='Length')
src = input(close, title='Source')
method = input.string('Classic', options=['Classic', 'Atr', 'Stdev', 'Ahlr', 'Rfv'], title='Method')
bandDirectionCheck = input.bool(true, title='Bands Hold Direction')
lookback = input(3)
//----
atr = ta.atr(length)
stdev = ta.stdev(src, length)
ahlr = ta.sma(high - low, length)
rfv = 0.
rfv := ta.rising(src, length) or ta.falling(src, length) ? math.abs(ta.change(src)) : rfv[1]
//-----
f(a, b, c) =>
    method == a ? b : c
v(x) =>
    f('Atr', atr, f('Stdev', stdev, f('Ahlr', ahlr, f('Rfv', rfv, x))))
//----
sc = 2 / (length + 1)
a = 0.
a := math.max(nz(a[1], src), src) - sc * v(math.abs(src - nz(a[1], src)))
b = 0.
b := math.min(nz(b[1], src), src) + sc * v(math.abs(src - nz(b[1], src)))
c = (a+b)/2

// Colors
beColor = #675F76
buColor = #a472ff

// Plots
pA = plot(a, color=color.new(beColor, 0), linewidth=2, title='Upper Band')
pB = plot(b, color=color.new(buColor, 0), linewidth=2, title='Lower Band')
pC = plot(c, color=color.rgb(120,123,134,0), linewidth=2, title='Middle Band')
fill(pC, pA, color=color.new(beColor,90))
fill(pC, pB, color=color.new(buColor,90))

// Band keeping direction
// By Adulari
longc = 0
shortc = 0
for i = 0 to lookback-1
    if b[i] > b[i+1]
        longc:=longc+1
    if a[i] < a[i+1]
        shortc:=shortc+1
bhdLong = if bandDirectionCheck
    longc==lookback
else
    true
bhdShort = if bandDirectionCheck
    shortc==lookback
else
    true

// Strategy
if b>=low and bhdLong
    strategy.entry(id='Long',direction=strategy.long)
if high>=a and bhdShort
    strategy.entry(id='Short',direction=strategy.short)

// TP at middle line
//if low<=c and strategy.position_size<0 and strategy.position_avg_price>close
    //strategy.exit(id="Short",limit=close)
//if high>=c and strategy.position_size>0 and strategy.position_avg_price<close
    //strategy.exit(id="Long",limit=close)

Más.