Estratégia de acompanhamento da tendência de volatilidade

Autora:ChaoZhang, Data: 2024-02-18 10:07:29
Tags:

img

Resumo

Esta estratégia utiliza o indicador WaveTrend para determinar tendências de preços e situações de sobrecompra/supervenda.

Estratégia lógica

A estratégia usa o indicador WaveTrend para determinar a direção da tendência do preço. O indicador WaveTrend é melhorado com base no indicador Rainbow. Ele julga a direção da tendência do preço calculando a diferença entre a média móvel de Heikin-Ashi e o valor absoluto do preço.

Especificamente, a fórmula WaveTrend na estratégia é:

esa = ema(hlc3, 10)
d = ema(abs(hlc3 - esa), 10) 
ci = (hlc3 - esa) / (0.015 * d)
wt = ema(ci, 21)

Onde esa é a média móvel calculada de Heikin-Ashi, d é a média da diferença entre a média móvel de Heikin-Ashi e o valor absoluto do preço. ci é o chamado intervalo adaptativo, que reflete a volatilidade dos preços. wt é a média móvel de ci, que determina a direção da tendência dos preços e é o indicador chave para longo e curto.

O indicador RSI é utilizado para determinar situações de sobrecompra/supervenda.

rsiup = rma(max(change(close), 0), 14)
rsidown = rma(-min(change(close), 0), 14)
rsi = rsidown == 0 ? 100 : rsiup == 0 ? 0 : 100 - (100 / (1 + rsiup / rsidown)) 

Seu valor padrão é 0-100. acima de 70 é sobrecomprado e abaixo de 30 é sobrevendido.

Combinado com esses dois indicadores, quando o RSI está abaixo de 25 e a WaveTrend está abaixo de -60, é sobrevendido para ir longo.

Análise das vantagens

As vantagens desta estratégia incluem:

  1. O indicador WaveTrend pode determinar com precisão e confiabilidade a direção da tendência do preço.
  2. Os filtros RSI podem evitar negócios desnecessários e melhorar a taxa de ganho.
  3. O método de rastreamento de tendências pode maximizar os lucros da captura de tendências de preços.
  4. A ideia estratégica é simples e clara, os parâmetros são flexíveis para ajustá-los a diferentes produtos e mercados.
  5. Fácil de implementar e testar na negociação ao vivo, bom para otimização adicional.

Análise de riscos

Há também alguns riscos:

  1. Tanto o WaveTrend quanto o RSI têm algum atraso, podem perder pontos de reversão de preços.
  2. Apesar dos filtros, ainda podem ocorrer sinais falsos nos mercados laterais.
  3. Falta de um método de stop loss eficaz para controlar perdas individuais.
  4. O ajustamento razoável dos parâmetros deve corresponder às características e à frequência de negociação.

Soluções:

  1. Adicionar indicadores para otimizações combinacionais para melhorar a precisão do sinal.
  2. Adicionar estratégias de stop loss para controlar perdas individuais.
  3. Encontrar combinações ótimas de parâmetros para adaptar a estratégia.

Orientações de otimização

A estratégia pode ser otimizada nas seguintes direcções:

  1. Alteração ou adição de indicadores de julgamento para melhorar a precisão do sinal, por exemplo MACD, KD, etc.

  2. Otimizar as definições dos parâmetros para adaptar os diferentes produtos, por exemplo, ajustar os períodos normais.

  3. Para efeitos do cálculo do risco de perdas, o valor da posição em risco deve ser calculado de acordo com o método de classificação da posição em risco.

  4. Considere diferentes estratégias de pirâmide, por exemplo, Martingale em vez de quantidade fixa.

  5. Otimizar os parâmetros de intervalo adaptativo para melhorar a precisão do julgamento.

Conclusão

A ideia geral da estratégia é clara, usando indicadores de volatilidade para determinar as tendências de preços e filtrar ruído de forma eficaz. Há espaço para otimização em vários aspectos para tornar a estratégia mais robusta. Através do ajuste de parâmetros, pode ser adaptado a diferentes produtos e vale a pena testar mais ao vivo.


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

//Noro
//2018

//@version=2
strategy(title = "Noro's WaveTrender Strategy v1.0", shorttitle = "WaveTrender str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
showarr = input(true, defval = true, title = "Show Arrows")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//RSI
rsiup = rma(max(change(close), 0), 14)
rsidown = rma(-min(change(close), 0), 14)
rsi = rsidown == 0 ? 100 : rsiup == 0 ? 0 : 100 - (100 / (1 + rsiup / rsidown))

//WaveTrend
esa = ema(hlc3, 10)
d = ema(abs(hlc3 - esa), 10)
ci = (hlc3 - esa) / (0.015 * d)
wt = ema(ci, 21)

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
overs = rsi < 25 and wt < -60
overb = rsi > 75 and wt > 60
up1 = (strategy.position_size == 0 or close < strategy.position_avg_price) and overs and bar == -1
dn1 = (strategy.position_size == 0 or close > strategy.position_avg_price) and overb and bar == 1
exit = (strategy.position_size > 0 and overs == false) or (strategy.position_size < 0 and overb == false)

//Arrows
col = exit ? black : up1 or dn1 ? blue : na
needup = up1
needdn = dn1
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot)

if dn1
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot)
    
if exit
    strategy.close_all()

Mais.