
A estratégia de extrusão de volume do urso-de-bico é uma estratégia de negociação quantitativa que combina as faixas de Bryn, os canais de Keltner e os indicadores de volume. Ela usa as faixas de Bryn e os canais de Keltner para determinar se o mercado atual está em estado de extrusão e, em seguida, combina os indicadores de volume para gerar um sinal de negociação.
A principal vantagem da estratégia é que pode ser automaticamente identificado o início de uma tendência e, em conjunto com o indicador de dinâmica, julgar o momento de entrada. No entanto, também existe um certo risco, que requer otimização de parâmetros para diferentes variedades.
A estratégia de extrusão de massa do urso foi avaliada com base nos três indicadores seguintes:
Quando o Brinch ascende abaixo do Keltner Channel ascende e o Brinch descende acima do Keltner Channel descende, consideramos que o mercado está em um estado de pressão. Isso geralmente significa que a tendência atual está prestes a começar.
Para determinar o momento de entrada, usamos um indicador de dinâmica para determinar a velocidade de mudança de preço. Gera um sinal de compra quando a dinâmica sobe acima do seu valor médio; Gera um sinal de venda quando a dinâmica desce abaixo do seu valor médio.
Os principais benefícios da estratégia de extrusão de massa do urso são:
A estratégia de esmagamento de massa do urso também tem riscos:
Para reduzir o risco, recomenda-se a otimização dos parâmetros de comprimento das faixas de Bryn e do canal Keltner, o ajuste dos pontos de parada, a escolha de variedades de negociação com melhor liquidez, e a verificação em combinação com outros indicadores.
Para aumentar ainda mais a eficácia da estratégia de extrusão de força do urso, as principais direções de otimização são:
O teste e a otimização em vários níveis podem aumentar significativamente a taxa de vitória e a rentabilidade da estratégia.
A estratégia de extrusão dinâmica do urso integra vários indicadores de forte julgamento, que podem identificar efetivamente o momento em que a tendência começa. Mas também existe um certo risco, que requer otimização de parâmetros para diferentes variedades de negociação. Através de testes e otimização contínuos, a estratégia pode ser um sistema de negociação algorítmica eficiente.
/*backtest
start: 2024-01-31 00:00:00
end: 2024-02-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mtahreemalam original strategy by LazyBear
strategy(title = 'SQM Strategy, TP & SL',
shorttitle = 'Squeeze.M Strat',
overlay = true,
pyramiding = 0,
default_qty_type = strategy.percent_of_equity,
default_qty_value = 100,
initial_capital = 1000,
commission_type=strategy.commission.percent,
commission_value=0.0,
process_orders_on_close=true,
use_bar_magnifier=true)
//Strategy logic
strategy_logic = input.string("Cross above 0", "Strategy Logic", options = ["LazyBear", "Cross above 0"])
// Date Range
testPeriodSwitch = input(false, "Custom Backtesting Date Range",group="Backtesting Date Range")
i_startTime = input(defval = timestamp("01 Jan 2022 00:01 +0000"), title = "Backtesting Start Time",group="Backtesting Date Range")
i_endTime = input(defval = timestamp("31 Dec 2022 23:59 +0000"), title = "Backtesting End Time",group="Backtesting Date Range")
timeCond = true
isPeriod = testPeriodSwitch == true ? timeCond : true
//// Stoploss and Take Profit Parameters
// Enable Long Strategy
enable_long_strategy = input.bool(true, title='Enable Long Strategy', group='SL/TP For Long Strategy', inline='1')
long_stoploss_value = input.float(defval=5, title='Stoploss %', minval=0.1, group='SL/TP For Long Strategy', inline='2')
long_stoploss_percentage = close * (long_stoploss_value / 100) / syminfo.mintick
long_takeprofit_value = input.float(defval=5, title='Take Profit %', minval=0.1, group='SL/TP For Long Strategy', inline='2')
long_takeprofit_percentage = close * (long_takeprofit_value / 100) / syminfo.mintick
// Enable Short Strategy
enable_short_strategy = input.bool(true, title='Enable Short Strategy', group='SL/TP For Short Strategy', inline='3')
short_stoploss_value = input.float(defval=5, title='Stoploss %', minval=0.1, group='SL/TP For Short Strategy', inline='4')
short_stoploss_percentage = close * (short_stoploss_value / 100) / syminfo.mintick
short_takeprofit_value = input.float(defval=5, title='Take Profit %', minval=0.1, group='SL/TP For Short Strategy', inline='4')
short_takeprofit_percentage = close * (short_takeprofit_value / 100) / syminfo.mintick
//// Inputs
//SQUEEZE MOMENTUM STRATEGY
length = input(20, title='BB Length', group = "Squeeze Momentum Settings")
mult = input(2.0, title='BB MultFactor', group = "Squeeze Momentum Settings")
source = close
lengthKC = input(20, title='KC Length', group = "Squeeze Momentum Settings")
multKC = input(1.5, title='KC MultFactor', group = "Squeeze Momentum Settings")
useTrueRange = input(true, title='Use TrueRange (KC)', group = "Squeeze Momentum Settings")
signalPeriod=input(5, title="Signal Length", group = "Squeeze Momentum Settings")
show_labels_sqm = input(title='Show Buy/Sell SQM Labels', defval=true, group = "Squeeze Momentum Settings")
h0 = hline(0)
// Defining MA
ma = ta.sma(source, length)
// Calculate BB
basis = ma
dev = mult * ta.stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev
// Calculate KC
range_1 = useTrueRange ? ta.tr : high - low
rangema = ta.sma(range_1, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC
// SqzON | SqzOFF | noSqz
sqzOn = lowerBB > lowerKC and upperBB < upperKC
sqzOff = lowerBB < lowerKC and upperBB > upperKC
noSqz = sqzOn == false and sqzOff == false
// Momentum
val = ta.linreg(source - math.avg(math.avg(ta.highest(high, lengthKC), ta.lowest(low, lengthKC)), ta.sma(close, lengthKC)), lengthKC, 0)
red_line = ta.sma(val,signalPeriod)
blue_line = val
// lqm = if val > 0
// if val > nz(val[1])
// long_sqm_custom
// if val < nz(val[1])
// short_sqm_custom
// Plots
//plot(val, style = plot.style_line, title = "blue line", color= color.blue, linewidth=2)
//plot(ta.sma(val,SignalPeriod), style = plot.style_line, title = "red line",color = color.red, linewidth=2)
//plot(val, color=blue, linewidth=2)
//plot(0, color=color.gray, style=plot.style_cross, linewidth=2)
//plot(red_line, color=red, linewidth=2)
//LOGIC
//momentum filter
//filterMom = useMomAverage ? math.abs(val) > MomentumMin / 100000 ? true : false : true
//}
////SQM Long Short Conditions
//Lazy Bear Buy Sell Condition
// long_sqm_lazy = (blue_line>red_line)
// short_sqm_lazy = (blue_line<red_line)
long_sqm_lazy = ta.crossover(blue_line,red_line)
short_sqm_lazy = ta.crossunder(blue_line,red_line)
//Custom Buy Sell Condition
dir_sqm = val < 0 ? -1 : 1
long_sqm_custom = dir_sqm == 1 //and dir_sqm[1] == -1
short_sqm_custom = dir_sqm == -1 //and dir_sqm[1] == 1
long_sqm = strategy_logic == "LazyBear" ? long_sqm_lazy : long_sqm_custom
short_sqm = strategy_logic == "LazyBear" ? short_sqm_lazy : short_sqm_custom
// Plot Stoploss & Take Profit Levels
long_stoploss_price = strategy.position_avg_price * (1 - long_stoploss_value / 100)
long_takeprofit_price = strategy.position_avg_price * (1 + long_takeprofit_value / 100)
short_stoploss_price = strategy.position_avg_price * (1 + short_stoploss_value / 100)
short_takeprofit_price = strategy.position_avg_price * (1 - short_takeprofit_value / 100)
plot(enable_long_strategy and not enable_short_strategy ? long_stoploss_percentage : na, color=color.red, style=plot.style_linebr, linewidth=2, title='Long SL Level')
plot(enable_long_strategy and not enable_short_strategy ? long_takeprofit_percentage : na, color=color.green, style=plot.style_linebr, linewidth=2, title='Long TP Level')
plot(enable_short_strategy and not enable_long_strategy ? short_stoploss_price : na, color=color.red, style=plot.style_linebr, linewidth=2, title='Short SL Level')
plot(enable_short_strategy and not enable_long_strategy ? short_takeprofit_price : na, color=color.green, style=plot.style_linebr, linewidth=2, title='Short TP Level')
// Long Strategy
if long_sqm and enable_long_strategy == true
strategy.entry('Long', strategy.long)
strategy.exit('Long SL/TP', from_entry='Long', loss=long_stoploss_percentage, profit=long_takeprofit_percentage)
strategy.close('Long', comment = "L. CL")
// Short Strategy
if short_sqm and enable_short_strategy == true
strategy.entry('Short', strategy.short)
strategy.exit('Short SL/TP', from_entry='Short', loss=short_stoploss_percentage, profit=short_takeprofit_percentage)
strategy.close('Short', comment = "S.Cl")
plot_sqm_long = long_sqm and not long_sqm[1]
plot_sqm_short = short_sqm and not short_sqm[1]
plotshape(plot_sqm_long and show_labels_sqm, title='Buy', style=shape.labelup, location=location.belowbar, size=size.normal, text='Buy', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(plot_sqm_short and show_labels_sqm, title='Sell', style=shape.labeldown, location=location.abovebar, size=size.normal, text='Sell', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))
// Date Range EXIT
if (not isPeriod)
strategy.cancel_all()
strategy.close_all()