Stratégie de négociation de renversement du suivi des signaux RSI

Auteur:ChaoZhang est là., Date: le 28 septembre 2023 à 10h54h24
Les étiquettes:

Résumé

Cette stratégie met en œuvre le reversal trading en suivant les signaux manqués de surachat et de survente de l'indicateur RSI. Les signaux d'achat sont générés lorsque le RSI descend des niveaux de surachat et les signaux de vente lorsque le RSI rebondit des niveaux de survente, dans le but de saisir les opportunités de revers.

La logique de la stratégie

Identification du signal

L'indicateur RSI identifie les niveaux de surachat/survente. Suracheté lorsque le RSI dépasse le seuil de surachat, survendu lorsqu'il dépasse le seuil de survente.

overbought = rsi > uplimit
oversold = rsi < dnlimit

Si RSI a été suracheté dernière barre et sorties suracheté cette barre, un signal d'achatup1Si RSI a été survendu dernière barre et sorties survendus cette barre, un signal de ventedn1est généré.

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

Logique de sortie

Si la direction de la barre est alignée sur la direction de position et que le corps de la barre dépasse la moitié de sa moyenne de 10 périodes, un signal de sortie est déclenché.

exit = (((strategy.position_size > 0 and bar == 1) or  
         (strategy.position_size < 0 and bar == -1)) and  
        body > abody / 2)

Les avantages

  1. Suivre les signaux de renversement du RSI manqués, évitant ainsi de détecter en temps opportun les points de surachat/survente.

  2. Utilisez la propriété d'inversion du RSI pour capturer les points tournants.

  3. Incorporer la direction et la taille de la barre dans la logique de sortie pour éviter un suivi ultérieur après les retraits.

Risques et solutions

  1. Risque de faux signaux provenant d'indicateurs de risque élevés

    • Solution: confirmer les signaux avec d'autres indicateurs pour éviter les faux signaux
  2. Les prix ont peut-être déjà baissé de manière significative lors du suivi du signal, augmentant le risque de perte

    • Solution: réduire la taille de la position à l'entrée ou optimiser le moment de l'entrée
  3. Risque de sortie prématurée avant le retour à la rentabilité totale

    • Solution: Améliorer la logique de sortie pour augmenter les chances de réaliser des profits

Des possibilités d'amélioration

  1. Optimiser les paramètres tels que les niveaux de surachat/survente, la période de réflexion, etc. basés sur différents marchés

  2. Ajustez la taille de la position, comme la réduction de la taille lors du suivi des signaux

  3. Améliorer le temps d'entrée, en ajoutant des filtres au-delà des signaux de suivi

  4. Améliorer les sorties pour augmenter la rentabilité, comme les arrêts de profit de trail

  5. Optimiser les arrêts pour réduire les pertes, comme les arrêts de trailing ou les arrêts de cône

Résumé

Cette stratégie met en œuvre le trading de renversement en suivant les signaux de surachat/survente du RSI. Elle présente l'avantage de capturer les signaux de renversement, mais comporte également des risques de faux signaux et de pertes.


/*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()

Plus de