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.
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.
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
Existem duas regras opcionais de saída:
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;
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.
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.
Quando os preços atravessam os limites superior e inferior do canal, é altamente provável que uma nova tendência direcional comece.
A utilização de stop loss proporcional pode manter as perdas individuais dentro de um intervalo aceitável.
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.
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.
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.
Considere fazer do comprimento do canal de preços uma variável que se ajuste automaticamente com base na volatilidade do mercado.
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.
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.
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)