Estratégia de Fuga de Volatilidade Dinâmica


Data de criação: 2023-11-13 11:26:50 última modificação: 2023-11-13 11:26:50
cópia: 1 Cliques: 750
1
focar em
1617
Seguidores

Estratégia de Fuga de Volatilidade Dinâmica

Visão geral

Esta estratégia utiliza a dinâmica ascendente e descendente da faixa de Brin para realizar ações excessivas quando o preço quebra a faixa de Brin para cima e ações excessivas quando o preço cai para baixo da faixa de Brin para baixo. Diferentemente da estratégia de ruptura tradicional, a descida e a ascendência da faixa de Brin variam de acordo com a dinâmica da flutuação histórica, o que permite um melhor julgamento do estado de supercompra e supervenda do mercado.

Princípio da estratégia

A estratégia baseia-se principalmente na ruptura do indicador de Brin para determinar o preço. O Brin contém três linhas:

  1. Média: Média móvel de n dias
  2. Trilha superior: linha média + k * n dias de diferença padrão
  3. Baixa linha: linha média - k * n dias de diferença padrão

Quando o preço sobe acima da linha de alta, considere que o mercado está em um estado de sobrecompra. Quando o preço desce acima da linha de baixa, considere que o mercado está em um estado de sobrevenda e deve se posicionar.

A estratégia permite a customização dos parâmetros da faixa de Bryn: o comprimento da linha média n e o múltiplo da diferença padrão k. O comprimento da linha média padrão é de 20 dias e o múltiplo da diferença padrão é de 2.

Após o fechamento diário das ações, verifica-se se o preço de fechamento do dia quebrou a linha superior. Se for, executa o sinal de mais no início do dia seguinte. Depois de fazer mais, monitora-se em tempo real se o preço quebrou a linha inferior e, se for quebrado, liquida-se.

A estratégia também introduziu um filtro de linha média, que gera um sinal de multiplicação somente quando o preço está acima da linha média. Pode-se optar por traçar a linha média no período atual ou no período superior para controlar o ponto de entrada.

O método de stop loss também oferece duas opções: stop loss de porcentagem fixa ou tracking down the Brines. O último pode fornecer mais espaço para que os lucros funcionem.

Vantagens estratégicas

  • SUPERBUY/SUPPERSELL: Utilizando o Brinks para avaliar o mercado
  • Filtragem uniforme para evitar negociações em contrapartida
  • Parâmetros de banda de Bryn personalizáveis para diferentes períodos
  • Oferece duas opções de stop loss
  • Parâmetros de otimização de feedback e estratégias de validação em disco

Risco estratégico

  • O Blink não é um bom juiz de sobrevenda.
  • Filtragem de linha média pode perder brechas mais rápidas
  • Stop loss fixo pode ser muito conservador, stop loss de rastreamento pode ser muito radical
  • Os parâmetros precisam ser otimizados para diferentes variedades e ciclos
  • Não há limite para o tamanho dos prejuízos, mas há que ter em conta a gestão de fundos

Otimização de Estratégia

  • Teste diferentes combinações de parâmetros de mediana
  • Tente com um parâmetro diferente da faixa de Bryn
  • Comparação entre a taxa de retorno de um stop loss em percentagem fixa e um stop loss de tracking
  • Aumentar o módulo de gestão de fundos e limitar as perdas individuais
  • Combinação com outros indicadores para a verificação do sinal da faixa de Bryn

Resumir

A estratégia utiliza a dinâmica ascendente e descendente da faixa de brinks para determinar a sobrevenda e a sobrevenda, com referência a sinais de filtragem de linha uniforme, e utiliza fundos de proteção contra perdas. Em comparação com a tradicional ruptura de trajectória fixa, a estratégia é mais adaptável à oscilação do mercado.

