Stratégie de trading composée de contrôle des risques basée sur un RSI rapide


Date de création: 2023-11-13 11:36:34 Dernière modification: 2023-11-13 11:36:34
Copier: 3 Nombre de clics: 646
1
Suivre
1617
Abonnés

Stratégie de trading composée de contrôle des risques basée sur un RSI rapide

Aperçu

Cette stratégie est conçue pour la plateforme de trading en temps réel BitMEX. Elle analyse les indicateurs RSI rapides, sélectionne les signaux de plusieurs indicateurs techniques et permet de suivre les tendances des transactions de manière efficace. La stratégie met en place une gestion des fonds et un mécanisme de stop-loss pour contrôler efficacement les risques de transaction.

Principe de stratégie

  1. Calculer le RSI rapide, paramètres définis sur la ligne de 7 jours, la ligne de surachat 25, la ligne de survente 75. Lorsque le RSI traverse la ligne de surachat, c’est un signal de surachat; lorsque le RSI traverse la ligne de survente, c’est un signal de survente.

  2. Le filtrage des entités de ligne K. Le disque doit être ouvert en ligne noire et la longueur de l’entité doit être au moins égale à 20% de la longueur moyenne d’hier.

  3. Le filtrage des couleurs des lignes K. Il demande que les 4 dernières lignes K soient blanches pour les lignes négatives et que les 4 dernières lignes K soient blanches pour les lignes positives.

  4. La logique d’arrêt de la perte. Lorsque le prix se déplace dans une direction défavorable, la position de placement est arrêtée.

  5. Configurer un mécanisme de défense contre les rebonds. Lorsque le prix se déplace dans la direction favorable et atteint la ligne de stop-loss, émettre à nouveau un signal avant de placer.

  6. Gestion des fonds. Création d’une position avec un pourcentage de fonds fixes et doublement de la position pour chaque perte.

Analyse des avantages

  1. Les paramètres du RSI rapide sont réglés de manière rationnelle et permettent de capturer rapidement la tendance. La combinaison des entités de la ligne K et du jugement des couleurs permet de filtrer efficacement les fausses ruptures.

  2. Les signaux de filtrage multicouches permettent de réduire le nombre de transactions et d’augmenter le taux de victoire.

  3. La stratégie est dotée d’un mécanisme d’arrêt des pertes qui permet de contrôler efficacement les pertes individuelles.

  4. La gestion modérément radicale des fonds est assurée par l’adaptation dynamique des positions.

  5. La période de transaction peut être personnalisée pour éviter les perturbations causées par les événements majeurs.

Risque et optimisation

  1. Une vitesse trop rapide peut entraîner une perte d’opportunités de négociation.

  2. Il est impossible de juger efficacement la fin d’une tendance. Un potentiel renversement peut être envisagé en combinaison avec d’autres indicateurs.

  3. La modification de position est trop radicale et peut entraîner un verrouillage de position.

  4. Les paramètres peuvent être ajustés en fonction des différents marchés pour obtenir une meilleure combinaison de paramètres.

Résumer

Cette stratégie est globalement relativement robuste, en déterminant la direction de la tendance par le RSI rapide, puis en combinant les signaux de filtrage de plusieurs indicateurs techniques, il est possible d’obtenir de meilleurs rendements dans la tendance. En même temps, la stratégie a une certaine marge d’optimisation, elle peut s’adapter à différents environnements de marché en ajustant la combinaison de paramètres et a une grande utilité.

Code source de la stratégie
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Robot BitMEX Fast RSI v1.0", shorttitle = "Robot BitMEX Fast RSI v1.0", overlay = false, 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(true, defval = true, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
rsiperiod = input(7, defval = 7, minval = 2, maxval = 100, title = "RSI Period")
rsilimit = input(25, defval = 25, minval = 1, maxval = 30, title = "RSI limit")
rsibars = input(1, defval = 1, minval = 1, maxval = 20, title = "RSI Bars")
useocf = input(true, defval = true, title = "Use Open Color Filter")
useccf = input(true, defval = true, title = "Use Close Color Filter")
openbars = input(4, defval = 4, minval = 1, maxval = 20, title = "Open Color Bars")
closebars = input(1, defval = 1, minval = 1, maxval = 20, title = "Close Color Bars")
useobf = input(true, defval = true, title = "Use Open Body Filter")
usecbf = input(true, defval = true, title = "Use Close Body Filter")
openbody = input(20, defval = 20, minval = 0, maxval = 1000, title = "Open Body Minimum, %")
closebody = input(50, defval = 50, minval = 0, maxval = 1000, title = "Close Body Minimum, %")
usecnf = input(true, defval = true, title = "Use Close Norma Filter")
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
uprsi = rma(max(change(close), 0), rsiperiod)
dnrsi = rma(-min(change(close), 0), rsiperiod)
rsi = dnrsi == 0 ? 100 : uprsi == 0 ? 0 : 100 - (100 / (1 + uprsi / dnrsi))
uplimit = 100 - rsilimit
dnlimit = rsilimit
rsidn = rsi < dnlimit ? 1 : 0
rsiup = rsi > uplimit ? 1 : 0
rsidnok = sma(rsidn, rsibars) == 1
rsiupok = sma(rsiup, rsibars) == 1

//Body Filter
body = abs(close - open)
abody = sma(body, 10)
openbodyok = body >= abody / 100 * openbody or useobf == false
closebodyok = body >= abody / 100 * closebody or usecbf == false

//Color Filter
bar = close > open ? 1 : close < open ? -1 : 0
gbar = bar == 1 ? 1 : 0
rbar = bar == -1 ? 1 : 0
opengbarok = sma(gbar, openbars) == 1 or useocf == false
openrbarok = sma(rbar, openbars) == 1 or useocf == false
closebarok = (strategy.position_size > 0 and bar == 1) or (strategy.position_size < 0 and bar == -1) or useccf == false

//Norma Filter
norma = (rsi > dnlimit and rsi < uplimit) or usecnf == false

//Signals
up = openrbarok and rsidnok and openbodyok and (strategy.position_size == 0 or close < strategy.position_avg_price)
dn = opengbarok and rsiupok and openbodyok and (strategy.position_size == 0 or close > strategy.position_avg_price)
exit = ((strategy.position_size > 0 and closebarok and norma) or (strategy.position_size < 0 and closebarok and norma)) and closebodyok

//Indicator
plot(rsi, color = blue, linewidth = 3, title = "Double RSI")
plot(uplimit, color = black, title = "Upper Line")
plot(dnlimit, color = black, title = "Lower Line")
colbg = rsi > uplimit ? red : rsi < dnlimit ? lime : na
bgcolor(colbg, transp = 20)

//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 up
    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 dn
    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()