Estratégia de ruptura do momento de compressão

Autora:ChaoZhang, Data: 2024-01-30 17:33:49
Tags:

img

Resumo

Esta é uma estratégia de negociação quantitativa desenvolvida com base no indicador Momentum Squeeze da LazyBear. A estratégia integra Bandas de Bollinger, Canais de Keltner e indicadores de momento para alcançar uma negociação de ruptura de momento de alta taxa de ganho através da combinação de vários indicadores técnicos.

Estratégia lógica

O indicador central desta estratégia é o indicador Momentum Squeeze da LazyBear. Este indicador determina se as Bandas de Bollinger estão sendo espremidas pelos Canais de Keltner. Quando o espremimento ocorre, ele representa que o mercado entrou em um ponto de ruptura potencial. Combinando a direção do indicador de momento, os negócios podem ser feitos quando o espremimento é liberado para capturar o surto do mercado.

Especificamente, a estratégia primeiro calcula as Bandas de Bollinger de 21 períodos, com uma largura de 2 desvios padrão do preço. Ao mesmo tempo, calcula os Canais de Keltner de 20 períodos, com uma largura de 1,5 vezes a amplitude do preço. Quando as Bandas de Bollinger são espremidas pelos Canais de Keltner, um sinal de espremimento é acionado. Além disso, a estratégia também calcula o momento do preço em relação ao ponto médio de seu próprio canal de preços durante um período de tempo. Quando ocorre um aperto, combinado com a direcionalidade do indicador de momento, determina se comprar ou vender.

Para as saídas, quando a cor do indicador de momento muda para cinza, representa que o estado de compressão terminou e a tendência pode reverter-se.

Vantagens

  1. Integra vários indicadores técnicos para melhorar a precisão

Ao avaliar a relação global entre estes indicadores, pode-se melhorar a precisão das decisões de negociação e reduzir a probabilidade de operações erradas.

  1. Pontos de compressão de momento precisos com grande potencial de lucro

A estratégia de aperto de momentum pode capturar pontos-chave onde o mercado é provável que estoure. Estes pontos são muitas vezes pontos de inflexão onde o mercado faz importantes julgamentos direcionais. Se julgado corretamente, o movimento subsequente do mercado será relativamente longo, de modo que o espaço de lucro potencial da estratégia é grande.

  1. Alcançar uma taxa de sucesso elevada na negociação de breakout

Em comparação com a negociação de ruptura aleatória, o ponto de entrada selecionado por esta estratégia é no ponto de compressão entre as Bandas de Bollinger e os Canais de Keltner.

Riscos

  1. Risco de configuração incorreta dos parâmetros

Os parâmetros do ciclo e os parâmetros da largura de banda das bandas de Bollinger e dos canais de Keltner têm um grande impacto nos resultados de negociação.

  1. Risco de falha de ruptura

Existe sempre o risco de o preço voltar a subir após a ruptura do ponto selecionado por esta estratégia, causando uma perda.

  1. Risco de inversão da tendência

Quando o estado de compressão termina, esta estratégia fechará todas as posições. No entanto, às vezes a tendência de preço ainda pode continuar, o que representa o risco de saída prematura. A lógica de saída precisa ser otimizada.

Orientações de otimização

  1. Optimize as configurações dos parâmetros

Através de mais testes de dados de backtesting, melhores configurações de parâmetros de ciclo e largura de banda podem ser encontradas para melhorar o desempenho da estratégia.

  1. Adicionar estratégia de stop loss

Configure paradas em movimento ou oscilantes para cortar rapidamente as perdas quando os preços revertem.

  1. Adicionar condições de reentrada

Quando a estratégia sai das posições, podem ser definidas certas condições de reentrada para reentrada no mercado se a tendência continuar.

  1. Incorporar mais indicadores

Tentar incorporar mais indicadores de diferentes tipos, tais como outros indicadores de volatilidade, indicadores de volume, etc., para estabelecer uma estratégia composta de integração de indicadores, de modo a melhorar a precisão das decisões.

Resumo

A estratégia integra Bandas de Bollinger, Canais de Keltner e indicadores de momento. Ao julgar as relações entre esses indicadores, entra em pontos de ruptura de alta taxa de sucesso. Há espaços de otimização em muitos aspectos, como otimização de parâmetros, estratégias de stop loss, condições de reentrada e integração de indicadores compostos para melhorar ainda mais o desempenho da estratégia.


/*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")

Mais.