Cette stratégie permet de réaliser des revers en suivant les signaux de survente et de survente manqués par le RSI. Lorsque l’indicateur RSI recule de la zone de survente, il génère des signaux de suivi.
L’indicateur RSI est utilisé pour juger si le RSI est en sur-achat ou en sur-vente.
overbought = rsi > uplimit
oversold = rsi < dnlimit
Si un précédent K-line RSI était en cours d’excédent, le K-line RSI actuel sort de l’excédent, générant un signal de suiviup1; si un précédent K-line RSI était en survente, l’indicateur K-line RSI actuel sort de l’état de survente, générant un signal de suividn1。
up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false
Un signal de sortie est émis lorsque la direction du portefeuille correspond à la direction de l’entité en ligne K et que l’entité dépasse la moitié de sa moyenne de 10 cycles.
exit = (((strategy.position_size > 0 and bar == 1) or
(strategy.position_size < 0 and bar == -1)) and
body > abody / 2)
Le RSI est un indicateur qui permet de suivre les signaux négatifs et d’éviter les difficultés de saisir les points d’achat et de vente.
L’indicateur RSI est un indicateur de rétrogradation qui permet de saisir les opportunités de rétrogradation.
Le jugement de sortie est effectué en fonction de la direction et de la taille de l’entité de la ligne K, afin d’éviter la poursuite après le rebond.
Le risque de faux signaux du RSI
Le risque de perte est élevé si le prix a déjà été ajusté au moment de suivre les signaux.
Une reprise partielle risque d’émettre un signal de sortie
Les paramètres d’optimisation sont définis, tels que la ligne de survente, le cycle de révision, etc., adaptés aux différents marchés.
Modifier la gestion de la position, par exemple en réduisant la position lors du suivi des signaux.
Optimiser le temps d’entrée, ajouter d’autres restrictions conditionnelles basées sur le suivi des signaux.
Optimiser les méthodes de retrait pour améliorer la probabilité de gagner, par exemple en introduisant des arrêts mobiles.
Optimiser les méthodes de stop loss pour réduire le risque de pertes, comme l’introduction de stop loss mobile, stop loss en forme de sphéroïde, etc.
Cette stratégie est basée sur les signaux de sur-achat et de sur-vente basés sur l’indicateur RSI pour permettre le suivi des transactions de revers. La stratégie a l’avantage de suivre les signaux de revers, mais il existe également un certain risque de faux signaux et de pertes. La stabilité et le rendement de la stratégie peuvent être encore améliorés par une optimisation continue.
/*backtest
start: 2023-09-20 00:00:00
end: 2023-09-27 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Noro
//2018
//@version=2
strategy(title = "Noro's Anti RSI Strategy v1.0", shorttitle = "Anti RSI str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)
//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, %")
rsiperiod1 = input(14, defval = 14, minval = 2, maxval = 50, title = "RSI Period")
rsilimit1 = input(25, defval = 25, minval = 1, maxval = 100, title = "RSI limit")
showarr = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, 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
uprsi1 = rma(max(change(close), 0), rsiperiod1)
dnrsi1 = rma(-min(change(close), 0), rsiperiod1)
rsi = dnrsi1 == 0 ? 100 : uprsi1 == 0 ? 0 : 100 - (100 / (1 + uprsi1 / dnrsi1))
uplimit = 100 - rsilimit1
dnlimit = rsilimit1
//Body
body = abs(close - open)
abody = sma(body, 10)
//Signals
bar = close > open ? 1 : close < open ? -1 : 0
overbought = rsi > uplimit
oversold = rsi < dnlimit
up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false
up2 = bar == -1 and strategy.position_size > 0 and overbought == false
dn2 = bar == 1 and strategy.position_size < 0 and oversold == false
norma = overbought == false and oversold == false
exit = (((strategy.position_size > 0 and bar == 1) or (strategy.position_size < 0 and bar == -1)) and body > abody / 2)
//Arrows
col = exit ? black : up1 or dn1 or up2 or dn2 ? blue : na
needup = up1 or up2
needdn = dn1 or dn2
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 or up2
if strategy.position_size < 0
strategy.close_all()
strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if dn1 or dn2
if strategy.position_size > 0
strategy.close_all()
strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
strategy.close_all()