A cycle oscillator will turn up on a bar that traded almost nothing and on a bar that traded several times the usual amount, and it will draw both turns the same size. That is a strange way to read a market whose whole record of participation is the volume column. Volume Pulse is the library oscillator that refuses to treat those bars as equal. It builds a price series whose steps are scaled by relative volume, runs that series through a roofing filter, and then refuses to print its strongest mark unless the slower cycle, the close location, and the volume itself agree.
Short answer
Volume Pulse is a Pine Script v6 oscillator in a separate pane. Pulse is the volume-weighted cycle, scaled to about -100 to +100. Wave is the same kind of cycle on price alone, smoothed more slowly. Flow is a short average of where volume closed inside the bar. A long trigger A is a confirmed cross of Pulse up through its two-bar average, from at or below the extreme level, with all three of Wave, Flow, and volume agreeing. B means two of the three. C is a weaker cross and is hidden unless you ask for it. Diamonds mark Pulse breaking its own last swing while Wave agrees. Nothing here is an instruction to trade.
Key facts
- The filter is a two-pole high-pass followed by an Ehlers SuperSmoother, then automatic gain control, in the family of the roofing filter described by John F. Ehlers.
- Intraday preset: high-pass of 80 bars, fast smoother of 8, slow smoother of 27. Scalp is 48, 6, and 20. Swing is 125, 12, and 40.
- Relative volume is capped at 3 times its 50-bar average, so one enormous bar cannot dominate the oscillator for days.
- Pulse is cyan above its white Trigger line and red below it. The Trigger line is a 2-bar average of Pulse.
- Yellow means Pulse is beyond 90 or below -90. Purple means it has stayed there for three bars or more. Those colors use 90, not the Extreme level input.
- The Extreme level input defaults to 80. It sets the dashed lines and the level a grade A or B cross must come from.
- Wave has to have turned, from at or beyond 50, within the last 7 bars to count toward a grade.
- Flow is positive when recent volume closed nearer the highs, negative when nearer the lows.
- Every grade is decided with barstate.isconfirmed. The mark does not move after the bar closes.
- Grade C and the volume-climax style of "show everything" are off by default. Continuation diamonds are on.
| Mark | Pulse | What else has to be true | Shown by default |
|---|---|---|---|
| Long A | Crosses above Trigger from at or below the extreme | Wave turned up recently, Flow above zero, volume at least average | Yes |
| Long B | Same cross, same place | Two of those three | Yes |
| Long C | Crosses above Trigger with prior Pulse at or below -50 | Not already A or B | No |
| Short A, B, C | The mirror at the top | Wave turn down, Flow below zero, volume | C is hidden |
| Continuation diamond | Breaks its own last 3-bar swing | Wave is on the same side of zero, Pulse is not past the extreme | Yes |
Weight the step, then throw away the trend and the noise
The raw material is not close. Each bar contributes a step of close minus the previous close, multiplied by how heavy that bar's volume was relative to a 50-bar average. A bar at twice average volume moves the series twice as far as a bar with the same price change and ordinary volume. The multiple is capped at 3, which is the input "Cap volume weight at x average". Without the cap, a single news bar can pin the oscillator for as long as that spike remains inside the filter memory.
A running sum of those steps still has a drift, and a drift is not a cycle. The high-pass filter is there to remove the slow part. It is a two-pole high-pass: its period is the preset, 80 bars on Intraday, and it is applied on every bar so its own history stays intact. What comes out is the faster movement, still jagged. The SuperSmoother then removes cycles shorter than its length, 8 bars for Pulse on the Intraday preset. High-pass, then smooth, is the roofing filter. Trend out one end, tick noise out the other, cycle in the middle.
The output of a filter still depends on how large the market's moves are. Automatic gain control divides by a peak that jumps up immediately when a larger value appears and then decays by a factor of 0.991 each bar. The result stays near the range -1 to +1 on a quiet symbol and on a wild one. A quotient transform, (x + 0.3) / (0.3x + 1), pushes values toward the extremes so a turn is easier to see, and the script multiplies by 100 for the pane. Pulse is that number. It is not RSI, and it will not match RSI on the same chart. If you wanted RSI, this is the wrong indicator.
Wave and Flow are there so Pulse cannot agree with itself
Wave uses the same high-pass and the same gain control, but the input is close, not the volume-weighted steps, and the smoother is the slow length, 27 bars on Intraday. There is no quotient transform. Wave is the background cycle of price. It is drawn as a line filled down to zero, red and translucent, so it reads as a region rather than as a third line fighting Pulse for attention.
Flow answers a different question: where inside the bar the volume finished. The close location value is (close - low) minus (high - close), divided by the range. It is +1 when the bar closes on its high, -1 when it closes on its low, and 0 when it closes in the middle or when the range is zero. That value is multiplied by the same capped relative volume, smoothed with a 3-bar EMA, passed through the same kind of gain control, and scaled by 60 so the columns sit inside the pane without covering the lines. Green columns are a positive result. Red columns are negative. You can hide them.
The white line is not a separate theory. It is a 2-bar simple average of Pulse, named Trigger in the script. Crosses are measured against it because a cross of Pulse through a slightly slower version of itself is a turn in Pulse, not a comparison with an unrelated oscillator. If you lengthen that average you will get fewer, later crosses. The published script does not expose the length. Changing it means editing the ta.sma call, which is a one-line diff.
//@version=6
indicator("How a Volume Pulse grade is counted", overlay = false)
// Stand-ins, so the grade below compiles on its own. The library script
// assigns the roofing-filter outputs to these names instead.
pulse = ta.ema(close - nz(close[1]), 8)
wave = ta.ema(pulse, 5)
flow = high == low ? 0.0 : ((close - low) - (high - close)) / (high - low)
extreme = input.float(80, "Extreme level")
turnWindow = input.int(7, "Wave turn must be within (bars)")
trigger = ta.sma(pulse, 2)
relVol = math.min(3.0, nz(volume / ta.sma(volume, 50), 1))
crossUp = ta.crossover(pulse, trigger)
fromLow = ta.lowest(pulse, 3) <= -extreme
waveTurnUp = wave > wave[1] and wave[1] <= wave[2] and wave[1] <= -50
recentUp = nz(ta.barssince(waveTurnUp), 999) <= turnWindow
score = (recentUp ? 1 : 0) + (flow > 0 ? 1 : 0) + (relVol >= 1 ? 1 : 0)
longA = barstate.isconfirmed and crossUp and fromLow and score == 3
longB = barstate.isconfirmed and crossUp and fromLow and score == 2
plot(pulse, "Pulse")
plot(trigger, "Trigger", color.white)
plotshape(longA, "Long trigger A", shape.labelup, location.bottom, color.green, text = "A", textcolor = color.black, size = size.tiny)
plotshape(longB, "Long trigger B", shape.labelup, location.bottom, color.teal, text = "B", textcolor = color.white, size = size.tiny)The three series at the top are stand-ins so the fragment compiles. They are not scaled to the pane, and they are not the filter. In the library script those names are the roofing-filter outputs, and the short side repeats this test at the top of the range.
Three different numbers, and only two of them move together
People mix up the extreme, the wave threshold, and the color change, because all three are large round numbers and only one of them is an input. The Extreme level, default 80, is the dashed line and the place a grade A or B cross has to come from. The test is the lowest Pulse of the last three bars, so a cross still counts if Pulse touched the extreme two bars ago and has already lifted. Wave's contribution uses a fixed 50: a trough in Wave only counts if that trough was at or below -50, and it has to have happened within the last 7 bars. The yellow and purple colors use a fixed 90. You can move the dashed lines to 70 without making the line turn yellow any sooner.
Grade A is the cross, the extreme, and a score of 3. The score gives one point for a recent Wave turn, one for Flow on the same side, and one for relative volume of at least 1. Grade B is the same cross from the same extreme with a score of 2. A score of 1 or 0 does not become a B. It can still be a C, and C is a different, looser test: the cross happened, the previous Pulse was at or below -50, and the bar was not already A or B. C is off by default because it is the mark that will fire when almost nothing else agreed. Turn it on when you want to see how often Pulse turns alone.
Short grades mirror the long ones. A short A needs a cross under the Trigger line, a three-bar high at or above the extreme, a Wave crest at or above +50 within the window, Flow below zero, and relative volume at least 1. The colors of the labels match the grade, green and teal underneath, red on top. The letter on the label is the grade. There is no hidden fifth condition.
Continuation is a break of Pulse, not another grade
A trend does not only turn at the extreme. After a pullback, Pulse often breaks the swing it just made, while Wave is still on the trend side of zero. The script marks that with a diamond. The swing is a 3-bar pivot of Pulse itself, not of price. An up continuation is a confirmed cross above the last such pivot high, with Wave above zero, and with Pulse still below the extreme so the mark is not also a blow-off at the top of the pane. Down is the mirror. Diamonds do not receive a grade. They are a different event, and the input "Show continuation breaks" removes them without affecting A and B.
The color of Pulse is a state, not a mark. Above the Trigger line it is cyan. Below it, red. If the absolute value reaches 90, the line turns yellow for that bar. If it stays at or beyond 90 for three bars, the line turns purple and an alert condition can fire on the bar the streak starts. Purple is the script's way of saying the oscillator is pinned, which is when a cycle reading is least informative. A pinned oscillator is not a stronger version of a grade A. Grades require a cross. A line that sits at 90 is not crossing anything.
Presets change the filter lengths and nothing else. Scalp reacts fastest and will print more turns. Swing removes more of the short cycle and prints fewer. The grade rules, the extreme, and the volume cap stay put when you switch presets. If a Scalp chart looks busy, the busy part is the filter, not a bug in the grades. Switching to Swing is the first thing to try before you start deleting conditions.
Reading it without turning it into a promise
Volume Pulse is included in every paid plan. Liquidity Sweeps and Anchored VWAP Engine open for any signed-in account. There is no free plan separate from those. The oscillator runs in its own pane, so it does not overlay price. On the chart inside PineScripter that means crypto spot data, 308 Binance markets, up to 5,000 bars. The script pastes into TradingView unchanged if you need it on a market the app does not carry.
Alerts exist for long A, long A or B, the short equivalents, a continuation break, and the first bar of a purple extreme. They are the same booleans as the shapes, and they are already gated on a confirmed bar. You still attach them in TradingView. The app can record alerts you send to a script's webhook, up to the live-alert limit of the plan, which is 5 on Mini, 10 on Pro, and 100 on Ultra.
The edit that teaches the most is the extreme, not the filter. Raise it and A and B get rarer, because fewer crosses start from a deep enough reading. Lower it and you are grading ordinary crosses. The Wave window does the same job on the slow cycle: a short window demands that Wave turned almost together with Pulse, a long window lets an old Wave turn keep qualifying. Change one of those, look at the letters, and you will see what the score was doing. That is a better use of the editor than asking for a new oscillator from scratch.
Frequently asked questions
What is Volume Pulse?
It is a cycle oscillator. Price changes are weighted by relative volume, the trend and the very short noise are filtered out, and the result is scaled to roughly -100 to +100. A separate slower line, Wave, is the cycle of price alone. Columns, Flow, show whether volume closed near the high or the low of the bar.
What is the difference between grade A and grade B?
Both require a confirmed cross of Pulse through its Trigger line from the extreme. Grade A also needs all three confirmations: a recent Wave turn, Flow on the same side, and volume at least average. Grade B needs any two of them. Grade C is a looser cross and is hidden unless you enable it.
Why is the line yellow at a different level than the dashed line?
The dashed lines follow the Extreme level input, which defaults to 80 and is also the level a grade A or B must come from. Yellow and purple are fixed at 90. Yellow is one bar beyond 90. Purple is three or more bars. Moving the input does not move those colors.
Does Volume Pulse repaint?
The grades are computed on barstate.isconfirmed, so a mark is not printed until the bar closes, and it is not moved afterward. The lines themselves update during the current bar, like any oscillator plotted on a forming bar. The previous bars stay where the close left them.
Is a long trigger a recommendation to buy?
No. Long and short are the names of the two directions of the oscillator. A letter grade says how many of Wave, Flow, and volume agreed with a cross. It does not say what to do about it.
The practical takeaway
Separate the three layers before you argue with a letter on the chart. Pulse is a volume-weighted cycle with the trend and the noise stripped off. Wave is the slower cycle of price alone. Flow is where the bar closed, weighted by how heavy it was. Grade A means a confirmed cross from the extreme with all three extras in agreement. Grade B means two. The yellow line at 90 is a different rule from the dashed line at 80. Once those are distinct, the pane is a set of measurements you can audit, not a mood.
Volume Pulse is in the indicator library on every paid plan. The filter lengths and the grade are the parts worth reading before you change them, and PineScripter opens the script in the editor so a change to the extreme or the Wave window is a reviewable diff rather than a new oscillator.
Sources
- Pine Script v6 reference: ta.crossover
- Pine Script v6 reference: ta.sma
- Pine Script v6 reference: barstate.isconfirmed
Related reading: estimated delta from the same bars, why the grade waits for the close, divergence, a different use of swings, where that volume sat in price.
Disclaimer: PineScripter is a coding tool for Pine Script development. It does not provide financial advice and does not guarantee trading profits. Always backtest strategies thoroughly and understand the risks before live trading.