RSI Bollinger Bands TP/SL Estratégia

Autora:ChaoZhang, Data: 21-12-2023 11:17:19
Tags:

img

I. Visão geral da estratégia

A estratégia é chamada de RSI Bollinger Bands TP/SL Strategy. Combina o indicador RSI e Bollinger Bands para identificar tendências e sinais de negociação. Quando o indicador RSI mostra sinais de sobrecompra ou sobrevenda e o preço toca ou quebra as Bandas de Bollinger, as posições longas ou curtas serão abertas. Além disso, os pontos de take profit e stop loss também são definidos para controlar os riscos.

II. Lógica estratégica

Indicador RSI para reversões

O indicador RSI avalia se uma ação está sobrecomprada ou sobrevendida. Uma leitura do RSI acima da linha de sobrecompra indica condições de sobrecompra, enquanto uma leitura abaixo da linha de sobrevenda indica condições de sobrevenda. A linha de sobrecompra é definida em 50 e a linha de sobrevenda é definida em 50 nesta estratégia.

2. Bandas de Bollinger para tendência

As bandas de Bollinger traçam linhas de desvio padrão acima e abaixo de uma média móvel simples. A banda superior atua como resistência e a banda inferior atua como suporte. Um cruzamento para cima da banda inferior é um sinal de compra, enquanto um cruzamento para baixo da banda superior é um sinal de venda.

3. Combinação de RSI e Bandas de Bollinger

Quando o indicador RSI mostra um sinal de reversão inferior e o preço atravessa a faixa inferior das Bandas de Bollinger, é considerado uma reversão ascendente, portanto, vai longo.

III. Vantagens

1. Melhoria da precisão com indicadores duplos

O RSI e as Bandas de Bollinger são ambos usados para determinar tendências e inversões.

2. Controle de riscos utilizando TP/SL

A estratégia define os pontos de lucro (TP) e stop loss (SL) para bloquear os lucros e maximizar a mitigação das perdas.

3. Orientações personalizáveis

Os utilizadores podem negociar apenas long, short ou ambas as direcções com base nas condições de mercado, permitindo um controlo flexível do risco.

IV. Riscos

1. Parâmetros sensíveis das bandas de Bollinger

O tamanho do desvio padrão afeta a largura das faixas e os sinais de negociação.

2. Riscos de TP/SL

As inversões em forma de V podem desencadear perdas desnecessárias com as configurações TP/SL sendo muito agressivas.

Parâmetros sensíveis do RSI

A configuração incorreta dos parâmetros do RSI leva à diminuição da precisão dos sinais de reversão.

V. Orientações de otimização

1. Otimizar os parâmetros do RSI

Mais valores de comprimento do RSI podem ser testados para encontrar a combinação ideal de parâmetros.

2. Otimizar os parâmetros das bandas de Bollinger

Podem ser testados mais comprimentos e desvios padrão para encontrar a combinação de parâmetros ideal.

3. Teste diferentes relações TP/SL

O backtesting pode ajudar a encontrar a relação TP/SL ideal.

VI. Conclusão

Esta estratégia utiliza o RSI e as Bandas de Bollinger para identificar tendências e reversões, e define o TP/SL para controlar riscos. Pode detectar automaticamente sinais de negociação e gerenciar saídas. Ainda há alguns riscos que podem ser melhorados pela otimização de parâmetros. Em geral, esta é uma estratégia prática com forte aplicabilidade.


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



















Mais.