Air Pocket Profile — HVN Shelves Plus Explicit Thin-Volume Zones
Most volume profiles paint where trade concentrated and leave the thin bands as blank chart. Air Pocket Profile, a public open-source Pine indicator by FeelsStrategy, tries to promote that blank space into a first-class object: continuous low-volume “air pockets,” beside high-volume shelves and a single peak-volume anchor. This page locks the mechanism as the public script page describes it. It is not a Quant for Free clean-room backtest, and it is not an opening-range, session-VWAP, squeeze, or cumulative-delta system.
summary.json not yet — no clean-room run. No site Sharpe, Deflated Sharpe, hit rate, or trade count is attached, because none was produced.
1 / What the object actually is
The public description (script page Air Pocket Profile [FEELS]) specifies a range-weighted profile, not a close-only bin:
- Each historical bar inside the lookback spreads its volume across every price row it spans, from low to high.
- That spread is weighted by an impulse factor based on candle body size, written on the page as 0.7 + 0.6 × body ratio.
- A close-based profile, by contrast, would dump the whole bar into one row. This one does not.
Row display is a contrast rescale, not a second signal. With the heaviest row as the peak and the average row volume as the mean, each row is rescaled by min(rowVolume / mean / 2, 1) ^ contrast. Rows above average stay vivid; rows below fade. That is a drawing rule.
The page then names four structural reads on that histogram:
| Object | What the page says it is |
|---|---|
| HVN shelves | Local maxima of the profile, ranked by volume. Places “where price tends to slow.” |
| Volume anchor | The single heaviest row, drawn as a glow line. Called the strongest reference in the window. |
| Air pockets | Continuous runs of rows below an air-pocket threshold, and tall enough to pass a minimum pocket size. “Price tends to travel through them with little resistance.” |
| Fresh vs old | Volume inside a fresh window is coloured separately from older volume. |
Two derived reads sit on top: profile balance (share of volume above vs below the anchor) and anchor shift (anchor now versus its position N bars ago, direction only or direction with a percent). Optional marks — acceptance/rejection, and bars that travelled through a pocket — can be toggled. The page says behaviour marks use confirmed bars “to avoid intrabar repainting.” On symbols without volume, the profile “falls back to a range-based weight.”
Parameters named on the page, without numeric defaults in the text we could read: lookback, vertical resolution (row count), air-pocket threshold, minimum pocket size, profile contrast, fresh window, node count (how many HVNs to draw), anchor-shift window and display mode, and the two signal toggles.
The script page says the author tested it across BTC, ETH, and other liquid assets on 1H, 4H, 1D, and 1W. That is a coverage note, not a result table.
2 / What it does not claim — and where it fails
The page’s own closer is the right boundary: “This is an analysis tool, not a signal service.” Nothing on the page is a completed-trade study. There is no published hit rate for “transit through a pocket,” no hold-time comparison of pocket vs shelf, no costed path, no out-of-sample window.
Failure modes that follow from the mechanism, not from a backtest we did not run:
- Tendency language is not a measurement. “Tends to slow” at an HVN and “tends to travel quickly” through a pocket are the usual volume-profile story. Until transit time, adverse excursion, or rejection rate is defined on confirmed bars and compared with a dumb baseline (any equally tall band, a randomly placed zone, the same zone shifted by one ATR), the drawing can be true as geometry and empty as edge.
- The impulse weight is a modeling choice. Body-ratio weighting (0.7 + 0.6 × body ratio) pushes range bars with large bodies harder across the rows they span. A doji still paints a band; a marubozu paints it louder. That can mark “impulse” or it can smear one news bar across a tall pocket and then call the smear structure. A clean-room has to show the profile with the weight on and off.
- Contrast hides the thing you came to see. The fade
min(rowVolume / mean / 2, 1) ^ contrastis display, but pocket detection uses a threshold on row volume. If contrast and threshold are tuned on the same chart until the pockets “look right,” the object is a fitted annotation. - Local maxima are not unique shelves. HVNs are local peaks ranked by volume, capped by node count. Chop will mint many local peaks. Node count then becomes a storytelling knob.
- Anchor migration is path-dependent on the window. Shifting lookback by a few bars can move the heaviest row without any “migration of value.” The shift readout compares the anchor to itself N bars ago inside a rolling window; it is not a causal forecast.
- No-volume fallback changes the object. A range-based weight on a feed with no volume is a price-range histogram. Calling it the same profile as BTC spot volume is a category error.
- Marks are not orders. Acceptance, rejection, and pocket-transit marks are labels on confirmed bars. Turning them into entries would be a new strategy, and this page does not do that.
- Repaint claim is narrow. Confirmed-bar marks avoid intrabar repaint of those marks. The profile itself still recomputes as the lookback rolls. A level that was an air pocket last week need not be one today. That is normal for a rolling profile; it is also how a screenshot flatters a later move.
We did not extract the Pine source from the fetched page (the HTML carried the description and an empty pineVersion, not //@version text). Numeric input defaults, exact local-maximum definition, and the precise row-threshold comparison are therefore unverified against code. If the source disagrees with the description, the source wins and this draft should be corrected before any publish.
3 / How a reader could tear it down next
Not a signal. A next attempt, still untested here:
- Lock the profile in a clean room. Reimplement range-weighted binning with the published impulse
0.7 + 0.6 × body ratio, the contrast rescale, HVN = local maxima ranked by volume, anchor = argmax row, air pocket = contiguous rows under the threshold with a minimum height. Put the formula in the notebook. Do not paste Pine into a live chart and call it validation. - Separate drawing from behaviour. Define one pre-registered measurement: time (or range traveled per bar) while price is inside a pocket versus inside an HVN shelf of similar height, on the next confirmed bars only. Baseline: zones of the same height placed at random inside the same lookback, and the same rules with impulse weight disabled.
- Freeze parameters before looking. Lookback, row count, threshold, min pocket size, contrast, fresh window, node count, shift window. One instrument, one timeframe, one chronological split. If you touch the threshold after seeing the pockets, that pass is in-sample search, not a test.
- Volume identity. Run the identical lock on a feed with real volume and on the no-volume fallback. If the “pocket” only appears in one of them, say so.
- Do not borrow ORB / VWAP / Squeeze / CVD. Those are different objects already on this site. A pocket is unused thin-zone geometry. If the only way the marks “work” is by coinciding with an opening range or a VWAP cross, the profile was not the cause.
- Only then a gauntlet. If someone later turns confirmed-bar marks into a position rule, that is a new hypothesis: costs, a walk-forward or hold-out that respects the sufficiency–coverage–causality budget (α + β ≤ 1 + Λ when the scheme is not causal — see Li 2026, this slate’s Learn draft), and a deflated Sharpe if a grid was searched. That
summary.jsondoes not exist yet.
4 / Where it sits
Session VWAP Bias and Stocks-in-Play RelVol ORB ask about session imbalance and abnormal open volume. Squeeze Momentum asks about a compression oscillator. Air Pocket Profile asks whether the holes in a range-weighted profile are worth drawing as zones, and whether price actually transits them faster than a shelf. Until step 2 above is measured, the honest status is: the drawing is specified; the behavioural claim is not.
5 / Verdict
Clear unused object: HVN shelves, one anchor, explicit thin-volume runs, fresh-volume colour, anchor migration. Not an ORB, not a VWAP, not a squeeze, not CVD. Also not a validated edge. The page does not pretend to be one. The open possibility is small and empirical — transit time through a frozen pocket versus a frozen shelf, with the impulse weight ablated — not a chart mark promoted into an order. Rules of the drawing are partly locked from the public description; the Pine text itself was not in the fetch, so a clean-room still has to read the source before anyone trusts a threshold.
Source
- FeelsStrategy, Air Pocket Profile [FEELS], TradingView open-source script page: https://www.tradingview.com/script/x8zNFspu-Air-Pocket-Profile-FEELS/
- Page header date as fetched: “May 25” with no year on the converted page. Author name on the page: FeelsStrategy.
- Fetched 2026-10-03 (WebFetch of the script page, plus a direct HTML pull). Pine source text was not in the HTML (
//@versionabsent;pineVersionempty). Mechanism below is from the public description, not from a line-by-line source review.
Numbers
Only figures read on the source page:
- Impulse factor formula: 0.7 + 0.6 × body ratio.
- Contrast rescale: min(rowVolume / mean / 2, 1) ^ contrast.
- Timeframes named as tested by the author: 1H, 4H, 1D, 1W, on BTC, ETH, and “other liquid assets.” No performance statistics accompany that sentence.
No hit rate, Sharpe, sample size, or pocket-transit statistic was stated. No performance numbers taken from the source beyond the two formulas and the timeframe list above. No Quant for Free metrics. summary.json not yet — no clean-room run.
summary.json. Figures in the text are the source’s, labeled as such. See the full disclaimer.