Cette stratégie utilise l'indicateur WaveTrend pour déterminer les tendances des prix et les situations de surachat/survente. Elle combine l'indicateur RSI pour filtrer les signaux et adopte une méthode de suivi des tendances pour effectuer des opérations contre tendance aux niveaux de surachat/survente.
La stratégie utilise l'indicateur WaveTrend pour déterminer la direction de la tendance des prix. L'indicateur WaveTrend est amélioré sur la base de l'indicateur Rainbow. Il juge la direction de la tendance des prix en calculant la différence entre la moyenne mobile Heikin-Ashi et la valeur absolue du prix. Il génère des signaux de trading en combinant l'indicateur RSI pour déterminer les situations de surachat/survente.
Plus précisément, la formule WaveTrend de la stratégie est la suivante:
esa = ema(hlc3, 10)
d = ema(abs(hlc3 - esa), 10)
ci = (hlc3 - esa) / (0.015 * d)
wt = ema(ci, 21)
où esa est la moyenne mobile de Heikin-Ashi calculée, d est la moyenne de la différence entre la moyenne mobile de Heikin-Ashi et la valeur absolue du prix. ci est la soi-disant fourchette adaptative, reflétant la volatilité des prix. wt est la moyenne mobile de ci, qui détermine la direction de la tendance des prix et est l'indicateur clé pour le long et le court.
L'indicateur RSI est utilisé pour déterminer les situations de surachat/survente.
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))
Sa valeur standard est de 0 à 100. Au-dessus de 70 est suracheté et en dessous de 30 est survendu.
Combiné avec ces deux indicateurs, lorsque le RSI est inférieur à 25 et que la tendance de la vague est inférieure à -60, il est survendu pour aller long. Lorsque le RSI est supérieur à 75 et que la tendance de la vague est supérieure à 60, il est suracheté pour aller court.
Les avantages de cette stratégie sont les suivants:
Il y a aussi des risques:
Les solutions:
La stratégie peut être optimisée dans les directions suivantes:
Modifier ou ajouter des indicateurs de jugement pour améliorer la précision du signal, par exemple MACD, KD, etc.
Optimiser les paramètres afin d'adapter les différents produits, par exemple en ajustant les périodes de fluidité.
L'exposition au risque de défaillance de l'établissement est calculée sur la base de l'exposition au risque de défaillance.
Considérez différentes stratégies de pyramide, par exemple le Martingale au lieu d'une quantité fixe.
Optimiser les paramètres de gamme adaptative pour améliorer la précision du jugement.
L'idée générale de la stratégie est claire, en utilisant des indicateurs de volatilité pour déterminer les tendances des prix et filtrer efficacement le bruit.
/*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()