/@version=3 // Copyright (c) 2018-present, Alex Orekhov (everget) // On Balance Volume script may be freely distributed under the MIT license. study("On Balance Volume", shorttitle="OBV", precision=0) showSignal = input(title="Show Signal ?", type=bool, defval=true) signalType = input(title="Signal Smoothing Type", defval="SMA", options=["EMA", "SMA"]) signalLength = input(title="Signal Smoothing Length", type=integer, defval=21) highlightCrossovers = input(title="Highlight Crossovers ?", type=bool, defval=false) applyFilling = input(title="Apply Ribbon Filling ?", type=bool, defval=true) src = input(title="Source", type=source, defval=close) obv = cum(sign(change(src)) * volume) signal = signalType == "EMA" ? ema(obv, signalLength) : sma(obv, signalLength) trendColor = obv > signal ? #0ebb23 : red obvColor = applyFilling ? trendColor : #0094ff signalColor = applyFilling ? trendColor : #ff6a00 obvPlot = plot(obv, title="OBV", linewidth=2, color=obvColor, transp=0) signalPlot = plot(showSignal ? signal : na, title="Signal", color=signalColor, transp=0) transparent = color(white, 100) fillColor = applyFilling ? trendColor : transparent fill(obvPlot, signalPlot, color=fillColor, transp=70) plotshape(crossover(obv, signal) and highlightCrossovers ? obv : na, title="Crossover", location=location.absolute, style=shape.circle, size=size.tiny, color=green, transp=0) plotshape(crossunder(obv, signal) and highlightCrossovers ? obv : na, title="Crossunder", location=location.absolute, style=shape.circle, size=size.tiny, color=red, transp=0)