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.
O indicador central desta estratégia é o indicador Momentum Squeeze da LazyBear. Este indicador determina se as Bandas de Bollinger estão sendo
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
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.
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.
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.
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.
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.
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.
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.
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.
Configure paradas em movimento ou oscilantes para cortar rapidamente as perdas quando os preços revertem.
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.
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.
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")