This strategy combines moving averages, Bollinger Bands and RSI to assess price trends and overbought/oversold levels for trade signals. It harnesses strengths of multiple indicators to improve accuracy.
Strategy Logic:
Calculate moving average and Bollinger Bands to determine price trend.
Calculate RSI to identify overbought/oversold levels.
Enter long when price breaks above BB lower band and RSI bullish crossover. Vice versa for short.
Use stop loss to control loss per trade.
Advantages:
Multi-indicator verification reduces bad trades.
RSI complements limitations of MAs.
BB identifies breakout levels.
Risks:
Time-consuming to optimize multiple parameters.
Some redundancy between RSI and BBs.
Breakouts prone to failures and reversals.
In summary, this strategy combines MAs, BBs and RSI to identify both trend and reversal trade opportunities. Using multiple indicators can improve results but requires parameter optimization and risk control.
/*backtest start: 2023-08-13 00:00:00 end: 2023-09-12 00:00:00 period: 30m 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/ // © LucasVivien //@version=4 strategy("MA Bolinger Bands + RSI ", shorttitle="MABB + RSI", overlay=true) // User input source = input(title="Price source" , type=input.source , defval=close) RSIlen = input(title="RSI Length" , type=input.integer , defval=6 , group="RSI") RSIlvlOB = input(title="RSI Overbough" , type=input.integer , defval=50 , group="RSI") RSIlvlOS = input(title="RSI Oversold" , type=input.integer , defval=50 , group="RSI") RSIN = input(title="RSI Neutral" , type=input.integer , defval=50 , group="RSI") MAlen = input(title="MA Length" , type=input.integer , defval=200 , group="MABB") BBlen = input(title="BB Length" , type=input.integer , defval=200 , group="MABB") BBmult = input(title="BB multiplier" , type=input.float , defval=2.0 , group="MABB" , tooltip="Set BB closer / appart", minval=0.001, maxval=50) MAtype = input(title="MA type" , type=input.string , defval="SMA", group="MABB" , tooltip="MA type used in BB", options=["SMA", "EMA", "HMA"]) //SLmult = input(title="SL value" ,type=input.float , defval=0.06) // Used indicators RSI = rsi(source, RSIlen) MA = sma(source, MAlen) if MAtype == "EMA" MA := ema(source, MAlen) if MAtype == "HMA" MA := hma(source, MAlen) // Perform Calculations BBdev = BBmult * stdev(source, BBlen) BBupper = MA + BBdev BBlower = MA - BBdev longSL = close - close * 0.06 shortSL = close + close * 0.06 // Signals validation ([0] is trade displayed from strategy() on chart => long/short entry) BBbull = (open < BBlower) and (close > BBlower) BBbear = (open > BBupper) and (close < BBupper) RSIbull = crossover(RSI , RSIN) RSIbear = crossunder(RSI, RSIN) Longsignal = (BBbull) and (RSIbull or RSIbull[1] or RSIbull[2] or RSIbull[3] or RSIbull[4] or RSIbull[5] or RSIbull[6] or RSIbull[7] or RSIbull[8] or RSIbull[9] or RSIbull[10]) Shortsignal = (BBbear) and (RSIbear or RSIbear[1] or RSIbear[2] or RSIbear[3] or RSIbear[4] or RSIbear[5] or RSIbear[6] or RSIbear[7] or RSIbear[8] or RSIbear[9] or RSIbear[10]) // Save SL values var SLlongsaved = 0.0 var SLshortsaved = 0.0 if Longsignal and (strategy.position_size == -1) /////////////////////////////// SLlongsaved := longSL if Shortsignal and (strategy.position_size == 1) //////////////////////////////// SLshortsaved := shortSL // Plots //plotshape(Longsignal , size=size.small, color=color.teal) //plotshape(Shortsignal, size=size.small, color=color.fuchsia) plot(Longsignal ? longSL : na, color=color.red, style=plot.style_linebr, linewidth=6) plot(Shortsignal ? shortSL : na, color=color.red, style=plot.style_linebr, linewidth=6) p1 = plot(BBupper,title="Bollinger Bands Upper Line", color=color.gray, transp=60) p2 = plot(BBlower,title="Bollinger Bands Lower Line", color=color.gray, transp=60) plot(MA, title="Bollinger Bands MA Basis Line" , color=color.white, transp=50) fill(p1, p2, color=color.white, transp=92) // Strategy Entry & Exit //if Longsignal strategy.entry(id="Long entry", long=true, when=Longsignal) //, oca_name="x", oca_type=strategy.oca.cancel) //if Shortsignal strategy.entry(id="Short entry", long=false, when=Shortsignal) //, oca_name="x", oca_type=strategy.oca.cancel) strategy.close(id="Long exit", when=strategy.position_size > 0)//, from_entry="Long entry" //, when=strategy.position_size > 0 // , stop=SLlongsaved) strategy.close(id="Short Exit", when=strategy.position_size < 0)//, from_entry="Short entry" //, when=strategy.position_size < 0 //, stop=SLshortsaved) plot(strategy.position_size) //////////////////////////////////////////////