Estratégia de ruptura do intervalo dinâmico

Autora:ChaoZhang, Data: 2023-11-21 15:03:19
Tags:

img

Resumo

Esta estratégia é projetada com base no indicador Bollinger Bands para criar uma estratégia de negociação de breakout dinâmica. Combina as condições do filtro do corpo da vela e o filtro de cor para procurar oportunidades de entrada de breakout em torno da banda inferior de Bollinger. As saídas são baseadas no filtro do corpo. A estratégia gerencia automaticamente o tamanho e o risco da posição.

Estratégia lógica

Cálculo do indicador

Primeiro, calcule a linha de base e a faixa inferior das Bandas de Bollinger com base no preço baixo:

src = low
basis = sma(src, length) 
dev = mult * stdev(src, length)
lower = basis - dev

Onde src é o preço baixo, a duração é o período de cálculo, a base é a média móvel, dev é o desvio padrão e inferior é a faixa inferior.

mult é geralmente definido como 2, o que significa que a faixa inferior está a um desvio padrão de distância.

Condições do filtro

A estratégia inclui duas condições de filtragem:

Filtro do corpo da velaUse o tamanho do corpo nbody e sua média abody para determinar, apenas gerar sinal de negociação quando nbody é maior do que metade do abody.

Filtro de cores
Não prolongar quando a vela fechar positivamente (fechar > abrir).

Sinais comerciais

Gerar sinal longo quando se cumprem as seguintes condições:

low < lower // price breaks lower band
close < open or usecol == false // color filter
nbody > abody / 2 or usebod == false // body filter  

Quando o tamanho do corpo exceder novamente a metade da média, posição próxima:

close > open and nbody > abody / 2  

Dimensão da posição

A estratégia calcula automaticamente o tamanho da negociação para o crescimento exponencial da posição:

lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1] 

Controle de riscos

Adicionar restrições ao ano, mês e data para limitar a negociação apenas em intervalos de datas específicos:

when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))

Vantagens

Intervalo dinâmico de negociação

A banda inferior de Bollinger fornece uma área de suporte dinâmica para capturar retracements após tendências.

Filtro duplo

A combinação de corpo de vela e filtros de cor evita falhas efetivamente.

Dimensionamento automático da posição

O tamanho das posições aumenta exponencialmente para 100% gerindo o risco automaticamente.

Intervalo de datas

A fixação de um intervalo de datas reduz o risco associado à volatilidade do mercado em períodos específicos.

Riscos

Retirada prolongada

Quando a tendência ascendente é forte, as bandas média e superior do BB podem subir rapidamente, causando uma baixa prolongada.

Soluções

Combina com indicadores de tendência, para a estratégia quando julgado como mercado de alta para evitar uma retirada prolongada.

Fracassou a fuga

A fuga pode falhar com recuo e reexame da banda inferior.

Soluções

Adicione stop loss abaixo do nível de suporte ou adicione lógica para detectar re-teste falhado para stop loss rápido.

Melhorias

Adicionar Stop Loss

Optimizar a perda de parada abaixo do suporte com base nos resultados dos backtests.

Otimizar Parâmetros

Filtro de corpo afinado, período de permanência, filtro de cor, etc. para encontrar o ideal.

Adicionar Filtro de Tendência

Parem a estratégia quando julgarem que é um mercado de alta, reduzam o tempo de retirada.

Conclusão

Esta estratégia combina suporte BB, filtro de corpo, filtro de cor e lógica de ruptura para capturar retracements de alta probabilidade.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Wizard Strategy v1.0", shorttitle = "Wizard str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
length = input(25, defval = 25, minval = 1, maxval = 200, title = "BB Period")
usebod = input(false, defval = false, title = "Use Body-Filter")
usecol = input(false, defval = false, title = "Use Color-Filter")
showar = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Bollinger
src = low
mult = 2
basis = sma(src, length)
dev = mult * stdev(src, length)
lower = basis - dev
plot(lower, color = lime, linewidth = 3, title="Bottom Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 2 or usebod == false

//Signals
up1 = low < lower and (close < open or usecol == false) and body
exit = close > open and nbody > abody / 2

//Arrows
needar = up1 and showar
plotarrow(needar ? 1 : na)

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if up1
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Mais.