Código-fonte da estratégia
/*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=5

// Revision:        1
// Author:          @millerrh
// Strategy:  
//      Entry: Buy when price breaks out of upper Bollinger Band
//      Exit: Trail a stop with the lower Bollinger Band 
// Conditions/Variables:
//    1. Can add a filter to only take setups that are above a user-defined moving average on current timeframe and/or longer timeframe (helps avoid trading counter trend) 
//    2. Manually configure which dates to back test
//    3. User-Configurable Bollinger Band Settings
//    4. Optionally use a tighter initial stop level.  Once Bollinger Band catches up, trail with lower Bollinger Band to give more breathing room.

// strategy('Donchian Breakout', overlay=true, initial_capital=100000, currency='USD', default_qty_type=strategy.percent_of_equity, calc_on_every_tick = true,
//   default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)

strategy('Bollinger Breakout', overlay=true, initial_capital=100000, currency='USD', default_qty_type=strategy.percent_of_equity,
  default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0, calc_on_order_fills=true)

// === BACKTEST RANGE ===
Start = input(defval = timestamp("01 Jan 2019 06:00 +0000"), title = "Backtest Start Date", group = "backtest window")
Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", group = "backtest window")

// == INPUTS ==
// Bollinger Band Inputs
bbLength = input.int(20, minval=1, group = "Bollinger Band Settings", title="Bollinger Band Length",
  tooltip = "Bollinger Band moving average length.")
bbMultTop = input.float(2.0, minval=0.001, maxval=50, title="Standard Deviation (Top)")
bbMultBot = input.float(2.0, minval=0.001, maxval=50, title="Standard Deviation (Bottom)")

useTightStop = input.bool(title='Use Fixed Percentage for Initial Stop?', defval=false, group = "order entry",
  tooltip = "'Keep your losers small and let winners run' is the saying.  This will allow you to use a tight initial stop
  until the lower Bollinger Band catches up.")
percStop = input.int(title="Stop", defval=8, group = "order entry", inline = "perc")
trigInput = input.string(title='Execute Trades On...', defval='Wick', options=['Wick', 'Close'], group = "order entry",
  tooltip = "Useful for comparing standing stop orders at the Bollinger Band boundary (executing on the wick) vs. waiting for candle closes prior to taking action")

// Moving Average Filtering Inputs
useMaFilter = input.bool(title='Use Moving Average for Filtering (Current Timeframe)?', defval=false, group = "moving average filtering",
  tooltip = "Signals will be ignored when price is under this moving average.  The intent is to keep you out of bear periods and only buying when 
             price is showing strength.")
maType = input.string(defval='SMA', options=['EMA', 'SMA'], title='MA Type For Filtering', group = "moving average filtering")
maLength = input.int(defval=50, title="Moving Average:    Length", minval=1, group = "moving average filtering", inline = "1ma")
ma1Color = input.color(color.new(color.green, 50), title = " Color", group = "moving average filtering", inline = "1ma")
useMaFilter2 = input.bool(title='Use Moving Average for Filtering (High Timeframe)?', defval=false, group = "moving average filtering")
tfSet = input.timeframe(defval="D", title="Timeframe of Moving Average", group = "moving average filtering",
  tooltip = "Allows you to set a different time frame for a moving average filter.  Trades will be ignored when price is under this moving average.
  The idea is to keep your eye on the larger moves in the market and stay on the right side of the longer term trends and help you be pickier about 
  the stocks you trade.")
ma2Type = input.string(defval='SMA', options=['EMA', 'SMA'], title='MA Type For Filtering', group = "moving average filtering")
ma2Length = input.int(defval=50, title="Moving Average:    Length", minval=1, group = "moving average filtering", inline = "2ma")
ma2Color = input.color(color.new(color.white, 50), title = " Color", group = "moving average filtering", inline = "2ma")


// === THE BOLLINGER BAND ===
// Logic
bbBasis = ta.sma(close, bbLength)
bbUpper = bbBasis + bbMultTop * ta.stdev(close, bbLength)
bbLower = bbBasis - bbMultBot * ta.stdev(close, bbLength)

// Plotting
plot(bbBasis, "Basis", color=color.new(color.white, 50))
p1 = plot(bbUpper, color=color.new(color.blue, 50), linewidth=1, title='Upper Bollinger Band')
p2 = plot(bbLower, color=color.new(color.blue, 50), linewidth=1, title='Lower Bollinger Band')
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

// == FILTERING LOGIC ==
// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == 'EMA' ? ta.ema(src, length) : ta.sma(src, length)  //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
maFilter2 = request.security(syminfo.tickerid, tfSet, ma(ma2Type, close, ma2Length))

// Plotting
plot(useMaFilter ? maFilter : na, title='Trend Filter MA - CTF', color=ma1Color, linewidth=2, style=plot.style_line)
plot(useMaFilter2 ? maFilter2 : na, title='Trend Filter MA - HTF', color=ma2Color, linewidth=2, style=plot.style_line)


// == ENTRY AND EXIT CRITERIA ==
// Trigger stop based on candle close or High/Low (i.e. Wick)
trigResistance = trigInput == 'Close' ? close : trigInput == 'Wick' ? high : na
trigSupport = trigInput == 'Close' ? close : trigInput == 'Wick' ? low : na
buySignal = trigResistance >= bbUpper 

buyConditions = (useMaFilter ? bbUpper > maFilter : true) and
  (useMaFilter2 ? bbUpper > maFilter2 : true) 
  
// == STOP AND PRICE LEVELS ==
// Configure initial stop level
inPosition = strategy.position_size > 0
stopLevel = strategy.position_avg_price - (strategy.position_avg_price * percStop/100)
posStop = stopLevel > bbLower ? stopLevel : bbLower


// Check if using stop vs. not
stop = useTightStop ? posStop : bbLower
plot(inPosition ? stop : na, style=plot.style_linebr, color=color.new(color.red, 40), linewidth = 1, title = "Stop Levels", trackprice=false)

sellSignal = trigSupport <= stop

// == STRATEGY ENTRIES & EXITS ==
// This string of code enters and exits at the candle close
if trigInput == 'Close'
    strategy.entry('Long', strategy.long, when=buyConditions and buySignal)
    strategy.close('Long', when=sellSignal)

// This string of code enters and exits at the wick (i.e. with pre-set stops)
if trigInput == 'Wick'
    strategy.entry('Long', strategy.long, stop=bbUpper, when=buyConditions)
    strategy.exit('Exit Long', from_entry='Long', stop=stop)
strategy.cancel('Long',when= not(buyConditions)) // Resets stop level once buyConditions aren't true anymore