RSI Bollinger Bands Stratégie TP/SL

Auteur:ChaoZhang est là., Date: 21-12-2023 à 11 h 17
Les étiquettes:

img

I. Vue d'ensemble de la stratégie

La stratégie est appelée RSI Bollinger Bands TP/SL Strategy. Elle combine l'indicateur RSI et Bollinger Bands pour identifier les tendances et les signaux de trading. Lorsque l'indicateur RSI montre des signaux de surachat ou de survente et que le prix touche ou dépasse les Bollinger Bands, des positions longues ou courtes seront ouvertes.

II. Logique stratégique

Indicateur RSI pour les renversements

L'indicateur RSI juge si un stock est suracheté ou survendu. Une lecture RSI au-dessus de la ligne de surachat indique des conditions de surachat, tandis qu'une lecture au-dessous de la ligne de survente indique des conditions de survente. La ligne de surachat est définie à 50 et la ligne de survente est définie à 50 dans cette stratégie.

2. Bandes de Bollinger pour la tendance

Les bandes de Bollinger tracent des lignes d'écart type au-dessus et en dessous d'une moyenne mobile simple. La bande supérieure agit comme une résistance et la bande inférieure agit comme un support.

3. Combinaison de l'indicateur RSI et des bandes de Bollinger

Lorsque l'indicateur RSI affiche un signal d'inversion inférieur et que le prix franchit la bande inférieure des bandes de Bollinger, il est considéré comme une inversion ascendante, donc long.

III. Avantages

1. Une précision accrue grâce à des indicateurs doubles

Le RSI et les bandes de Bollinger sont tous deux utilisés pour déterminer les tendances et les renversements.

2. Contrôle des risques à l'aide de la TP/SL

La stratégie définit des points de profit (TP) et de stop loss (SL) pour verrouiller les bénéfices et maximiser l'atténuation des pertes.

3. Des directions personnalisables

Les utilisateurs peuvent opter uniquement pour des positions longues, courtes ou dans les deux sens en fonction des conditions du marché, ce qui permet un contrôle du risque flexible.

IV. Les risques

1. Paramètres des bandes de Bollinger sensibles

La taille de l'écart type affecte la largeur des bandes et les signaux de négociation.

2. Risques de TP/SL

Les renversements en forme de V peuvent déclencher des pertes inutiles avec des réglages TP/SL trop agressifs.

3. Paramètres sensibles de l'indicateur RSI

Des paramètres RSI incorrects entraînent une diminution de la précision des signaux d'inversion.

V. Directions d'optimisation

1. Optimiser les paramètres de l'indicateur RSI

Plus de valeurs de longueur RSI peuvent être testées pour trouver la combinaison optimale de paramètres.

2. Optimiser les paramètres des bandes de Bollinger

Plus de longueurs et d'écart types peuvent être testés pour trouver la combinaison optimale de paramètres.

3. Testez différents rapports TP/SL

Le rétro-test peut aider à trouver le rapport TP/SL optimal.

VI. Conclusion

Cette stratégie tire parti du RSI et des bandes de Bollinger pour identifier les tendances et les renversements, et définit TP / SL pour contrôler les risques. Elle peut détecter automatiquement les signaux de trading et gérer les sorties. Il y a encore quelques risques qui peuvent être améliorés par l'optimisation des paramètres. En général, il s'agit d'une stratégie pratique avec une forte applicabilité.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © BigCoinHunter

//@version=5
strategy(title="RSI_Boll-TP/SL", overlay=true, 
     pyramiding=0, default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, initial_capital=1000, 
     currency=currency.USD, commission_value=0.05, 
     commission_type=strategy.commission.percent, 
     process_orders_on_close=true)

//----------- get the user inputs --------------

//---------- RSI -------------
price = input(close, title="Source")

RSIlength = input.int(defval=6,title="RSI Length") 
RSIoverSold = input.int(defval=50, title="RSI OverSold", minval=1)
RSIoverBought = input.int(defval=50, title="RSI OverBought", minval=1)

