Esta estratégia utiliza o indicador WaveTrend para determinar tendências de preços e situações de sobrecompra/supervenda.
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.
As vantagens desta estratégia incluem:
Há também alguns riscos:
Soluções:
A estratégia pode ser otimizada nas seguintes direcções:
Alteração ou adição de indicadores de julgamento para melhorar a precisão do sinal, por exemplo MACD, KD, etc.
Otimizar as definições dos parâmetros para adaptar os diferentes produtos, por exemplo, ajustar os períodos normais.
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.
Considere diferentes estratégias de pirâmide, por exemplo, Martingale em vez de quantidade fixa.
Otimizar os parâmetros de intervalo adaptativo para melhorar a precisão do julgamento.
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()