Thanks for checking this and hope you can help me out.
I have created a code that takes into consideration both the Bollinger Bands and RSI indicators and created a strategy when the close is underneath the lower band of the BB and RSI is showing oversold, the signal is to buy, and exit should be when the close is back above the basis line of the Bollinger Bands.
Also when the close is above the upper band of the Bollinger Bands and the RSI is showing overbought, the signal is to sell, and exit should be when the close is back below the basis line of the Bollinger Bands.
However, there is something wrong with the exit as it sometimes triggers correctly and sometimes not. Note that I have added that should there be a 200 pip move in the opposite direction, it should close out the trade.
Below you'll find the code. Please let me know what I've done wrong. Thanks!
// © hkanaan0
//@version=3
// 1. Define strategy settings
strategy(title="Bollinger Breakout", overlay=true,
pyramiding=0, initial_capital=100000,
commission_type=strategy.commission.cash_per_order,
commission_value=4, slippage=2)
smaLength = input(title="SMA Length", type=integer, defval=50)
stdLength = input(title="StdDev Length", type=integer, defval=50)
ubOffset = input(title="Upper Band Offset", type=float, defval=2, step=0.5)
lbOffset = input(title="Lower Band Offset", type=float, defval=2, step=0.5)
usePosSize = input(title="Use Position Sizing?", type=bool, defval=true)
riskPerc = input(title="Risk %", type=float, defval=0.5, step=0.25)
rsiSource = input(title = "RSI Source", type = source, defval = hlc3)
rsiLength = input(title = "RSI Length", type = integer, defval = 14)
rsiOverbought = input(title = "RSI Overbought Level", type = integer, defval = 70)
rsiOversold = input(title = "RSI Oversold Level", type = integer, defval = 30)
// 2. Calculate strategy values
rsiValue = rsi(rsiSource, rsiLength)
isRSIOB = rsiValue >= rsiOverbought
isRSIOS = rsiValue <= rsiOversold
isBullish = crossover(rsiValue, 55)
isBearish = crossunder(rsiValue, 45)
smaValue = sma(hlc3, smaLength)
stdDev = stdev(hlc3, stdLength)
upperBand = smaValue + (stdDev * ubOffset)
lowerBand = smaValue - (stdDev * lbOffset)
riskEquity = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize = usePosSize ? floor(riskEquity / atrCurrency) : 1
// 3. Output strategy data
plot(series=smaValue, title="SMA", color=blue, linewidth=2)
plot(series=upperBand, title="UB", color=green,
linewidth=4)
plot(series=lowerBand, title="LB", color=red,
linewidth=4)
//plotshape(isRSIOB, title="Overbought" , location=location.abovebar , color=red , transp=0 , style=shape.triangledown , text="Sell")
//plotshape(isRSIOS, title = "Oversold", location = location.belowbar, color =lime, transp = 0, style = shape.triangleup, text = "Buy")
plotshape(isBullish, title = "Bullish Momentum", location=location.abovebar, color=lime, transp = 0, style = shape.arrowup, text = "Bullish")
plotshape(isBearish, title = "Bearish Momentum", location=location.belowbar, color=red, transp = 0, style = shape.arrowdown, text = "Bearish")
// 4. Determine long trading conditions
enterLong = crossunder(close, lowerBand) and isRSIOS
exitLong = crossover(close, smaValue)
// 5. Code short trading conditions
enterShort = crossover(close, upperBand) and isRSIOB
exitShort = crossunder(close, smaValue)
// 6. Submit entry orders
if (enterLong)
strategy.order(id="Enter Long", long=true, qty=posSize)
if (enterShort)
strategy.order(id="Enter Short", long=false, qty=posSize)
// 7. Submit exit orders
strategy.exit(id="Exit Long", when=exitLong, loss = 200)
strategy.exit(id="Exit Short", when=exitShort, loss = 200)```