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.
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.
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.
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.
O RSI e as Bandas de Bollinger são ambos usados para determinar tendências e inversões.
A estratégia define os pontos de lucro (TP) e stop loss (SL) para bloquear os lucros e maximizar a mitigação das perdas.
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.
O tamanho do desvio padrão afeta a largura das faixas e os sinais de negociação.
As inversões em forma de V podem desencadear perdas desnecessárias com as configurações TP/SL sendo muito agressivas.
A configuração incorreta dos parâmetros do RSI leva à diminuição da precisão dos sinais de reversão.
Mais valores de comprimento do RSI podem ser testados para encontrar a combinação ideal de parâmetros.
Podem ser testados mais comprimentos e desvios padrão para encontrar a combinação de parâmetros ideal.
O backtesting pode ajudar a encontrar a relação TP/SL ideal.
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")