Estrategia de absorción de la volatilidad en dos direcciones

El autor:¿ Qué pasa?, Fecha: 2023-11-21 12:04:19
Las etiquetas:

img

Resumen general

Esta estrategia es una estrategia de negociación de doble dirección que rastrea la volatilidad. Utiliza el indicador Average True Range (ATR) para establecer las pérdidas de parada y determina la dirección de la tendencia basada en el precio que rompe el nivel de pérdida de parada.

Estrategia lógica

La estrategia utiliza ATR de 3 días para calcular la volatilidad. El valor de ATR multiplicado por un coeficiente se utiliza como el nivel de stop loss. Cuando el precio está por encima del nivel de stop loss, lo juzga como una tendencia alcista y cierra posiciones largas cuando el precio cae por debajo del nivel de stop loss. Cuando el precio está por debajo del nivel de stop loss, lo juzga como una tendencia bajista y cierra posiciones cortas cuando el precio se eleva por encima del nivel de stop loss.

Análisis de ventajas

  • Utiliza ATR para realizar un seguimiento dinámico de la volatilidad del mercado y reducir la probabilidad de que se produzca un stop loss
  • Los beneficios de las operaciones bidireccionales derivados de las fluctuaciones del mercado
  • Se abren posiciones inversas temprano en los cambios de tendencia para una mayor tasa de ganancia

Análisis de riesgos

  • La volatilidad extrema puede causar que el stop loss falle a medida que el ATR se retrasa
  • El riesgo de GAP existe para las posiciones largas
  • Puede operar con pequeñas ganancias con frecuencia

Para mitigar los riesgos: aumentar el coeficiente ATR para niveles de parada más amplios, limitar la frecuencia de operaciones, establecer niveles mínimos de toma de ganancias, etc.

Direcciones de optimización

  • Combinar otros indicadores para señales de cambio de tendencia
  • Optimización de los parámetros ATR
  • Añadir el control de tamaño de la operación

Resumen de las actividades

Esta es una estrategia general estable de parada de seguimiento de doble dirección. ATR establece niveles de parada dinámicos para controlar las reducciones. La negociación de doble dirección también aumenta las posibilidades de ganancia.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("BCH Swinger v1", overlay=true, commission_value = 0.25, default_qty_type=strategy.percent_of_equity, default_qty_value = 100)

/////////////////////////////////////////////////////////////
//START - SET DATE RANGE

// === BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1)
FromDay   = input(defval = 1, title = "From Day", minval = 1)
FromYear  = input(defval = 2017, title = "From Year")
ToMonth   = input(defval = 10, title = "To Month", minval = 1)
ToDay     = input(defval = 01, title = "To Day", minval = 1)
ToYear    = input(defval = 2020, title = "To Year")

startDate = time > timestamp(FromYear, FromMonth, FromDay, 1, 1)
endDate = time < timestamp(ToYear, ToMonth, ToDay, 23, 59)
withinTimeRange = true

/////////////////////////////////////////////////////////////
//END - SET DATE RANGE



/////////////////////////////////////////////////////////////
//START - INDICATORS

length = input(3)
mult = input(1, minval = 0.01)
atr_ = atr(length)
max1 = max(nz(max_[1]), close)
min1 = min(nz(min_[1]), close)
is_uptrend_prev = nz(is_uptrend[1], true)
stop = is_uptrend_prev ? max1 - mult * atr_ : min1 + mult * atr_
vstop_prev = nz(vstop[1])
vstop1 = is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop)
is_uptrend = close - vstop1 >= 0
is_trend_changed = is_uptrend != is_uptrend_prev
max_ = is_trend_changed ? close : max1
min_ = is_trend_changed ? close : min1
vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1
plot(vstop, color = is_uptrend ? yellow : red, style=circles, linewidth=2)

/////////////////////////////////////////////////////////////
//END - INDICATORS



/////////////////////////////////////////////////////////////
//START - TRADING RULES
direction = input(defval=1, title = "Strategy Direction",  minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

condition1 = close > vstop and withinTimeRange
condition2 = close < vstop and withinTimeRange

strategy.entry("BUY", strategy.long, when = condition1)
strategy.entry("SELL", strategy.short, when = condition2)

/////////////////////////////////////////////////////////////
//END - TRADING RULES

Más.