OPEN-SOURCE SCRIPT
Smart Money Volume Absorption Signals I EonMetrics

Smart Money Volume Absorption Signals
Volume Absorption marks a specific situation as a LONG or SHORT setup, with an entry, a stop and two targets. But instead of only printing an arrow and leaving you to reconstruct what happened, it tracks that setup through four stages and shows you exactly how far along it is — how many conditions are met, which one is still missing, how many bars are left before the setup is discarded, and what the same sequence has already done on the history your chart has loaded.

🔶THE SITUATION IT TRACKS
A bar trades far more volume than its own recent normal, and then closes at the wrong end of its own range. Heavy participation that failed to pay the side that pushed: effort without result. The direction is set against the side that was absorbed — a heavy bar closing in the bottom third of its range is a short premise, one closing in the top third is a long premise.
One thing has to be said plainly, because it decides how much weight this premise deserves: total volume cannot tell you who traded. It cannot separate buyers from sellers. What this gate actually measures is heavy participation combined with a failure to hold the direction the bar travelled. The absorption reading is an interpretation of that pattern, not a measurement of order flow. If you want that distinction to matter less, the remaining three gates are where the work is done.
Absorption on its own happens constantly and most of it leads nowhere. So the tool requires three further confirmations, in order, before it marks anything.
🔶THE FOUR GATES
G1 · ABSORPTION — bar volume lands in an extreme percentile of its own recent history while the bar closes in the far third of its own range. This gate fixes the direction and nothing later can change it. It also plants the invalidation anchor at that bar's extreme. Optionally the direction must agree with a slow trend filter.
G2 · REACTION — a following bar closes in the direction G1 set. The absorption produced something instead of merely stalling.
G3 · EXPANSION — a candle body in the top percentile of its own recent history, pointing the setup's way. That candle's OPEN becomes the origin level, and the origin level is where entry would be.
G4 · HOLD — price returns to the origin level and closes without violating it. Only now does the signal print, on bar close.
This is a retest model, not a breakout model, and the consequence is worth stating before you use it. A setup whose expansion runs away and never comes back to the origin level will never complete, no matter how far the move goes. You will see setups sit at 3/4 while price travels past the drawn targets, and then expire. That is the design working as intended — the entry is the retest — but if you want a tool that chases the move instead, this is not that tool.
The dashboard reads: which stage the setup is in, the direction, which gate is being waited on, the expiry countdown, the entry and stop levels, and the record of every completed setup on the loaded history.
🔶ORIGINALITY
Five design decisions separate this from a stack of conditions with an AND between them.
Percentiles instead of ATR multiples. A fixed "1.5 × ATR" or "2 × average volume" threshold means something different in a trending market than in a compressed one, so it has to be re-tuned per symbol and per period. Every threshold here is a percentile rank against the instrument's own recent history — "top 30% of the last 200 bars" keeps its meaning when volatility changes, without tuning.
Gates do not add up to a score. Each gate is a separate class of evidence and none substitutes for another. Three expansion bars in a row are still 1/4, not 3/4. A weighted-sum model can be outvoted by one loud condition repeating itself; this one cannot. There is deliberately no confidence percentage anywhere in this script — with four binary gates in a fixed sequence, the only honest information is how many of them have filled, and dressing that up as a percentage would add precision that does not exist.
The setup dies on its own. Every tracked setup carries an invalidation anchor (a close beyond the absorption bar's extreme) and a bar countdown that resets at each gate advance. When either fires, the setup is discarded immediately — it does not linger until an opposite signal replaces it, and it does not quietly stay on the books.
One setup at a time. While a completed setup is still resolving toward its target or its stop, a new setup will not complete — it waits at 3/4 and may still fire later if the first one resolves in time, or expire if it does not. This exists so that what the dashboard counts is what a person following the tool could actually have taken, one position at a time, rather than an overlapping stack of positions nobody could hold.
It shows its own record. The last two rows of the dashboard walk every completed setup on the chart you are looking at, bar by bar, and count which level price reached first — Target 1 or the stop. The stop is checked before the target, so a bar that spans both counts against the setup, and the bar the signal prints on is not counted at all. That number is whatever it is. It is not a claim, it is not tuned to flatter, and it will read differently on every symbol and timeframe you load — which is exactly the point. You are meant to check it on YOUR instrument before deciding what the tool is worth to you, instead of taking anyone's word for it. Most signal tools do not show this. That is a choice they made, and this is a different one.
🔶HOW IT IS CALCULATED
Both percentile ranks are ta.percentrank() over one configurable window — one on bar volume (G1), one on the absolute candle body (G3). The close position is (close − low) / (high − low), so it describes where the bar finished inside its own range rather than relative to any external level.
The optional trend filter is a plain exponential moving average of the closing price on the chart's own timeframe, used as a slow-trend proxy: long setups are only allowed above it, short setups only below it. Set its length to 0 to switch it off. There are no higher-timeframe data requests anywhere in this script.
Entry is the open of the expansion bar. The stop is the absorption bar's extreme, plus an optional buffer in ticks. Both targets are multiples of that entry-to-stop distance, so they scale with the setup instead of with a fixed price amount. Target 1 is the level the record row measures against; Target 2 is drawn for reference only.
Every gate is evaluated and latched on confirmed bars only. There is no lookahead and there are no forward-looking references. A filled gate is never un-filled retroactively; the live bar can only be rejected, never rewritten. A bar that would satisfy two gates at once advances the setup by exactly one step — each gate has to be paid for with its own bar.
The chart geometry is redrawn from scratch on the last bar rather than accumulated, so what you see on the chart is always the setup the dashboard is describing, and closed setups do not leave debris behind.
🔶ALERTS
Six conditions: setup reached 2/4, setup reached 3/4, signal LONG, signal SHORT, setup expired, setup invalidated.
The staged alerts follow from the same idea as the meter: being told a setup is one gate away is more useful than only being told after it is over.
🔶HOW TO USE
1. Read the record row before anything else. Load your instrument and your timeframe and see what it says there. If it does not convince you, that is the tool telling you honestly that it is not for that market.
2. Check the sample size in the same row. A run of ten or twenty setups is an anecdote. The row flags small samples for exactly this reason.
3. Watch the meter, not the arrows. Most of the information is in setups that reach 2/4 or 3/4 and then die — that tells you what the market is refusing to do.
4. The stop sits at the absorption bar's extreme by default, which is tight. On fast intraday charts try the Stop Buffer input and watch how the record row responds.
5. The trend filter changes the population of setups substantially. Check the record row with it on and with it off on your own market before deciding which you prefer.
6. Set the 3/4 alert if you want to be at the chart before a setup completes rather than after.
🔶SETTINGS
Volume (percentile window) · Gate Thresholds (G1 volume percentile, G1 close position, G3 body percentile, trend filter length, setup TTL) · Trade Levels (draw toggle, stop buffer in ticks, two R-multiple targets) · Display (dashboard and position, current-signal marker, all-past-signals marker, colors).
🔶HONEST LIMITATIONS
Volume alone cannot be attributed to buyers or sellers. This tool reads total bar volume against the bar's close position. It does not know who traded, and it is not order-flow data. Treat the absorption premise as a reading of effort against result, which is what it is.
The volume itself is only as good as the feed. On spot forex and CFDs the exchange reports TICK volume rather than real traded volume, so the percentile ranks describe activity rather than quantity. On symbols with no volume data at all the gates cannot fill, and the dashboard says so in its top-right corner.
The retest requirement will cost you moves. As described above, setups that never return to the origin level expire unfilled even when price travels well beyond the drawn targets. This is structural, not a bug, and on strongly trending stretches it happens often.
Percentiles are relative to their window. After an abrupt change of volatility regime the ranks need a few dozen bars to catch up, and during that stretch the thresholds are still measuring the old regime.
The record row is an honest count, not a backtest. It assumes a fill at the exact entry price and it ignores fees, spread and slippage — all of which work against you in reality, and all of which matter a great deal when the outcome is close to even. A record that looks positive before costs can be negative after them. It also covers only the setups on the history your chart has loaded, which on intraday timeframes is a small sample.
Results vary far more between markets than between settings. The same script on the same timeframe can produce a very different record on two different symbols, and there is no timeframe this tool is generally "best" on. Any suggestion otherwise would be an invention. Check your own market.
This tool describes a sequence of conditions in price and volume. It does not forecast anything, it makes no claim about how often the sequence resolves favourably, and the drawn levels are the geometry of the setup, not a recommendation. It is published for analysis and education, it is not financial advice, and past behaviour of a pattern does not guarantee its future behaviour. Check the record on your own market, manage your own risk, and decide for yourself.
Part of the EonMetrics toolset.
Volume Absorption marks a specific situation as a LONG or SHORT setup, with an entry, a stop and two targets. But instead of only printing an arrow and leaving you to reconstruct what happened, it tracks that setup through four stages and shows you exactly how far along it is — how many conditions are met, which one is still missing, how many bars are left before the setup is discarded, and what the same sequence has already done on the history your chart has loaded.
🔶THE SITUATION IT TRACKS
A bar trades far more volume than its own recent normal, and then closes at the wrong end of its own range. Heavy participation that failed to pay the side that pushed: effort without result. The direction is set against the side that was absorbed — a heavy bar closing in the bottom third of its range is a short premise, one closing in the top third is a long premise.
One thing has to be said plainly, because it decides how much weight this premise deserves: total volume cannot tell you who traded. It cannot separate buyers from sellers. What this gate actually measures is heavy participation combined with a failure to hold the direction the bar travelled. The absorption reading is an interpretation of that pattern, not a measurement of order flow. If you want that distinction to matter less, the remaining three gates are where the work is done.
Absorption on its own happens constantly and most of it leads nowhere. So the tool requires three further confirmations, in order, before it marks anything.
🔶THE FOUR GATES
G1 · ABSORPTION — bar volume lands in an extreme percentile of its own recent history while the bar closes in the far third of its own range. This gate fixes the direction and nothing later can change it. It also plants the invalidation anchor at that bar's extreme. Optionally the direction must agree with a slow trend filter.
G2 · REACTION — a following bar closes in the direction G1 set. The absorption produced something instead of merely stalling.
G3 · EXPANSION — a candle body in the top percentile of its own recent history, pointing the setup's way. That candle's OPEN becomes the origin level, and the origin level is where entry would be.
G4 · HOLD — price returns to the origin level and closes without violating it. Only now does the signal print, on bar close.
This is a retest model, not a breakout model, and the consequence is worth stating before you use it. A setup whose expansion runs away and never comes back to the origin level will never complete, no matter how far the move goes. You will see setups sit at 3/4 while price travels past the drawn targets, and then expire. That is the design working as intended — the entry is the retest — but if you want a tool that chases the move instead, this is not that tool.
The dashboard reads: which stage the setup is in, the direction, which gate is being waited on, the expiry countdown, the entry and stop levels, and the record of every completed setup on the loaded history.
🔶ORIGINALITY
Five design decisions separate this from a stack of conditions with an AND between them.
Percentiles instead of ATR multiples. A fixed "1.5 × ATR" or "2 × average volume" threshold means something different in a trending market than in a compressed one, so it has to be re-tuned per symbol and per period. Every threshold here is a percentile rank against the instrument's own recent history — "top 30% of the last 200 bars" keeps its meaning when volatility changes, without tuning.
Gates do not add up to a score. Each gate is a separate class of evidence and none substitutes for another. Three expansion bars in a row are still 1/4, not 3/4. A weighted-sum model can be outvoted by one loud condition repeating itself; this one cannot. There is deliberately no confidence percentage anywhere in this script — with four binary gates in a fixed sequence, the only honest information is how many of them have filled, and dressing that up as a percentage would add precision that does not exist.
The setup dies on its own. Every tracked setup carries an invalidation anchor (a close beyond the absorption bar's extreme) and a bar countdown that resets at each gate advance. When either fires, the setup is discarded immediately — it does not linger until an opposite signal replaces it, and it does not quietly stay on the books.
One setup at a time. While a completed setup is still resolving toward its target or its stop, a new setup will not complete — it waits at 3/4 and may still fire later if the first one resolves in time, or expire if it does not. This exists so that what the dashboard counts is what a person following the tool could actually have taken, one position at a time, rather than an overlapping stack of positions nobody could hold.
It shows its own record. The last two rows of the dashboard walk every completed setup on the chart you are looking at, bar by bar, and count which level price reached first — Target 1 or the stop. The stop is checked before the target, so a bar that spans both counts against the setup, and the bar the signal prints on is not counted at all. That number is whatever it is. It is not a claim, it is not tuned to flatter, and it will read differently on every symbol and timeframe you load — which is exactly the point. You are meant to check it on YOUR instrument before deciding what the tool is worth to you, instead of taking anyone's word for it. Most signal tools do not show this. That is a choice they made, and this is a different one.
🔶HOW IT IS CALCULATED
Both percentile ranks are ta.percentrank() over one configurable window — one on bar volume (G1), one on the absolute candle body (G3). The close position is (close − low) / (high − low), so it describes where the bar finished inside its own range rather than relative to any external level.
The optional trend filter is a plain exponential moving average of the closing price on the chart's own timeframe, used as a slow-trend proxy: long setups are only allowed above it, short setups only below it. Set its length to 0 to switch it off. There are no higher-timeframe data requests anywhere in this script.
Entry is the open of the expansion bar. The stop is the absorption bar's extreme, plus an optional buffer in ticks. Both targets are multiples of that entry-to-stop distance, so they scale with the setup instead of with a fixed price amount. Target 1 is the level the record row measures against; Target 2 is drawn for reference only.
Every gate is evaluated and latched on confirmed bars only. There is no lookahead and there are no forward-looking references. A filled gate is never un-filled retroactively; the live bar can only be rejected, never rewritten. A bar that would satisfy two gates at once advances the setup by exactly one step — each gate has to be paid for with its own bar.
The chart geometry is redrawn from scratch on the last bar rather than accumulated, so what you see on the chart is always the setup the dashboard is describing, and closed setups do not leave debris behind.
🔶ALERTS
Six conditions: setup reached 2/4, setup reached 3/4, signal LONG, signal SHORT, setup expired, setup invalidated.
The staged alerts follow from the same idea as the meter: being told a setup is one gate away is more useful than only being told after it is over.
🔶HOW TO USE
1. Read the record row before anything else. Load your instrument and your timeframe and see what it says there. If it does not convince you, that is the tool telling you honestly that it is not for that market.
2. Check the sample size in the same row. A run of ten or twenty setups is an anecdote. The row flags small samples for exactly this reason.
3. Watch the meter, not the arrows. Most of the information is in setups that reach 2/4 or 3/4 and then die — that tells you what the market is refusing to do.
4. The stop sits at the absorption bar's extreme by default, which is tight. On fast intraday charts try the Stop Buffer input and watch how the record row responds.
5. The trend filter changes the population of setups substantially. Check the record row with it on and with it off on your own market before deciding which you prefer.
6. Set the 3/4 alert if you want to be at the chart before a setup completes rather than after.
🔶SETTINGS
Volume (percentile window) · Gate Thresholds (G1 volume percentile, G1 close position, G3 body percentile, trend filter length, setup TTL) · Trade Levels (draw toggle, stop buffer in ticks, two R-multiple targets) · Display (dashboard and position, current-signal marker, all-past-signals marker, colors).
🔶HONEST LIMITATIONS
Volume alone cannot be attributed to buyers or sellers. This tool reads total bar volume against the bar's close position. It does not know who traded, and it is not order-flow data. Treat the absorption premise as a reading of effort against result, which is what it is.
The volume itself is only as good as the feed. On spot forex and CFDs the exchange reports TICK volume rather than real traded volume, so the percentile ranks describe activity rather than quantity. On symbols with no volume data at all the gates cannot fill, and the dashboard says so in its top-right corner.
The retest requirement will cost you moves. As described above, setups that never return to the origin level expire unfilled even when price travels well beyond the drawn targets. This is structural, not a bug, and on strongly trending stretches it happens often.
Percentiles are relative to their window. After an abrupt change of volatility regime the ranks need a few dozen bars to catch up, and during that stretch the thresholds are still measuring the old regime.
The record row is an honest count, not a backtest. It assumes a fill at the exact entry price and it ignores fees, spread and slippage — all of which work against you in reality, and all of which matter a great deal when the outcome is close to even. A record that looks positive before costs can be negative after them. It also covers only the setups on the history your chart has loaded, which on intraday timeframes is a small sample.
Results vary far more between markets than between settings. The same script on the same timeframe can produce a very different record on two different symbols, and there is no timeframe this tool is generally "best" on. Any suggestion otherwise would be an invention. Check your own market.
This tool describes a sequence of conditions in price and volume. It does not forecast anything, it makes no claim about how often the sequence resolves favourably, and the drawn levels are the geometry of the setup, not a recommendation. It is published for analysis and education, it is not financial advice, and past behaviour of a pattern does not guarantee its future behaviour. Check the record on your own market, manage your own risk, and decide for yourself.
Part of the EonMetrics toolset.
オープンソーススクリプト
TradingViewの精神に則り、このスクリプトの作者はコードをオープンソースとして公開してくれました。トレーダーが内容を確認・検証できるようにという配慮です。作者に拍手を送りましょう!無料で利用できますが、コードの再公開はハウスルールに従う必要があります。
免責事項
これらの情報および投稿は、TradingViewが提供または承認する金融、投資、取引、またはその他の種類の助言もしくは推奨であることを意図したものではなく、またこれらに該当するものでもありません。詳細は利用規約をご覧ください。
オープンソーススクリプト
TradingViewの精神に則り、このスクリプトの作者はコードをオープンソースとして公開してくれました。トレーダーが内容を確認・検証できるようにという配慮です。作者に拍手を送りましょう!無料で利用できますが、コードの再公開はハウスルールに従う必要があります。
免責事項
これらの情報および投稿は、TradingViewが提供または承認する金融、投資、取引、またはその他の種類の助言もしくは推奨であることを意図したものではなく、またこれらに該当するものでもありません。詳細は利用規約をご覧ください。