Estratégia de compressão de momentum baseada em bandas de Bollinger e canais de Kalkin


Data de criação: 2024-01-30 17:33:49 última modificação: 2024-01-30 17:33:49
cópia: 0 Cliques: 869
1
focar em
1617
Seguidores

Estratégia de compressão de momentum baseada em bandas de Bollinger e canais de Kalkin

Visão geral

Trata-se de uma estratégia de negociação quantitativa desenvolvida com base no indicador de extrusão de momentum desenvolvido pela LazyBear. A estratégia integra a correia de Bryn, o canal de Kalkin e o indicador de momentum, permitindo negociações de ruptura de momentum de alta taxa de vitória por meio de uma combinação de vários indicadores técnicos.

Princípio da estratégia

O indicador central da estratégia é o LazyBear Momentum Squeeze Indicator. O indicador determina se a faixa de Bryn é esmagada pelo Calcinho de cálcio, e, quando a esmagamento ocorre, representa o mercado entrando em um ponto de ruptura potencial.

Especificamente, a estratégia primeiro calcula a faixa de Brin de 21 ciclos, com uma amplitude de 2 vezes a diferença padrão de preço. Além disso, a estratégia calcula o movimento do preço em relação ao ponto médio de seu próprio canal de preço durante um período de tempo.

Na saída, a tendência pode ser invertida quando a cor do indicador de dinamicidade se torna cinza, eliminando posições, representando o fim do estado de esmagamento.

Vantagens estratégicas

  1. Integração de vários indicadores técnicos para melhorar a precisão das decisões de negociação

A estratégia integra a faixa de Bryn, o canal de Kalkin e os indicadores de dinâmica, e pode melhorar a precisão das decisões de negociação e reduzir a probabilidade de transações erradas, julgando a relação entre esses indicadores.

  1. Ponto de extrusão de potência é preciso, com grande potencial de lucro

A estratégia de extrusão de momentum pode capturar pontos-chave de uma explosão de mercado, pontos que geralmente são pontos de inflexão em que o mercado toma decisões importantes sobre a direção. Se a decisão for correta, a operação de tendências subsequentes será mais longa, portanto, o potencial de lucro da estratégia é grande.

  1. Transações inovadoras com alta taxa de sucesso

Em comparação com as transações de ruptura aleatórias, o ponto de entrada escolhido para a estratégia está localizado no ponto de extrusão entre o cinturão de Bryn e o canal Kalkin, e a taxa de sucesso das transações é alta, a julgar pela integração dos indicadores.

Risco estratégico

  1. Parâmetros de configuração de risco da faixa de Bryn e do canal de Kalkin

Os parâmetros de periodicidade e de largura de banda dos canais de Bryn e Kalkin têm um grande impacto nos resultados das negociações estratégicas. Se os parâmetros forem mal definidos, isso pode levar a erros de julgamento. Isso requer um grande número de retrocessos para encontrar o melhor parâmetro.

  1. Risco de fracasso

Qualquer transação de ruptura tem o risco de fracasso, e quando o preço ultrapassa o ponto escolhido pela estratégia, há a possibilidade de um novo recall, causando perdas. Isso requer um rigoroso controle de perda.

  1. Risco de reversão de tendência

Quando o estado de esmagamento termina, a estratégia elimina todas as posições. Mas às vezes a tendência de preços pode continuar, o que cria o risco de uma estratégia de saída antecipada. Isso requer a otimização da lógica de julgamento de saída.

Direção de otimização da estratégia

  1. Optimizar configurações de parâmetros

Pode-se encontrar melhores configurações de períodos de parâmetros e de bandwidth para a banda de Bryn e o canal de Kalkin, através de um maior número de erros de teste de dados de retorno, a fim de melhorar a eficácia da estratégia.

  1. Aumentar a estratégia de stop loss

Pode-se configurar um stop móvel ou um stop oscilante, para parar rapidamente quando o preço se reverte, para controlar a retirada máxima da estratégia.

  1. Aumentar as condições de reentrada

Quando a estratégia sai da posição, pode-se definir uma condição de reentrada, que pode ser novamente inserida se a tendência continuar.

  1. Combinação de mais indicadores

Pode-se tentar combinar mais diferentes tipos de indicadores, como outros indicadores de volatilidade, indicadores de volume de negócios, etc., para criar uma estratégia de integração de indicadores para melhorar a precisão da decisão.

Resumir

A estratégia integra a banda de Bryn, o canal de Kalkin e os indicadores de força, e seleciona pontos de entrada de ruptura com alta taxa de sucesso, julgando a relação entre esses indicadores. Há espaço para otimização em vários aspectos, como otimização de parâmetros, estratégia de parada de prejuízo, condições de reentrada e integração de indicadores complexos.

Código-fonte 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")