Estratégia de avanço dinâmico do canal

Autora:ChaoZhang, Data: 2024-02-27 15:15:07
Tags:

img

Resumo

Esta estratégia usa o indicador do canal de Keltner, combinado com linhas médias móveis, para definir preços dinâmicos de compra e venda de breakout para alcançar operações de breakout de baixa compra-alta venda.

Princípio da estratégia

  1. Calcular a mediana do canal: Use a média móvel exponencial para calcular a mediana do preço do canal
  2. Calcular a largura de banda do canal: Use a média móvel da volatilidade real, a volatilidade média real ou a amplitude do preço para calcular a largura de banda do canal
  3. Reel superior e inferior do canal: média ± N vezes largura de banda do canal
  4. Ordem de entrada: Quando o preço toca o trilho superior, defina o preço de compra de ruptura e espere pela ruptura; quando o preço toca o trilho inferior, defina o preço de venda de ruptura e espere pela ruptura
  5. Ordem de saída: Stop loss quando o preço cai para a mediana após a compra, ou quando o preço mais alto excede o preço de entrada; Stop loss quando o preço volta para a mediana após a venda, ou quando o preço mais baixo é inferior ao preço de entrada

Análise das vantagens

  1. O uso de canais dinâmicos pode captar rapidamente as mudanças nas tendências do mercado
  2. O uso da mediana é propício para julgar a direcção das tendências dos preços
  3. N vezes a configuração de largura de banda torna a faixa de canal razoável para evitar ajustes de posição frequentes
  4. Usar mecanismos de ruptura está em conformidade com a teoria da tendência e segue a tendência
  5. A definição de condições de stop loss controla estritamente os riscos

Análise de riscos

  1. A escolha do método de cálculo da linha mediana afectará o efeito de correspondência entre a gama de canais e os preços
  2. Os múltiplos N excessivamente grandes ou pequenos afetarão a taxa de retorno da estratégia
  3. As compras e vendas de ruptura tendem a formar sinais falsos e devem ser estritamente interrompidas

Orientações de otimização

  1. Tente diferentes métodos de cálculo da linha mediana para encontrar os parâmetros ideais
  2. Teste diferentes valores de N para encontrar o multiplicador óptimo
  3. Aumentar a amplitude de ruptura para evitar sinais falsos
  4. Otimizar a lógica de stop loss para controlar estritamente a perda única

Resumo

A estratégia geral usa métodos científicos e razoáveis para julgar as tendências e direções dos preços através de indicadores dinâmicos de canal, define parâmetros razoáveis para capturar sinais de avanço, alcança compras baixas-vendas altas e ganha retornos excessivos. Ao mesmo tempo, otimize continuamente os riscos da estratégia para que possa funcionar de forma estável em vários mercados.


/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Keltner Strategy", overlay=true)
length = input.int(20, minval=1)
mult = input.float(2.0, "Multiplier")
src = input(close, title="Source")
exp = input(true, "Use Exponential MA")
BandsStyle = input.string("Average True Range", options = ["Average True Range", "True Range", "Range"], title="Bands Style")
atrlength = input(10, "ATR Length")
esma(source, length)=>
	s = ta.sma(source, length)
	e = ta.ema(source, length)
	exp ? e : s
ma = esma(src, length)
rangema = BandsStyle == "True Range" ? ta.tr(true) : BandsStyle == "Average True Range" ? ta.atr(atrlength) : ta.rma(high - low, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
crossUpper = ta.crossover(src, upper)
crossLower = ta.crossunder(src, lower)
bprice = 0.0
bprice := crossUpper ? high+syminfo.mintick : nz(bprice[1])
sprice = 0.0
sprice := crossLower ? low -syminfo.mintick : nz(sprice[1])
crossBcond = false
crossBcond := crossUpper ? true
     : na(crossBcond[1]) ? false : crossBcond[1]
crossScond = false
crossScond := crossLower ? true
     : na(crossScond[1]) ? false : crossScond[1]
cancelBcond = crossBcond and (src < ma or high >= bprice )
cancelScond = crossScond and (src > ma or low <= sprice )
if (cancelBcond)
	strategy.cancel("KltChLE")
if (crossUpper)
	strategy.entry("KltChLE", strategy.long, stop=bprice, comment="KltChLE")
if (cancelScond)
	strategy.cancel("KltChSE")
if (crossLower)
	strategy.entry("KltChSE", strategy.short, stop=sprice, comment="KltChSE")

Mais.