//------- Bollinger Bands -----------
BBlength = input.int(defval=200, title="Bollinger Period Length", minval=1)
BBmult = input.float(defval=2.0, minval=0.001, maxval=50, step=0.1, title="Bollinger Bands Standard Deviation")
BBbasis = ta.sma(price, BBlength)
BBdev = BBmult * ta.stdev(price, BBlength)
BBupper = BBbasis + BBdev
BBlower = BBbasis - BBdev
source = close
buyEntry = ta.crossover(source, BBlower)
sellEntry = ta.crossunder(source, BBupper)
plot(BBbasis, color=color.aqua, title="Bollinger Bands SMA Basis Line")
p1 = plot(BBupper, color=color.silver, title="Bollinger Bands Upper Line")
p2 = plot(BBlower, color=color.silver, title="Bollinger Bands Lower Line")
fill(plot1=p1, plot2=p2, title="Bollinger BackGround", color=color.new(color.aqua,90), fillgaps=false, editable=true)

//---------- input TP/SL ---------------
tp = input.float(title="Take Profit:", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01
sl = input.float(title="Stop Loss:  ", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01

longEntry = input.bool(defval=true, title= 'Long Entry', inline="11")
shortEntry = input.bool(defval=true, title='Short Entry', inline="11")

//---------- backtest range setup ------------
fromDay   = input.int(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input.int(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear  = input.int(defval = 2021, title = "From Year", minval = 2010)
toDay     = input.int(defval = 30, title = "To Day", minval = 1, maxval = 31)
toMonth   = input.int(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear    = input.int(defval = 2042, title = "To Year", minval = 2010)

//------------ time interval setup -----------
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)  // backtest start window
finish    = timestamp(toYear, toMonth, toDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

//------- define the global variables ------
var bool long = true
var bool stoppedOutLong = false
var bool stoppedOutShort = false
//--------- Colors ---------------

TrendColor = RSIoverBought and (price[1] > BBupper and price < BBupper) and BBbasis < BBbasis[1] ? color.red : RSIoverSold and (price[1] < BBlower and price > BBlower) and BBbasis > BBbasis[1] ? color.green : na
//bgcolor(switch2?(color.new(TrendColor,50)):na)


//--------- calculate the input/output points -----------
longProfitPrice  = strategy.position_avg_price * (1 + tp)     // tp -> take profit percentage
longStopPrice = strategy.position_avg_price * (1 - sl)        // sl -> stop loss percentage

shortProfitPrice  = strategy.position_avg_price * (1 - tp)
shortStopPrice = strategy.position_avg_price * (1 + sl)


//---------- RSI + Bollinger Bands Strategy -------------
vrsi = ta.rsi(price, RSIlength)

rsiCrossOver = ta.crossover(vrsi, RSIoverSold)
rsiCrossUnder = ta.crossunder(vrsi, RSIoverBought)

BBCrossOver = ta.crossover(source, BBlower)
BBCrossUnder = ta.crossunder(source, BBupper)

if (not na(vrsi))

    if rsiCrossOver and BBCrossOver
        long := true
        
    if rsiCrossUnder and BBCrossUnder
        long := false

//------------------- determine buy and sell points ---------------------
buySignall = window() and long  and (not stoppedOutLong)
sellSignall = window() and (not long)  and (not stoppedOutShort)

//---------- execute the strategy -----------------
if(longEntry and shortEntry)
    if long 
        strategy.entry("LONG", strategy.long, when = buySignall, comment = "ENTER LONG")
        stoppedOutLong := true
        stoppedOutShort := false
    else 
        strategy.entry("SHORT", strategy.short, when = sellSignall, comment = "ENTER SHORT")
        stoppedOutLong  := false
        stoppedOutShort := true

else if(longEntry)
    strategy.entry("LONG", strategy.long,  when = buySignall)
    strategy.close("LONG", when = sellSignall)
    if long 
        stoppedOutLong := true
    else
        stoppedOutLong  := false

else if(shortEntry)
    strategy.entry("SHORT", strategy.short, when = sellSignall)
    strategy.close("SHORT", when = buySignall)
    if not long
        stoppedOutShort := true
    else
        stoppedOutShort := false
    

//----------------- take profit and stop loss -----------------
if(tp>0.0 and sl>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG", limit=longProfitPrice, stop=longStopPrice, comment="Long TP/SL Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT", limit=shortProfitPrice, stop=shortStopPrice, comment="Short TP/SL Trigger")

else if(tp>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG", limit=longProfitPrice, comment="Long TP Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT", limit=shortProfitPrice, comment="Short TP Trigger")
        
else if(sl>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG",  stop=longStopPrice, comment="Long SL Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT",  stop=shortStopPrice, comment="Short SL Trigger")



















Plus de