Estrategia de seguimiento de tendencias basada en ATR e índice de volatilidad

El autor:¿ Qué pasa?, fecha: 2024-01-04 15:31:34
Las etiquetas:

img

Resumen general

Esta estrategia utiliza el rango promedio verdadero (ATR) y el índice CHOP como los principales indicadores técnicos para identificar y rastrear tendencias.

Principio de la estrategia

  1. Utilice ATR para calcular el tamaño de la caja y construir el canal Renko para determinar la dirección de la tendencia del precio.

  2. Aplicar el índice CHOP para juzgar si el mercado es adecuado para la negociación. Este índice incorpora el precio más alto, el precio más bajo y ATR. Cuando está entre 38.2-61.8, indica una baja volatilidad del mercado; de lo contrario, indica una alta volatilidad y un mercado comercial inadecuado.

  3. Cuando el índice CHOP rompe el carril superior de 61.8, el precio entra en una tendencia a la baja. Si la EMA rápida a corto plazo también muestra que el precio está liderando, vaya corto. Por el contrario, cuando CHOP rompe el carril inferior de 38.2 y la EMA a corto plazo sube, vaya largo.

  4. Cuando el precio vuelva a entrar en el área de cinturón 38.2-61.8 de CHOP, cierre la posición con stop loss o tome ganancia.

Análisis de ventajas

Esta estrategia combina el juicio de tendencia y el control de la volatilidad, que pueden capturar las tendencias de precios y controlar los riesgos.

  1. El canal Renko construido por ATR puede rastrear eficazmente las tendencias de los precios.

  2. El índice CHOP juzga la tasa de volatilidad del mercado para evitar operaciones incorrectas en fluctuaciones violentas.

  3. La combinación de una EMA rápida para determinar la dirección de la tendencia a corto plazo evita una operación inversa.

  4. La estrategia stop loss/take profit controla una sola pérdida.

Análisis de riesgos

Los principales riesgos a los que se enfrenta esta estrategia:

  1. En el mercado lateral, el canal ATR y las señales CHOP pueden producir señales incorrectas.

  2. La combinación de indicadores técnicos únicos no puede evitar completamente las pérdidas, ya que se necesita una intervención manual para determinar las principales tendencias.

  3. La posición de stop loss demasiado suelta puede conducir a una pérdida única de gran tamaño.

Dirección de optimización

Esta estrategia puede optimizarse en los siguientes aspectos:

  1. Aumente otros indicadores auxiliares para determinar las señales, como patrones de velas, volumen, etc. para mejorar la precisión de la señal.

  2. Optimizar los parámetros de ATR y CHOP para captar mejor las fluctuaciones de precios.

  3. Establecer posiciones dinámicas de stop loss/take profit para obtener mayores márgenes de ganancia y un stop loss más rápido.

  4. Se debe aflojar adecuadamente el rango de stop loss después de determinar la tendencia principal para obtener más ganancias en la tendencia.

Conclusión

Esta estrategia integra indicadores técnicos de uso común y es simple y práctica. Con el ajuste y la optimización de parámetros, se pueden obtener efectos de seguimiento satisfactorios. Pero aún requiere un juicio manual de las principales tendencias y no se puede automatizar completamente. Puede servir como una herramienta de toma de decisiones auxiliar y referencia para otras estrategias.


/*backtest
start: 2022-12-28 00:00:00
end: 2024-01-03 00:00:00
period: 1d
basePeriod: 1h
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/
// © sharatgbhat

//@version=4
strategy("Weis Chop Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 10,max_lines_count = 500, max_labels_count = 500)
maxIdLossPcnt = input(1, "Max Intraday Loss(%)", type=input.float)
// strategy.risk.max_intraday_loss(maxIdLossPcnt, strategy.percent_of_equity)

method = input(defval="ATR", options=["ATR", "Traditional", "Part of Price"], title="Renko Assignment Method")
methodvalue = input(defval=14.0, type=input.float, minval=0, title="Value")
pricesource = input(defval="Close", options=["Close", "Open / Close", "High / Low"], title="Price Source")
useClose = pricesource == "Close"
useOpenClose = pricesource == "Open / Close" or useClose
useTrueRange = input(defval="Auto", options=["Always", "Auto", "Never"], title="Use True Range instead of Volume")
isOscillating = input(defval=false, type=input.bool, title="Oscillating")
normalize = input(defval=false, type=input.bool, title="Normalize")
vol = useTrueRange == "Always" or useTrueRange == "Auto" and na(volume) ? tr : volume
op = useClose ? close : open
hi = useOpenClose ? close >= op ? close : op : high
lo = useOpenClose ? close <= op ? close : op : low

if method == "ATR"
    methodvalue := atr(round(methodvalue))
if method == "Part of Price"
    methodvalue := close / methodvalue

currclose = float(na)
prevclose = nz(currclose[1])
prevhigh = prevclose + methodvalue
prevlow = prevclose - methodvalue
currclose := hi > prevhigh ? hi : lo < prevlow ? lo : prevclose

direction = int(na)
direction := currclose > prevclose ? 1 : currclose < prevclose ? -1 : nz(direction[1])
directionHasChanged = change(direction) != 0
directionIsUp = direction > 0
directionIsDown = direction < 0

barcount = 1
barcount := not directionHasChanged and normalize ? barcount[1] + barcount : barcount
vol := not directionHasChanged ? vol[1] + vol : vol
res = barcount > 1 ? vol / barcount : vol

plot(isOscillating and directionIsDown ? -res : res, style=plot.style_columns, color=directionIsUp ? color.green : color.red, transp=75, linewidth=3, title="Wave Volume")

length = input(14, minval=1)
ci = 100 * log10(sum(atr(1), length) / (highest(length) - lowest(length))) / log10(length)
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(ci, "CHOP", color=#2962FF, offset = offset)
band1 = hline(61.8, "Upper Band", color=#787B86, linestyle=hline.style_dashed)
band0 = hline(38.2, "Lower Band", color=#787B86, linestyle=hline.style_dashed)
fill(band1, band0, color = color.rgb(33, 150, 243, 90), title = "Background")

MomentumBull = close>ema(close,8)
MomentumBear = close<ema(close,8)
Tradecon = crossunder(ci,61.8)

if (MomentumBull and directionIsUp and Tradecon)
	strategy.entry("Buy", strategy.long)
if (MomentumBear and directionIsDown and Tradecon )
    strategy.entry("Sell", strategy.short)
    strategy.exit("exit","Buy",when=directionIsDown,qty_percent=100,profit=20,loss=10)
    strategy.exit("exit","Sell",when=directionIsUp,qty_percent=100,profit=20,loss=10)
    

Más.