Baseado em estratégia de inovação de canal dinâmico


Data de criação: 2024-02-27 15:15:07 última modificação: 2024-02-27 15:15:07
cópia: 0 Cliques: 567
1
focar em
1617
Seguidores

Baseado em estratégia de inovação de canal dinâmico

Visão geral

Esta estratégia usa o indicador de canais Keltner, combinado com a média móvel, para definir preços de compra e venda de ruptura dinâmica, para realizar operações de ruptura de compra e venda de baixa e alta. A estratégia identifica automaticamente oportunidades de compra e venda de ruptura de canal.

Princípio da estratégia

  1. Calcular a trajectória do canal: usar o índice de média móvel para calcular a trajectória do preço
  2. Cálculo da banda de canais: Cálculo da banda de canais em média móvel com a amplitude real ou média real ou oscilação de preços
  3. Linha de entrada e saída: banda de entrada de ± N vezes a da linha de entrada
  4. Sequência de entrada: quando o preço toca a linha de trajectória superior, configure o preço de compra de ruptura, esperando a ruptura; quando o preço toca a linha de trajectória inferior, configure o preço de venda de ruptura, esperando a ruptura
  5. Sequência de saída: pára-perda quando a compra volta para o meio-campo ou quando o preço máximo supera o preço de entrada; pára-perda quando a venda rebota para o meio-campo ou quando o preço mínimo é inferior ao preço de entrada

Análise de vantagens

  1. O uso de canais dinâmicos para capturar rapidamente as mudanças nas tendências do mercado
  2. O uso da trajetória média é útil para determinar a direção do movimento dos preços
  3. A configuração de banda N-dobrada permite um alcance de passagem razoável e evita ajustes frequentes de posição
  4. O uso de um mecanismo de ruptura, de acordo com a teoria da tendência, para que a tendência se mantenha.
  5. Estabelecer paradas e controlar os riscos

Análise de Riscos

  1. A escolha do método de cálculo da linha do centro da órbita afeta o alcance do canal e o efeito de correspondência de preços
  2. A multiplicação de N por um número maior ou menor afeta a rentabilidade da estratégia.
  3. “A brecha de compra e venda é propensa a falsos sinais e deve ser rigorosamente impedida”.

Direção de otimização

  1. Tente diferentes métodos de cálculo de trajectórias para encontrar o melhor parâmetro
  2. Teste diferentes valores de N para encontrar o múltiplo ideal
  3. Aumentar a brecha para evitar sinais falsos
  4. Optimizar a lógica de stop loss e controlar rigorosamente as perdas individuais

Resumir

Esta estratégia usa a ciência racional em geral, para determinar a tendência e a direção dos preços através de indicadores de canal dinâmico, para definir parâmetros razoáveis para capturar sinais de ruptura, para obter baixos e altos preços e, em seguida, obter ganhos excedentes. Ao mesmo tempo, o risco da estratégia é otimizado continuamente, para que possa operar de forma estável em vários mercados.

Código-fonte da estratégia
/*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")