Canais porcentuais da EMA com estratégia de negociação de intervalo de bandas de Bollinger

Autora:ChaoZhang, Data: 2023-11-13 17:38:01
Tags:

img

Resumo

Esta estratégia é baseada na seleção do usuário de uma EMA e canal percentual definido. Ele vai longo quando o preço está abaixo da faixa superior e vai curto quando o preço está acima da faixa inferior. Se o preço começar a tendência e se mover fora do canal, todas as posições são fechadas para evitar perdas.

Para os mercados de tendência, deve ser utilizado o canal EMA Percentage Channel with Bollinger Band Trend Trading Strategy.

Princípios

  1. Calcular a EMA de 200 períodos como a EMA de base.

  2. Calcular as faixas superior e inferior com base na percentagem definida pelo utilizador: Banda superior = EMA * (1 + Porcentagem) Margem inferior = EMA * (1 - Porcentagem)

  3. Calcular as bandas de Bollinger de 20 períodos para representar o intervalo do canal.

  4. Vá longo quando o preço de fechamento cruza acima da faixa de Bollinger inferior de baixo. Vá curto quando o preço de fechamento cruza abaixo da faixa de Bollinger superior de cima.

  5. Para evitar perdas excessivas, utilizar o ATR para calcular o stop loss.

  6. Se o preço se mover para fora da faixa de canais percentual definida, feche todas as posições para evitar perdas adicionais.

Vantagens

  1. A linha de base da EMA ajuda a captar melhor os pontos de inversão da tendência.

  2. O canal percentual define um intervalo de negociação razoável para evitar o excesso de negociação.

  3. As Bandas de Bollinger fornecem níveis de suporte e resistência para facilitar o tempo de entrada.

  4. O ATR trailing stop define dinamicamente o stop loss para controlar efetivamente o risco por transação.

  5. Fechar todas as posições quando o preço ultrapassa o canal controla rapidamente as perdas.

  6. Os parâmetros personalizáveis são flexíveis para diferentes condições de mercado.

Riscos

  1. Uma faixa de canais que seja demasiado ampla pode perder tendências ou atrasar a suspensão de perdas.

  2. Uma faixa de canais demasiado estreita pode causar excesso de negociação e aumentar os custos de transacção.

  3. Configurações de parâmetros de Bollinger Bands deficientes podem causar oportunidades de negociação perdidas.

  4. Um limiar de stop loss demasiado frouxo pode conduzir a perdas excessivas por transacção.

  5. Os parâmetros devem ser otimizados para encontrar a faixa de negociação ideal.

Orientações de otimização

  1. Teste diferentes períodos de EMA para encontrar a média móvel mais adequada.

  2. Otimizar os parâmetros percentuais do canal para determinar a gama de canais ideal.

  3. Ajustar o período das bandas de Bollinger para melhor captar a volatilidade.

  4. Ajustar o período ATR e o multiplicador para refinar ainda mais a estratégia de stop loss.

  5. Teste long-only acima da EMA ou short-only abaixo das condições da EMA e veja se melhora a taxa de vitória.

  6. Incorporar indicadores de tendência para determinar se é necessária uma saída antecipada.

Conclusão

Esta estratégia combina os pontos fortes das médias móveis, canais, volatilidade e muito mais para criar um sistema de negociação de faixa relativamente estável. A chave é encontrar as configurações de parâmetros mais adequadas para cada mercado específico para equilibrar risco e recompensa. Melhorias futuras podem continuar a otimizar regras e parâmetros, ou combinando com estratégias de tendência.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="[mdeacey] EMA% Channel + BB Range Strategy", shorttitle="[mdeacey] EMA% Channel + BB Range Strategy", overlay=true)

//EMA 200

len = input(title="EMA Length", type=input.integer, defval=200)
srce = input(title="EMA Source", type=input.source, defval=close)

ema1= ema(srce,len)

percent = input(title="Channel Percentage (%)", type=input.float, defval= 1) 
valuee = (percent*ema1)/100
upperbande = ema1 + valuee
lowerbande = ema1 - valuee


plot(ema1, title='EMA200', color=color.gray, linewidth=1, style=plot.style_line )
plot(upperbande, title='EMA Upper Band', color=color.gray, linewidth=1, style=plot.style_line )
plot(lowerbande, title='EMA Lower Band', color=color.gray, linewidth=1, style=plot.style_line )

length = input(20, minval=2)
src = input(close, title="Close price")
mult = input(2.0, minval=0.001, maxval=50)

MA2 = sma(src, length)
dev = mult * stdev(src, length)
upper = MA2 + dev
lower = MA2 - dev

signalColor = crossunder(close, upper) ? color.red : crossover(close, lower) ? color.green : color.white

barcolor(color=signalColor)


upperBand = plot(upper, color=color.gray, linewidth=1)
lowerBand = plot(lower, color=color.gray, linewidth=1)
fill(upperBand, lowerBand,color=color.gray)
strategy.entry("Long",true,when = crossover(close,lower)  and close <upperbande and close>lowerbande)
strategy.close("Long",when = crossunder(close,lowerbande))
strategy.entry("Short",false,when = crossunder(close,upper)  and close <upperbande and close>lowerbande)
strategy.close("Short",when = crossover(close,upperbande))

//Inputs
atrPeriod = input(defval=14, title="ATR Period",group='ATR Settings', type=input.integer) // Adjust this to change the ATR calculation length
multiplierPeriod = input(defval=1.75, title="ATR Multiplier Period",group='ATR Settings',  type=input.float)// Adjust this to change the distance between your candles and the line

//ATR Calculation
pine_rma(x, y) =>
    alpha = y
    sum = 0.0
    sum := (x + (alpha - 1) * nz(sum[1])) / alpha

true_range() =>
    max(high - low, max(abs(high - close[1]), abs(low - close[1])))

//Long SL
plot(low - pine_rma(true_range() * multiplierPeriod, atrPeriod), "Long Stop", color=color.red, offset = 1)
// Short SL
plot(high +pine_rma(true_range() * multiplierPeriod, atrPeriod), "Short Stop", color=color.red, offset = 1)
strategy.exit("Exit Long","Long",limit=upper ,stop = low - pine_rma(true_range() * multiplierPeriod, atrPeriod)  )
strategy.exit("eExit Short","Short",limit=lower ,stop =high +pine_rma(true_range() * multiplierPeriod, atrPeriod)  )


Mais.