Estrategia de ruptura de la volatilidad

El autor:¿ Qué pasa?, fecha: 2023-12-13 14:36:04
Las etiquetas:

img

Resumen general

La estrategia de ruptura de volatilidad es una estrategia que hace operaciones de compra y venta cuando los precios rompen los niveles de soporte o resistencia clave en los patrones de volatilidad.

Principio de la estrategia

Esta estrategia se basa principalmente en Bollinger Middle Band, 48 días Simple Moving Average (SMA), MACD y ADX cuatro indicadores técnicos.

  1. Considerar las oportunidades de negociación cuando el precio de cierre se cruce por encima o por debajo de la SMA de 48 días;

  2. Cuando el precio de cierre rompe la banda media de Bollinger, sirve como señal de entrada;

  3. El MACD mayor o menor a 0 sirve como indicador auxiliar para determinar la dirección de la tendencia;

  4. ADX superior a 25 para filtrar los mercados que no están en tendencia.

Cuando se cumplan las cuatro condiciones anteriores, vaya largo o corto.

Ventajas de la estrategia

Se trata de una estrategia que combina indicadores de tendencia y volatilidad.

  1. La SMA de 48 días filtra las operaciones excesivamente frecuentes y bloquea las tendencias a mediano y largo plazo;

  2. La ruptura de la banda media de Bollinger comprende los puntos clave de ruptura de soporte/resistencia con una fuerte función de stop loss;

  3. El MACD juzga la dirección de las tendencias principales, evitando el comercio contra la tendencia;

  4. ADX filtra los mercados que no están en tendencia y mejora la tasa de ganancia de la estrategia.

En resumen, esta estrategia ha hecho optimizaciones en el control de la frecuencia de negociación, captar los puntos clave, determinar la dirección de la tendencia y filtrar los movimientos inválidos, por lo que tiene una tasa de ganancia relativamente alta.

Riesgos de la estrategia

Los principales riesgos de esta estrategia son:

  1. En los mercados volátiles, la banda media de Bollinger puede desencadenar demasiadas oportunidades de negociación, lo que conduce a una sobrecomercialización;

  2. El indicador ADX también presenta algunos errores en la determinación de tendencias y movimientos no válidos;

  3. Riesgo de extracción relativamente elevado, adecuado para inversores que puedan asumir un cierto nivel de riesgo.

Direcciones de optimización

Esta estrategia puede optimizarse aún más en los siguientes aspectos:

  1. Añadir el indicador ATR para establecer los puntos de pérdida de parada y reducir por pérdida de parada;

  2. Optimizar los parámetros de Bollinger para reducir la frecuencia de activación de la línea media;

  3. Se añadirán indicadores de volumen de operaciones o de fuerza de tendencia para determinar la fuerza de las tendencias, evitando operaciones de reversión débiles.

Resumen de las actividades

En resumen, esta estrategia de ruptura de la volatilidad es relativamente madura en su conjunto, capturando efectivamente puntos clave de negociación en mercados volátiles. Combina indicadores de tendencia y volatilidad, equilibrando entre riesgo y rendimiento.


/*backtest
start: 2023-12-11 00:00:00
end: 2023-12-12 00:00:00
period: 10m
basePeriod: 1m
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/
// © 03.freeman
//Volatility Traders Minds Strategy (VTM Strategy)
//I found this startegy on internet, with a video explaingin how it works.
//Conditions for entry:
//1 - Candles must to be above or bellow the 48 MA (Yellow line)
//2 - Candles must to break the middle of bollinger bands
//3 - Macd must to be above or bellow zero level;
//4 - ADX must to be above 25 level
//@version=4
strategy("Volatility Traders Minds Strategy (VTM Strategy)", shorttitle="VTM",overlay=true)
source = input(close)
//MA
ma48 = sma(source,48)
//MACD
fastLength = input(12)
slowlength = input(26)
MACDLength = input(9)

MACD = ema(source, fastLength) - ema(source, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

//BB

length = input(20, minval=1)
mult = input(2.0, minval=0.001, maxval=50)

basis = sma(source, length)
dev = mult * stdev(source, length)

upper = basis + dev
lower = basis - dev

//ADX
adxThreshold = input(title="ADX Threshold", type=input.integer, defval=25, minval=1)
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

sig = adx(dilen, adxlen)

//  Strategy: (Thanks to JayRogers)
// === STRATEGY RELATED INPUTS ===
//tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// the risk management inputs
inpTakeProfit   = input(defval = 0, title = "Take Profit Points", minval = 0)
inpStopLoss     = input(defval = 0, title = "Stop Loss Points", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss Points", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset Points", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// === STRATEGY - LONG POSITION EXECUTION ===
enterLong() => close>ma48 and close>basis and delta>0 and sig>adxThreshold  // functions can be used to wrap up and work out complex conditions
//exitLong() => jaw>teeth or jaw>lips or teeth>lips
strategy.entry(id = "Buy", long = true, when = enterLong() )    // use function or simple condition to decide when to get in
//strategy.close(id = "Buy", when = exitLong() )                  // ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===
enterShort() => close<ma48 and close<basis and delta<0 and sig>adxThreshold
//exitShort() => jaw<teeth or jaw<lips or teeth<lips
strategy.entry(id = "Sell", long = false, when = enterShort())
//strategy.close(id = "Sell", when = exitShort() )

// === STRATEGY RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Buy", from_entry = "Buy", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Sell", from_entry = "Sell", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

// === Backtesting Dates === thanks to Trost

testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testStopHour = input(23, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END

if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Más.