
A estratégia baseia-se no indicador de compressão do LazyBear, combinado com os canais de Bryn e Keltner, para identificar a forma de compressão e expansão formada pelo canal de ruptura dos preços, para determinar a direção da tendência potencial do preço das ações e para determinar a direção da posição. A vantagem da estratégia é aproveitar ao máximo a capacidade do indicador de dinâmica de identificar a tendência potencial e configurar vários filtros condicionais para controlar a qualidade do sinal de negociação, que pode filtrar efetivamente os sinais de negociação indeterminados e evitar a negociação excessivamente frequente no conjunto do disco oscilante.
Calcule a média móvel simples do preço de fechamento de n dias para a linha central, a média móvel simples do preço de fechamento de n dias para a linha central, a média móvel simples do preço de fechamento de n dias para a linha central, a média média média média e a média média média, a média média média e a média média média, a média média média e a média média média.
Calcule a média, a linha superior e a linha inferior no canal de Keltner. A média é a média móvel simples do preço de fechamento de n dias. A linha superior e a linha inferior são a média móvel simples da amplitude real de n dias multiplicada por m.
A forma de compressão e expansão consiste em determinar se o preço atravessou a trajetória ascendente e descendente da faixa de Bryn e do canal Keltner. A forma de compressão é quando o preço atravessa a trajetória descendente de cima e a forma de expansão é quando o preço atravessa a trajetória de cima.
Calcule o valor da curva de regressão linear, como um indicador de momentum. Quando a linha de momentum passa por 0 é um sinal de compra e quando passa por 0 é um sinal de venda.
A combinação de forma de compressão e expansão, direção do indicador de movimento, filtro de valor médio e outros múltiplos critérios determinam o sinal de negociação final. Somente se todos os critérios forem atendidos, o sinal de negociação será gerado e as transações erradas serão evitadas.
A dupla filtragem de bandas de Bryn e de canais de Keltner permite identificar formas de compressão e expansão de alta qualidade.
O indicador de dinâmica é capaz de capturar a reversão da tendência de preços em tempo hábil, complementando o indicador de canal.
A entrada mais rápida permite uma maior oportunidade de lucro.
A utilização de múltiplos critérios de avaliação para evitar a abertura de posições frequentes em situações de turbulência.
Os parâmetros dos indicadores técnicos podem ser personalizados para diferentes variedades e combinações de parâmetros.
Pode-se definir um período de tempo de retorno para otimizar o teste para um determinado período de tempo.
Estratégias de acompanhamento de tendências, que são suscetíveis a perdas quando a tendência se inverte.
A configuração inadequada dos parâmetros pode causar uma frequência de transação excessiva ou má qualidade do sinal.
Dependendo de testes de dados históricos, não há garantia de que o retorno futuro será estável.
O mercado de ativos e os preços de ativos estão em alta devido a uma série de eventos inesperados.
A janela de tempo de detecção está mal configurada, o que pode levar a um excesso de compatibilidade.
Otimizar os parâmetros do cinturão de Bryn e do canal de Keltner para encontrar a melhor combinação.
Teste de adição de stop loss móvel para controlar o máximo de perdas em uma única transação.
Tente otimizar ainda mais em uma combinação de parâmetros específicos de variedade e ciclo.
A pesquisa inclui modelos de aprendizagem de máquina para avaliar a reversão da tendência.
Teste diferentes estratégias de entrada e gestão de posições.
Estudar como reconhecer sinais de reversão de tendência e parar o prejuízo a tempo.
A estratégia combina vários indicadores técnicos para determinar a direção da tendência dos preços e realizar o acompanhamento da tendência, com uma forte adaptabilidade. A frequência de negociação e a qualidade do sinal podem ser efetivamente controladas através da personalização de parâmetros e filtragem de múltiplas condições.
/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//Strategy based on LazyBear Squeeze Momentum Indicator
//I added some custom feature and filters
//
// @author LazyBear
// List of all my indicators:
// https://docs.google.com/document/d/15AGCufJZ8CIUvwFJ9W-IKns88gkWOKBCvByMEvm5MLo/edit?usp=sharing
// v2 - fixed a typo, where BB multipler was always stuck at 1.5. [Thanks @ucsgears]
//
strategy(shorttitle = "SQZMOM_LB", title="Strategy for Squeeze Momentum Indicator [LazyBear]", overlay=false, calc_on_every_tick=true, pyramiding=0,default_qty_type=strategy.percent_of_equity,default_qty_value=100,currency=currency.USD)
length = input(14, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(16, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
useTrueRange = input(true, title="Use TrueRange (KC)", type=bool)
//FILTERS
useExtremeOrders = input(false, title="Early entry on momentum change", type=bool)
useMomAverage = input(false, title="Filter for Momenutum value", type=bool)
MomentumMin = input(20, title="Min for momentum")
// Calculate BB
src = close
basis = sma(src, length)
dev = mult * stdev(src, length)
upperBB = basis + dev
lowerBB = basis - dev
// Calculate KC
ma = sma(src, 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(src - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)
bcolor = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : aqua
plot(val, color=bcolor, style=histogram, linewidth=4)
plot(0, color=scolor, style=cross, linewidth=2)
//LOGIC
//momentum filter
filterMom=useMomAverage?abs(val)>(MomentumMin/100000)?true:false:true
//standard condition
longCondition = scolor[1]!=aqua and scolor==aqua and bcolor==lime and filterMom
exitLongCondition = bcolor==green and not useExtremeOrders
shortCondition = scolor[1]!=aqua and scolor==aqua and bcolor==red and filterMom
exitShortCondition = bcolor==maroon and not useExtremeOrders
//early entry
extremeLong= useExtremeOrders and scolor==aqua and bcolor==maroon and bcolor[1]!=bcolor[0] and filterMom
exitExtLong = scolor==black or bcolor==red
extremeShort = useExtremeOrders and scolor==aqua and bcolor==green and bcolor[1]!=bcolor[0] and filterMom
exitExtShort = scolor==black or bcolor==lime
//STRATEGY
strategy.entry("SQ_Long", strategy.long, when = longCondition)
strategy.close("SQ_Long",when = exitLongCondition )
strategy.entry("SQ_Long_Ext", strategy.long, when = extremeLong)
strategy.close("SQ_Long_Ext",when = exitExtLong)
//strategy.exit("exit Long", "SQ_Long", when = exitLongCondition)
strategy.entry("SQ_Short", strategy.short, when = shortCondition)
strategy.close("SQ_Short",when = exitShortCondition)
strategy.entry("SQ_Short_Ext", strategy.short, when = extremeShort)
strategy.close("SQ_Short_Ext",when = exitExtShort)
//strategy.exit("exit Short", "SQ_Short", when = exitShortCondition)
// // === Backtesting Dates === thanks to Trost
// testPeriodSwitch = input(true, "Custom Backtesting Dates")
// testStartYear = input(2018, "Backtest Start Year")
// testStartMonth = input(1, "Backtest Start Month")
// testStartDay = input(1, "Backtest Start Day")
// testStartHour = input(0, "Backtest Start Hour")
// testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
// testStopYear = input(2018, "Backtest Stop Year")
// testStopMonth = input(12, "Backtest Stop Month")
// testStopDay = input(14, "Backtest Stop Day")
// testStopHour = input(23, "Backtest Stop Hour")
// testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
// testPeriod() =>
// time >= testPeriodStart and time <= testPeriodStop ? true : false
// isPeriod = testPeriodSwitch == true ? testPeriod() : true
// // === /END
// if not isPeriod
// strategy.cancel_all()
// strategy.close_all()