Estrategia de compresión del momentum basada en bandas de Bollinger y canales de Kalkin


Fecha de creación: 2024-01-30 17:33:49 Última modificación: 2024-01-30 17:33:49
Copiar: 0 Número de Visitas: 869
1
Seguir
1617
Seguidores

Estrategia de compresión del momentum basada en bandas de Bollinger y canales de Kalkin

Descripción general

Se trata de una estrategia de trading cuantitativa desarrollada basándose en el indicador de extorsión de dinámica de LazyBear. La estrategia integra la banda de Bryn, el canal de Kalkin y el indicador de dinámica, para lograr una combinación de indicadores técnicos que permiten un alto índice de ganancias en las operaciones de ruptura de dinámica.

Principio de estrategia

El indicador central de esta estrategia es el indicador de la presión de LazyBear. Este indicador determina si el cinturón de Brin ha sido comprimido por el canal de Kalkin, y cuando ocurre la presión, representa que el mercado está entrando en un punto de explosión potencial.

Concretamente, la estrategia calcula primero la banda de Brin de 21 ciclos, con una amplitud de 2 veces la diferencia estándar del precio. Al mismo tiempo, se calcula el canal de Kalkin de 20 ciclos, con una amplitud de 1.5 veces la amplitud del precio. Cuando la banda de Brin es exprimiida por el anillo del canal de Kalkin, se emite una señal de expansión.

En la salida, la tendencia puede revertirse cuando el color del indicador de la dinámica se vuelve gris y se elimina la posición, lo que representa el fin del estado de expansión.

Ventajas estratégicas

  1. Integración de varios indicadores técnicos para mejorar la precisión de las decisiones comerciales

La estrategia integra el cinturón de Brin, el canal de Kalkin y los indicadores de dinámica, que pueden mejorar la precisión de las decisiones comerciales y reducir la probabilidad de transacciones erróneas al juzgar la relación integral de estos indicadores.

  1. La precisión de los puntos de extorsión del motor, con un gran potencial de ganancias

Las estrategias de extorsión de dinámica pueden capturar los puntos clave de las explosiones del mercado, que a menudo son los puntos de inflexión en los que el mercado toma decisiones importantes sobre la dirección, y si se hace correctamente, el período de operación posterior es más largo, por lo que la estrategia tiene un gran potencial de ganancias.

  1. Las transacciones de gran éxito

En comparación con los breakouts aleatorios, los puntos de entrada seleccionados por la estrategia se encuentran en los puntos de expansión de la Franja de Bryn y el Canal de Kalkin, lo que determina una alta tasa de éxito de las transacciones a través de la integración de indicadores.

Riesgo estratégico

  1. Parámetros de configuración de riesgo de la franja de Bryn y el canal de Kalkin

Los parámetros de periodicidad y de ancho de banda de la banda de Bryn y el canal de Kalkin tienen un gran impacto en los resultados de las operaciones de la estrategia. Si los parámetros se establecen incorrectamente, puede causar error de juicio. Esto requiere encontrar el parámetro óptimo a través de una gran cantidad de repeticiones.

  1. El riesgo de fracaso

Cualquier breakout conlleva el riesgo de fracaso, y es posible que una vez que el precio haya superado el punto seleccionado por la estrategia, se vuelva a reajustar y cause pérdidas. Esto requiere un estricto control de pérdidas.

  1. Riesgo de inversión de tendencia

Cuando el estiramiento termina, la estrategia elimina todas las posiciones. Sin embargo, a veces la tendencia de los precios puede continuar, lo que genera el riesgo de una salida anticipada de la estrategia. Esto requiere optimizar la lógica de juicio de salida.

Dirección de optimización de la estrategia

  1. Ajuste de los parámetros de optimización

Se puede buscar un mejor ciclo de parámetros y una mejor configuración de ancho de banda para las bandas de Bryn y Calkin, a través de una mayor cantidad de datos de prueba de errores de retroalimentación, para mejorar la eficacia de la estrategia.

  1. Aumentar las estrategias de alto riesgo

Se puede configurar un stop móvil o un stop oscilante, que se detiene rápidamente cuando el precio se invierte para controlar el máximo retiro de la estrategia.

  1. Aumento de las condiciones de reingreso

Cuando la estrategia se retira de la posición, se pueden establecer ciertas condiciones de reingreso, y si la tendencia continúa, se puede volver a entrar en el campo.

  1. Combinado con más indicadores

Se puede intentar combinar más tipos diferentes de indicadores, como otros indicadores de volatilidad, indicadores de volumen de negocios, etc., para crear una estrategia de combinación de indicadores integrados para mejorar la precisión de la toma de decisiones.

Resumir

La estrategia integra el cinturón de Bryn, el canal de Calderón y los indicadores de dinámica, y al juzgar la relación de estos indicadores, selecciona los puntos de entrada de ruptura con una alta tasa de éxito. Hay espacio para la optimización en varios aspectos, como la optimización de los parámetros, la estrategia de parada de pérdidas, las condiciones de reingreso y la integración de indicadores compuestos.

Código Fuente de la Estrategia
/*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=4
//All credits to LazyBear. All I did was turn it into a strategy!

strategy(title = "SQZMOM STRAT", overlay=false)

// --- GENERAL INPUTS ---
FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2020, title = "From Year", minval = 2012)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
FromDay   = 1
ToDay     = 1
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

get_round(value, precision) => round(value * (pow(10, precision))) / pow(10, precision)
trade_leverage = input(1, title = "Trade - Leverage", step = 0.25)
trade_risk     = input(100, title = "Trade - Risk Percent", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
tradeType   = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH"])

// --- SQZMOM CODE

length = input(21, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")

useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool)

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

bcolor = color.gray
if (val > 0 and val > nz(val[1]))
    bcolor := color.green
if (val < 0 and val < nz(val[1]))
    bcolor := color.red

scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray 
plot(val, color=bcolor, style=plot.style_histogram, linewidth=4)
plot(0, color=scolor, style=plot.style_cross, linewidth=2)

// --- VWMA CODE ---
useVWMA        = input(false, title = "Use VWMA to selectively long/short?", type = input.bool)
lengthVWMA=input(42, title = "VWMA Length", step = 1, minval = 1)
useCV=input(false, type=input.bool, title="Use Cumulative Volume for VWMA?")
nbfs = useCV ? cum(volume) : sum(volume, lengthVWMA)
medianSrc=close

calc_evwma(price, lengthVWMA, nb_floating_shares) => data = (nz(close[1]) * (nb_floating_shares - volume)/nb_floating_shares) + (volume*price/nb_floating_shares)

m=calc_evwma(medianSrc, lengthVWMA, nbfs)


// ---STRATEGY---
if ((tradeType == "LONG" or tradeType == "BOTH") and (m>0 or useVWMA == false))
    longCondition = (val > 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (longCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("LONG", strategy.long, qty = contracts, when = window())
        
if((tradeType == "SHORT" or tradeType == "BOTH") and (m<0 or useVWMA == false))
    shortCondition = (val < 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (shortCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("SHORT", strategy.short, qty = contracts, when = window())

if (bcolor == color.gray)
    strategy.close("LONG")
    strategy.close("SHORT")