Estratégia de acompanhamento da tendência baseada no ATR e no índice de volatilidade

Autora:ChaoZhang, Data: 2024-01-04 15:31:34
Tags:

img

Resumo

Esta estratégia usa o índice CHOP como os principais indicadores técnicos para identificar e rastrear tendências. Ele entra quando o índice quebra os trilhos superior e inferior, combinado com a direção da tendência como sinais de entrada; e sai com stop loss ou take profit quando o índice reentra na área do cinturão.

Princípio da estratégia

  1. Utilize o ATR para calcular o tamanho da caixa e construir o canal Renko para determinar a direção da tendência do preço.

  2. Aplique o índice CHOP para julgar se o mercado é adequado para negociação. Este índice incorpora o preço mais alto, o preço mais baixo e ATR. Quando está entre 38,2-61,8, indica baixa volatilidade do mercado; caso contrário, sinaliza alta volatilidade e mercado de negociação inadequado.

  3. Quando o índice CHOP quebra o trilho superior de 61,8, o preço entra em uma tendência de queda. Se a EMA rápida de curto prazo também mostrar que o preço está liderando, vá curto. Por outro lado, quando o CHOP quebra o trilho inferior de 38,2 e a EMA de curto prazo sobe, vá longo.

  4. Quando o preço voltar a entrar na área da faixa 38.2-61.8 do CHOP, feche a posição com stop loss ou take profit.

Análise das vantagens

Esta estratégia combina o julgamento da tendência e o controlo da volatilidade, que podem capturar as tendências de preços e controlar os riscos.

  1. O canal Renko construído pela ATR pode efetivamente acompanhar as tendências dos preços.

  2. O índice CHOP avalia a taxa de volatilidade do mercado para evitar negociações incorretas em flutuações violentas.

  3. A combinação da EMA rápida para determinar a direcção da tendência a curto prazo evita a operação inversa.

  4. A estratégia stop loss/take profit controla perdas únicas.

Análise de riscos

Os principais riscos que esta estratégia enfrenta são:

  1. No mercado lateral, o canal ATR e os sinais CHOP podem produzir sinais incorretos.

  2. A combinação de um único indicador técnico não pode evitar totalmente as perdas, sendo necessária uma intervenção manual para determinar as principais tendências.

  3. A posição de stop loss definida muito solta pode levar a uma perda única de tamanho excessivo.

Direcção de otimização

Esta estratégia pode ser otimizada nos seguintes aspectos:

  1. Aumentar outros indicadores auxiliares para determinar sinais, como padrões de candelabro, volume, etc. para melhorar a precisão do sinal.

  2. Otimizar os parâmetros do ATR e do CHOP para melhor captar as flutuações de preços.

  3. Estabelecer posições de stop loss/take profit dinâmicas para maiores margens de lucro e stop loss mais rápidos.

  4. Afrouxar adequadamente o intervalo de stop loss após determinar a tendência principal para obter mais lucros na tendência.

Conclusão

Esta estratégia integra indicadores técnicos comumente usados e é simples e prática. Com ajuste e otimização de parâmetros, efeitos de rastreamento satisfatórios podem ser obtidos. Mas ainda requer julgamento manual das principais tendências e não pode ser totalmente automatizado. Pode servir como uma ferramenta auxiliar de tomada de decisão e referência para outras estratégias.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © sharatgbhat

//@version=4
strategy("Weis Chop Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 10,max_lines_count = 500, max_labels_count = 500)
maxIdLossPcnt = input(1, "Max Intraday Loss(%)", type=input.float)
// strategy.risk.max_intraday_loss(maxIdLossPcnt, strategy.percent_of_equity)

method = input(defval="ATR", options=["ATR", "Traditional", "Part of Price"], title="Renko Assignment Method")
methodvalue = input(defval=14.0, type=input.float, minval=0, title="Value")
pricesource = input(defval="Close", options=["Close", "Open / Close", "High / Low"], title="Price Source")
useClose = pricesource == "Close"
useOpenClose = pricesource == "Open / Close" or useClose
useTrueRange = input(defval="Auto", options=["Always", "Auto", "Never"], title="Use True Range instead of Volume")
isOscillating = input(defval=false, type=input.bool, title="Oscillating")
normalize = input(defval=false, type=input.bool, title="Normalize")
vol = useTrueRange == "Always" or useTrueRange == "Auto" and na(volume) ? tr : volume
op = useClose ? close : open
hi = useOpenClose ? close >= op ? close : op : high
lo = useOpenClose ? close <= op ? close : op : low

if method == "ATR"
    methodvalue := atr(round(methodvalue))
if method == "Part of Price"
    methodvalue := close / methodvalue

currclose = float(na)
prevclose = nz(currclose[1])
prevhigh = prevclose + methodvalue
prevlow = prevclose - methodvalue
currclose := hi > prevhigh ? hi : lo < prevlow ? lo : prevclose

direction = int(na)
direction := currclose > prevclose ? 1 : currclose < prevclose ? -1 : nz(direction[1])
directionHasChanged = change(direction) != 0
directionIsUp = direction > 0
directionIsDown = direction < 0

barcount = 1
barcount := not directionHasChanged and normalize ? barcount[1] + barcount : barcount
vol := not directionHasChanged ? vol[1] + vol : vol
res = barcount > 1 ? vol / barcount : vol

plot(isOscillating and directionIsDown ? -res : res, style=plot.style_columns, color=directionIsUp ? color.green : color.red, transp=75, linewidth=3, title="Wave Volume")

length = input(14, minval=1)
ci = 100 * log10(sum(atr(1), length) / (highest(length) - lowest(length))) / log10(length)
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(ci, "CHOP", color=#2962FF, offset = offset)
band1 = hline(61.8, "Upper Band", color=#787B86, linestyle=hline.style_dashed)
band0 = hline(38.2, "Lower Band", color=#787B86, linestyle=hline.style_dashed)
fill(band1, band0, color = color.rgb(33, 150, 243, 90), title = "Background")

MomentumBull = close>ema(close,8)
MomentumBear = close<ema(close,8)
Tradecon = crossunder(ci,61.8)

if (MomentumBull and directionIsUp and Tradecon)
	strategy.entry("Buy", strategy.long)
if (MomentumBear and directionIsDown and Tradecon )
    strategy.entry("Sell", strategy.short)
    strategy.exit("exit","Buy",when=directionIsDown,qty_percent=100,profit=20,loss=10)
    strategy.exit("exit","Sell",when=directionIsUp,qty_percent=100,profit=20,loss=10)
    

Mais.