Estratégia do sistema de inversão de oscilação da EMA

Autora:ChaoZhang, Data: 2023-10-18 12:23:13
Tags:

img

Resumo

Esta estratégia utiliza um sistema de média móvel para determinar a direção da tendência e combina o índice de volatilidade para evitar os mercados oscilantes de baixa volatilidade, com saída de candelabro para gerir as operações.

Princípio

A estratégia julga a direção da tendência comparando médias móveis rápidas e lentas. Ela fica longa quando o MA rápido cruza acima do MA lento e fica curta quando o MA rápido cruza abaixo do MA lento. Para evitar oscilações nos mercados, a estratégia também incorpora Bandas de Bollinger. Ela gera sinais de negociação quando a taxa de mudança da largura do BB excede um limiar. Finalmente, a estratégia usa saídas de Chandelier como stop loss para evitar ser preso em mercados de faixa.

Especificamente, a lógica de negociação é a seguinte:

  1. Calcular a MA rápida (default 20 days) e a MA lenta (default 50 days).

  2. Calcular a taxa de variação da largura da banda de Bollinger (default 40 dias, 2 desvios padrão).

  3. O valor da posição em curto quando a MA rápida ultrapassa a MA lenta e a taxa de variação da largura BB excede o limiar por defeito de 9%.

  4. Aumentar o valor de mercado de uma unidade de medida de curto prazo quando a MA rápida cruzar abaixo da MA lenta e a taxa de alteração da largura BB exceder o limiar por defeito de 9%.

  5. Calcule Chandelier longas e curtas paradas.

  6. A parada longa é a mais alta - ATR * multiplicador. parada curta é a mais baixa + ATR * multiplicador.

Vantagens

  1. O sistema MA acompanha eficazmente as tendências.

  2. A mudança de largura do BB filtra a oscilação, reduzindo as transações desnecessárias.

  3. O candelabro sai em tempo hábil, evitando ser preso.

  4. Múltiplos parâmetros ajustáveis para otimização.

  5. Lógica clara, fácil de entender e implementar.

Riscos

  1. O atraso da MA pode não apresentar reversões rápidas.

  2. Parâmetros BB incorretos podem filtrar sinais válidos.

  3. As saídas excessivas de lustres causam excesso de negociação.

  4. A otimização inadequada dos parâmetros leva à detenção de riscos.

  5. Incapaz de adaptar-se a alterações extremas do mercado decorrentes de grandes eventos.

Optimização

  1. Teste diferentes combinações de MA para encontrar parâmetros ótimos.

  2. Teste diferentes períodos BB para obter o melhor filtro de volatilidade.

  3. Adicionar outros indicadores de confirmação de entrada.

  4. Introduzir paradas dinâmicas para melhor acompanhar os mercados.

  5. Utilize o aprendizado de máquina para otimizar automaticamente para mercados em mudança.

Resumo

Esta estratégia integra o sistema MA, o indicador BB e as saídas do candelabro para formar um sistema de tendência relativamente estável. A otimização adequada dos parâmetros pode alcançar bons resultados. Mas os riscos de reversão de tendência e oscilação permanecem. O aprendizado de máquina pode melhorar ainda mais a robustez.


/*backtest
start: 2022-10-11 00:00:00
end: 2023-10-17 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/
// © juanchez

//@version=4
strategy("CHI", overlay = true, close_entries_rule = "ANY")

n = input(title= "highest high o lowest low period", defval= 22)
f= input(title= "multiplicador", defval= 4)
long = highest(high, n) - atr(n)*f
short= lowest(low, n) + atr(n)*f
plot(long, color= color.red)
plot(short, color= color.green)

//moving averages
period= input(title= "moving averages period", defval= 50)
period2= input(title= "moving averages period2", defval= 20)
type= input(title= "moving averages type", options= ["sma", "ema"], defval= "ema")

//moving average function
mo(p, t) =>
    if t == "sma"
        sma(close[barstate.islast ? 1: 0], p)
    else  if t== "ema"
        ema(close[barstate.islast ? 1: 0], p)

m= mo(period, type)
m2= mo(period2, type)

trend= m2 > m 

plot(m, color = color.maroon, linewidth = 3)
plot(m2, linewidth= 3)


//BOLLINGER BANDS ENTRIES
bb1_period= input(title= "Bollinger bands 1 period", defval=40, minval=1)
bb1_source=input(title="Bollinger band 1 source", defval=close)
bb1_multi=input(title="Bollinger Bands 1 factor", defval=2, minval=1, step=0.1)
show_bb1= input(title="Show Bollinger bands 1", defval=false)
//BOLLINGER BANDS
_bb(src, lenght, multi)=>
    float moving_avg= sma(src[barstate.islast? 1: 0], lenght)
    float deviation= stdev(src[barstate.islast? 1: 0], lenght)
    float lowerband = moving_avg - deviation*multi
    float upperband = moving_avg + deviation*multi
    
    [moving_avg, lowerband, upperband]
    
[bb1, lowerband1, upperband1]= _bb(bb1_source,  bb1_period, bb1_multi)

//FIRST BAND    
plot(show_bb1? bb1 : na, title="BB1 Moving average", linewidth= 3, color= color.fuchsia)
plot(show_bb1? upperband1 : na, title="BB1 Upper Band", linewidth= 3, color= color.green)
plot(show_bb1? lowerband1 : na, title="BB1 Lower Band", linewidth= 3, color= color.red)

//BB's Width threshold 
thresh= input(title= "widen %", defval= 9, minval = 0, step = 1, maxval= 100)

widht= (upperband1 - lowerband1)/bb1
roc= change(widht)/widht[1]*100
cross=crossover(roc, thresh)

// entry
//long
elong= input(true, title= "enable long")
longcondition= m2 > m and cross and elong

//short
eshort= input(true, title= "enable short")
shortcondition= m2 < m and cross and eshort


plotshape(longcondition? true: false , location= location.belowbar, style= shape.labelup, size= size.small, color= color.green, text= "Buy", textcolor= color.white)
plotshape(shortcondition? true: false , location= location.abovebar, style= shape.labeldown, size= size.small, color= color.red, text= "Sell", textcolor= color.white)

out= crossunder(close, long)
outt= crossover(close, short)

strategy.entry("long", strategy.long, when = longcondition)
strategy.close("long", when = out)

strategy.entry("short", strategy.short, when = shortcondition)
strategy.close("short", when = outt)

Mais.