Esta estrategia utiliza el indicador WaveTrend para determinar las tendencias de precios y situaciones de sobrecompra/sobreventa. Combina el indicador RSI para filtrar señales y adopta un método de seguimiento de tendencias para realizar operaciones contrarias a la tendencia en niveles de sobrecompra/sobreventa.
La estrategia utiliza el indicador WaveTrend para determinar la dirección de la tendencia del precio. El indicador WaveTrend se mejora basado en el indicador Rainbow. Juzga la dirección de la tendencia del precio calculando la diferencia entre el promedio móvil de Heikin-Ashi y el valor absoluto del precio. Genera señales comerciales combinando el indicador RSI para determinar situaciones de sobrecompra / sobreventa.
Específicamente, la fórmula WaveTrend en la estrategia es:
esa = ema(hlc3, 10)
d = ema(abs(hlc3 - esa), 10)
ci = (hlc3 - esa) / (0.015 * d)
wt = ema(ci, 21)
Donde esa es la media móvil calculada de Heikin-Ashi, d es la media de la diferencia entre la media móvil de Heikin-Ashi y el valor absoluto del precio. ci es el denominado rango adaptativo, que refleja la volatilidad de los precios. wt es la media móvil de ci, que determina la dirección de la tendencia de los precios y es el indicador clave para el largo y corto.
El indicador RSI se utiliza para determinar situaciones de sobrecompra/sobreventa.
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))
Su valor estándar es 0-100.
Combinado con estos dos indicadores, cuando el RSI está por debajo de 25 y la tendencia de onda está por debajo de -60, se vende en exceso para ir largo.
Las ventajas de esta estrategia incluyen:
También hay algunos riesgos:
Soluciones:
La estrategia se puede optimizar en las siguientes direcciones:
Cambiar o añadir indicadores de juicio para mejorar la precisión de la señal, por ejemplo, MACD, KD, etc.
Optimizar la configuración de los parámetros para adaptar los diferentes productos, por ejemplo, ajustar los períodos de fluidez.
Las pérdidas de liquidación se calcularán de acuerdo con el tipo de liquidación.
Considere diferentes estrategias de pirámide, por ejemplo, Martingale en lugar de cantidad fija.
Optimizar los parámetros del rango adaptativo para mejorar la precisión del juicio.
La idea general de la estrategia es clara, utilizando indicadores de volatilidad para determinar las tendencias de precios y filtrar el ruido de manera efectiva. Hay espacio para la optimización en múltiples aspectos para hacer que la estrategia sea más robusta.
/*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()