Estratégia dinâmica de ruptura do canal de preços

Autora:ChaoZhang, Data: 2023-12-13 16:03:37
Tags:

img

Resumo

A Estratégia Dinâmica de Breakout do Canal de Preços é uma estratégia quantitativa de negociação baseada no indicador Donchian Price Channel.

A ideia principal desta estratégia é usar breakouts do canal de preços Donchan. Quando o preço atravessa o limite superior do canal, estabeleça uma posição longa para buscar a tendência; Quando o preço atravessa o limite inferior do canal, estabeleça uma posição curta para buscar a tendência.

Princípio da estratégia

Cálculo do indicador

O canal de preços é calculado pelas seguintes fórmulas:

Linha superior = Máximo máximo durante os últimos N períodos

Linha inferior = Nível mais baixo nos últimos N períodos

Linha média = (Linha superior + Linha inferior) / 2

Onde N representa a duração do ciclo do canal.

Regras de entrada

Quando o preço mais elevado da última linha K ultrapassar o limite superior do canal, estabelecer uma posição longa;

Quando o preço mais baixo da última linha K atravessar o limite inferior do canal, estabeleça uma posição curta.

Exemplo:

O ponto mais alto da linha K anterior não excedeu o limite superior do canal;
O ponto mais alto da linha K de corrente atravessa o limite superior do canal; Estabeleça uma posição longa

Regras de saída

Existem duas regras opcionais de saída:

  1. Saída do canal

Fechar posição longa: o preço de stop loss é o limite inferior do canal;

Fechar posição curta: o preço de stop loss é o limite superior do canal;

  1. Saída da linha do meio

Não importa as posições longas ou curtas, feche todas as posições quando os preços voltarem a cair abaixo da linha média do canal.

Controle de riscos

O controlo do risco adota a perda proporcional de parada para calcular a distância específica de perda de parada com base na amplitude do canal e na percentagem de risco aceitável.

O valor da posição em risco deve ser calculado em função da posição em risco.

O valor da posição em risco deve ser calculado em função da posição em risco da instituição.

Por exemplo, se o risco aceitável for definido em 2%, o preço de entrada é de R$ 10.000, então a linha de stop loss para a posição longa é de R$ 10.000 * (1 - 2%) = R$ 9.800.

Análise das vantagens

Capture Breakouts de tendência

Quando os preços atravessam os limites superior e inferior do canal, é altamente provável que uma nova tendência direcional comece.

Riscos controláveis

A utilização de stop loss proporcional pode manter as perdas individuais dentro de um intervalo aceitável.

Espaço de otimização de parâmetros grandes

Parâmetros como ciclo do canal, relação de risco, método de stop loss podem ser otimizados e combinados para adaptar mais ambientes de mercado.

Análise de riscos

Fracassados Fugitivos

Os avanços de preços dos limites do canal não constituem necessariamente uma tendência, existindo uma probabilidade de fracassos de avanços, o que é provável que provoque um stop loss.

Mercado limitado ao intervalo

Quando o mercado está limitado a um intervalo, os preços podem frequentemente tocar os limites superior e inferior do canal, resultando em negociações excessivamente frequentes, aumentando assim os custos de transação e as perdas de deslizamento.

Orientações de otimização

Canal dinâmico

Considere fazer do comprimento do canal de preços uma variável que se ajuste automaticamente com base na volatilidade do mercado.

Optimize as oportunidades de entrada

Combinar outros indicadores para filtrar o calendário de entrada, tais como indicadores de volume, médias móveis, etc., para evitar rupturas ineficazes em mercados oscilantes.

Optimização de parâmetros

Usar mais dados históricos para testar e otimizar combinações de parâmetros para determinar os parâmetros ideais para se adaptarem às condições mais amplas do mercado.

Resumo

A estratégia de canal de preço dinâmico é geralmente uma estratégia de rastreamento de tendências relativamente simples e intuitiva. Suas vantagens são sinais claros e fáceis de entender; O controle de risco é relativamente razoável. Mas ainda há alguns problemas a serem otimizados, como o tratamento de breakouts falhados e mercados oscilantes. Esta estratégia é mais adequada como uma ferramenta auxiliar para a negociação de tendências, e o efeito será melhor quando combinado com outros indicadores ou modelos técnicos.


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

//Noro

//@version=4
strategy(title = "Noro's RiskChannel Strategy", shorttitle = "RiskChannel str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 0, commission_value = 0.1)

//Settings
needlong  = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
risklong  = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %")
riskshort = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %")
stoptype  = input(defval = "Center", options = ["Channel", "Center"], title = "Stop-loss type")
lotsize   = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
pclen     = input(50, minval = 1, title = "Price Channel Length")
showll    = input(true, defval = true, title = "Show lines")
showof    = input(true, defval = true, title = "Show offset")
showdd    = input(true, defval = true, title = "Show label (drawdown)")
showbg    = input(false, defval = false, title = "Show background")
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")

//Price Channel
h = highest(high, pclen)
l = lowest(low, pclen)
center = (h + l) / 2

//Stop-loss
needstop = stoptype == "Center" or needlong == false or needshort == false
sl = center

//Lines
pccol = showll ? color.black : na
slcol = showll and stoptype == "Center" ? color.red : na
offset = showof ? 1 : 0
plot(h, offset = offset, color = pccol, title = "Channel High")
plot(center, offset = offset, color = slcol, title = "Cannel Center")
plot(l, offset = offset, color = pccol, title = "Channel Low")

//Background
size = strategy.position_size
bgcol = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(bgcol, transp = 70)

//Var
loss = 0.0
maxloss = 0.0
equity = 0.0
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//Lot size
risksizelong = -1 * risklong
risklonga = stoptype == "Center" ? ((center / h) - 1) * 100 : ((l / h) - 1) * 100
coeflong = abs(risksizelong / risklonga)
lotlong = (strategy.equity / close) * coeflong
risksizeshort = -1 * riskshort
riskshorta = stoptype == "Center" ? ((center / l) - 1) * 100 : ((h / l) - 1) * 100
coefshort = abs(risksizeshort / riskshorta)
lotshort = (strategy.equity / close) * coefshort

//Trading
if h > 0
    strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime)
    strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime)
sl := sl != 0 ? sl : size > 0 ? l : size < 0 ? h : na
if size > 0 and needstop
    strategy.exit("Stop Long", "Long", stop = sl)
if size < 0 and needstop
    strategy.exit("Stop Short", "Short", stop = sl)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")
    
if showdd

    //Drawdown
    max = 0.0
    max := max(strategy.equity, nz(max[1]))
    dd = (strategy.equity / max - 1) * 100
    min = 100.0
    min := min(dd, nz(min[1]))
    
    //Max loss size
    equity := strategy.position_size == 0 ? strategy.equity : equity[1]
    loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0
    maxloss := min(nz(maxloss[1]), loss)
    
    //Label
    min := round(min * 100) / 100
    maxloss := round(maxloss * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)
    // la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)

Mais.