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