Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // @version=2
- //
- study(shorttitle="DULBBA V1", title="Dual Bollinger Break Alert v1 by JustUncleL", overlay=true)
- //
- // Title: "Dual Bollinger Break Alert v1 by JustUncleL".
- // Author: JustUncleL
- //
- // * Description *
- // This Alert indicator is a variation of the standard Bollinger Band break strategy. This indicator uses two Bollinger
- // bands: one set to (20,2) and optionally the other set to (150,2). There is also included an optional Bollinger band mininum
- // width thresh-hold factor, expressed as % of SMA, anf optional Divergence criteria.
- //
- // When the faster Bollinger Upper or Lower band goes outside the slower Bollinger Upper or Lower band and a candle closes
- // outside the faster Bollinger band the candle is shaded in Blue and an alert is generated. The alerts are optionally
- // filtered by minimum width factor threshold and optionally confirmed by selected Divergence method.
- //
- // The Bollinger width threshold factor is dependent on timeframe and asset, so it will be needed to tuned for them.
- // The last two numbers displayed on the script heading give the fast and slow width factor of a selected candle.
- //
- // * Modifications *
- // v1 - original.
- //
- // Bollinger Bands Inputs
- fastBBlen = input(20, minval=1, title="Fast Bollinger Length")
- fastBBmult = input(2.0, title="Fast StdDev Multiplier", minval=0.5, maxval=10, step=0.1)
- fastBBsource = input(close, title="Fast Bollinger Source")
- uslow = input(true, title="Use Slow Bollinger Band Filter")
- slowBBlen = input(150, minval=10, title="Slow Bollinger Length")
- slowBBmult = input(2.0, title="Slow StdDev Multiplier", minval=0.5, maxval=10, step=0.1)
- slowBBsource = input(close, title="Slow Bollinger Source")
- fastWthreshold = input(0.4,minval=0.0, maxval=50.0, step=0.1, title="Fast Width Mininum Threshold (zero to disable)")
- slowWthreshold = input(1.0,minval=0.0, maxval=50.0, step=0.1, title="Slow Width Mininum Threshold (zero to disable)")
- //
- method = input(title='Method (0=RSI, 1=macd, 2=stoch, 3=volume, 4=acc/dist, 5=fisher, 6=cci, 7=BB %B, 8=IdealRSI, 9 == qqe RSI):', type=integer, defval=0, minval=0, maxval=9)
- SHOW_LABEL = input(title='Show Labels', type=bool, defval=true)
- SHOW_CHANNEL = input(title='Show Channel', type=bool, defval=false)
- uHid = input(false,title="Use Hidden Divergence in Strategy")
- uReg = input(true,title="Use Regular Divergence in Strategy")
- uDiv = uHid or uReg
- // || RSI / STOCH / VOLUME / ACC/DIST/ FISHER/ CCI/ BB %B Input:
- rsi_smooth = input(title='RSI/STOCH/Volume/ACC-DIST/Fisher/cci Smooth/BB %B length:', type=integer, defval=14)
- // || MACD Input:
- macd_src = input(title='MACD Source:', type=source, defval=close)
- macd_fast = input(title='MACD Fast:', type=integer, defval=12)
- macd_slow = input(title='MACD Slow:', type=integer, defval=26)
- macd_smooth = input(title='MACD Smooth Signal:', type=integer, defval=9)
- //
- high_source = input(close,title="High Source")
- low_source = input(close,title="Low Source")
- // || Functions:
- f_top_fractal(_src)=>_src[4] < _src[2] and _src[3] < _src[2] and _src[2] > _src[1] and _src[2] > _src[0]
- f_bot_fractal(_src)=>_src[4] > _src[2] and _src[3] > _src[2] and _src[2] < _src[1] and _src[2] < _src[0]
- f_fractalize(_src)=>f_top_fractal(_src) ? 1 : f_bot_fractal(_src) ? -1 : 0
- // ||••> START MACD FUNCTION
- f_macd(_src, _fast, _slow, _smooth)=>
- _fast_ma = sma(_src, _fast)
- _slow_ma = sma(_src, _slow)
- _macd = _fast_ma-_slow_ma
- _signal = ema(_macd, _smooth)
- _hist = _macd - _signal
- // ||<•• END MACD FUNCTION
- // ||••> START ACC/DIST FUNCTION
- f_accdist(_smooth)=>_return=sma(cum(close==high and close==low or high==low ? 0 : ((2*close-low-high)/(high-low))*volume), _smooth)
- // ||<•• END ACC/DIST FUNCTION
- // ||••> START FISHER FUNCTION
- f_fisher(_src, _window)=>
- _h = highest(_src, _window)
- _l = lowest(_src, _window)
- _value0 = .66 * ((_src - _l) / max(_h - _l, .001) - .5) + .67 * nz(_value0[1])
- _value1 = _value0 > .99 ? .999 : _value0 < -.99 ? -.999 : _value0
- _fisher = .5 * log((1 + _value1) / max(1 - _value1, .001)) + .5 * nz(_fisher[1])
- // ||<•• END FISHER FUNCTION
- // Rolling Moving Average (or Wells Wilders MA)
- irma(p,l) =>
- irma = (nz(irma[1]) * (l - 1) + p) / l
- // RSI function.
- irsi(p, l) =>
- up = irma(max(change(p), 0), l)
- down = irma(-min(change(p), 0), l)
- irsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
- //
- //
- // --- Start the Homodyne Discriminator Caculations
- //
- idealRSI(p) =>
- C1 = 0.0962
- C2 = 0.5769
- Df = 0.5
- C3 = (nz(Period[1])*0.075+0.54)
- smooth = ((hl2*4.0) + (hl2[1]*3.0) + (hl2[2]*2.0) + (hl2[3]))/10.0
- dDeTrend = (smooth*C1 + nz(smooth[2])*C2 - nz(smooth[4])*C2 - nz(smooth[6])*C1)*C3
- Q1 = (dDeTrend*C1 + nz(dDeTrend[2])*C2 - nz(dDeTrend[4])*C2 - nz(dDeTrend[6])*C1)*C3
- I1 = nz(dDeTrend[3])
- jI = (I1*C1 + nz(I1[2])*C2 - nz(I1[4])*C2 - nz(I1[6])*C1)*C3
- jQ = (Q1*C1 + nz(Q1[2])*C2 - nz(Q1[4])*C2 - nz(Q1[6])*C1)*C3
- I2_ = I1 - jQ
- Q2_ = Q1 + jI
- I2 = 0.2*I2_ + 0.8*nz(I2[1])
- Q2 = 0.2*Q2_ + 0.8*nz(Q2[1])
- Re_ = I2*nz(I2[1]) + Q2*nz(Q2[1])
- Im_ = I2*nz(Q2[1]) - Q2*nz(I2[1])
- Re = 0.2*Re_ + 0.8*nz(Re[1])
- Im = 0.2*Im_ + 0.8*nz(Im[1])
- dp_ = iff(Re!=0 and Im!=0 , 6.28318/atan(Im/Re) , 0)
- II = nz(Period[1])
- dp = max(max(min(min(dp_,1.5*II),50),0.6667*II),6)
- Period = dp*0.2 + nz(Period[1])*0.8
- SmoothPeriod = 0.33*Period + nz(SmoothPeriod[1])*0.67
- rsiLen = round((SmoothPeriod*Df)-1) // Get variable RSI length from discriminator
- idealRSI = irsi(p,rsiLen) // Generate RSI.
- // --- Bollinger Band Vdub BB %B
- pcBB(p,l) =>
- basis = sma(p, l)
- dev = 0.1*stdev(p, l)
- upper = basis + dev
- lower = basis - dev
- pcBB = (p - lower)/(upper - lower)
- qqeRSI(p,l) =>
- Rsi = rsi(p,l)
- qqeRSI = ema(Rsi, 2)
- // === End of Functions.
- method_high = method == 0 ? rsi(high_source, rsi_smooth) :
- method == 1 ? f_macd(macd_src, macd_fast, macd_slow, macd_smooth) :
- method == 2 ? stoch(close, high, low, rsi_smooth) :
- method == 3 ? sma(volume, rsi_smooth) :
- method == 4 ? f_accdist(rsi_smooth) :
- method == 5 ? f_fisher(high_source, rsi_smooth) :
- method == 6 ? cci(high_source, rsi_smooth) :
- method == 7 ? pcBB(high_source, rsi_smooth) :
- method == 8 ? idealRSI(high_source) :
- method == 9 ? qqeRSI(high_source,rsi_smooth) :
- na
- method_low = method == 0 ? rsi(low_source, rsi_smooth) :
- method == 1 ? f_macd(macd_src, macd_fast, macd_slow, macd_smooth) :
- method == 2 ? stoch(close, high, low, rsi_smooth) :
- method == 3 ? sma(volume, rsi_smooth) :
- method == 4 ? f_accdist(rsi_smooth) :
- method == 5 ? f_fisher(low_source, rsi_smooth) :
- method == 6 ? cci(low_source, rsi_smooth) :
- method == 7 ? pcBB(low_source, rsi_smooth) :
- method == 8 ? idealRSI(low_source) :
- method == 9 ? qqeRSI(low_source,rsi_smooth) :
- na
- // === End of Functions.
- fractal_top = f_fractalize(method_high) > 0 ? method_high[2] : na
- fractal_bot = f_fractalize(method_low) < 0 ? method_low[2] : na
- high_prev = valuewhen(fractal_top, method_high[2], 1)
- high_price = valuewhen(fractal_top, high[2], 1)
- low_prev = valuewhen(fractal_bot, method_low[2], 1)
- low_price = valuewhen(fractal_bot, low[2], 1)
- regular_bearish_div = fractal_top and high[2] > high_price and method_high[2] < high_prev
- hidden_bearish_div = fractal_top and high[2] < high_price and method_high[2] > high_prev
- regular_bullish_div = fractal_bot and low[2] < low_price and method_low[2] > low_prev
- hidden_bullish_div = fractal_bot and low[2] > low_price and method_low[2] < low_prev
- plot(title='H F', series=uDiv and fractal_top ? high[2] : na, color=(regular_bearish_div and uReg) or (hidden_bearish_div and uHid)? maroon : not SHOW_CHANNEL ? na : silver, offset=-2)
- plot(title='L F', series=uDiv and fractal_bot ? low[2] : na, color=(regular_bullish_div and uReg) or (hidden_bullish_div and uHid) ? green : not SHOW_CHANNEL ? na : silver, offset=-2)
- plot(title='H D', series=uDiv and fractal_top ? high[2] : na, style=circles, color=(regular_bearish_div and uReg) or (hidden_bearish_div and uHid)? maroon : not SHOW_CHANNEL ? na : silver, linewidth=3, offset=-2)
- plot(title='L D', series=uDiv and fractal_bot ? low[2] : na, style=circles, color=(regular_bullish_div and uReg) or (hidden_bullish_div and uHid) ? green : not SHOW_CHANNEL ? na : silver, linewidth=3, offset=-2)
- plotshape(title='+RBD', series=not SHOW_LABEL or not uReg? na : regular_bearish_div ? high[2] : na, text='R', style=shape.labeldown, location=location.absolute, color=maroon, textcolor=white, offset=-2)
- plotshape(title='+HBD', series=not SHOW_LABEL or not uHid? na : hidden_bearish_div ? high[2] : na, text='H', style=shape.labeldown, location=location.absolute, color=maroon, textcolor=white, offset=-2)
- plotshape(title='-RBD', series=not SHOW_LABEL or not uReg? na : regular_bullish_div ? low[2] : na, text='R', style=shape.labelup, location=location.absolute, color=green, textcolor=white, offset=-2)
- plotshape(title='-HBD', series=not SHOW_LABEL or not uHid? na : hidden_bullish_div ? low[2] : na, text='H', style=shape.labelup, location=location.absolute, color=green, textcolor=white, offset=-2)
- // Centre of Bollinger
- fastBBbase = sma(fastBBsource, fastBBlen)
- slowBBbase = sma(slowBBsource, slowBBlen)
- // Deviation
- fastBBdev = stdev(fastBBsource, fastBBlen)
- slowBBdev = stdev(slowBBsource, slowBBlen)
- // Upper bands
- fastBBupper = fastBBbase + fastBBmult * fastBBdev
- slowBBupper = slowBBbase + slowBBmult * slowBBdev
- // Lower Bands
- fastBBlower = fastBBbase - fastBBmult * fastBBdev
- slowBBlower = slowBBbase - slowBBmult * slowBBdev
- // Bollinger Band Width = (Upper Band - Lower Band) / Simple Moving Average
- fastBBwidth = 100.0*(fastBBupper - fastBBlower) / fastBBbase
- slowBBwidth = 100.0*(slowBBupper - slowBBlower) / slowBBbase
- // Breakout Deviation
- breakBBupper = fastBBsource>fastBBupper and (not uslow or fastBBupper>slowBBupper) and
- fastBBwidth>fastWthreshold and (not uslow or slowBBwidth>slowWthreshold) ? na(breakBBupper[1])? 1 : breakBBupper[1]+1 : 0
- breakBBlower = fastBBsource<fastBBlower and (not uslow or fastBBlower<slowBBlower) and
- fastBBwidth>fastWthreshold and (not uslow or slowBBwidth>slowWthreshold) ? na(breakBBlower[1])? 1 : breakBBlower[1]+1 : 0
- //
- BBalert = breakBBupper or breakBBlower
- bcolor = BBalert ? blue : na
- barcolor(bcolor,title="BB break",editable=false)
- // plot and fill upper bands
- fbu = plot(fastBBupper, title="Fast BB Upper", color=blue, linewidth=2, transp=10)
- fbm = plot(fastBBbase, title="Fast BB Base" , color=teal, linewidth=1, transp=50)
- fbl = plot(fastBBlower, title="Fast BB Lower", color=blue, linewidth=2, transp=10)
- fill(fbu, fbl, title="Fast BB Fill", color=blue, transp=95)
- // plot and fill lower bands
- sbu = plot(slowBBupper, title="Slow BB Upper", color=red, linewidth=2, transp=10)
- sbm = plot(slowBBbase, title="Slow BB Base", color=maroon, linewidth=1, transp=50)
- sbl = plot(slowBBlower, title="Slow BB Lower", color=red, linewidth=2, transp=10)
- fill(sbu, sbl, title="Slow BB Fill", color=red, transp=95)
- longCondition = uDiv ? regular_bullish_div and highest(breakBBlower,6)>0 : breakBBlower==1
- shortCondition = uDiv ? regular_bearish_div and highest(breakBBupper,6)>0 : breakBBupper==1
- // create candle only required if set overlay=false
- //plotcandle(open, high, low, close, title='BB Candle', color = BBalert?blue : open < close ? green : red, wickcolor=black)
- // indicate buy sell condition.
- plotshape(longCondition, title="BB Buy alert", style=shape.arrowup, location=location.belowbar, size=size.auto, text='BUY', color=green, transp=20)
- plotshape(shortCondition, title="BB Sell alert", style=shape.arrowdown, location=location.abovebar, size=size.auto, text='SELL', color=red, transp=20)
- // Display the calculated width factor
- plotshape(fastBBwidth, title="Fast Width Factor", style=shape.circle, location=location.bottom, size=size.tiny, color=gray, transp=50)
- plotshape(slowBBwidth, title="Slow Width Factor", style=shape.circle, location=location.bottom, size=size.tiny, color=gray, transp=50)
- // create Alert for TradingView's alrm sub-system.
- alertcondition(longCondition or shortCondition,title="DULBBB Alert",message="DULBBB Alert")
- //EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement