Ultravol Matrix - volume spike heatmap [GF4M]Ultravol Matrix - cross-exchange volume spike heatmap
❗️Reason for displaying two indicators together on the main chart:
🔗 Use together for reading volume — Ultravol, Ultravol Matrix are originally built as one indicator, split in two due to Pine's 64-plot limit & multi-pane drawing limit. (same language by UV-scaled color): Ultravol Matrix reads vol spike history, Ultravol reads live.
❗️Per PulseWire's policy that each script's description must be self-contained on its own, the Ultravol engine description common to both Ultravol and Ultravol Matrix is repeated across both indicators' descriptions.
───────────────────────────────────────────────
🔶 PROBLEM
On a standard chart, volume is just numbers and bars, so to know how much weight is behind the current candle's move, you have to scan the whole chart yourself and judge relative size. Doing that instantly during live trading takes intuition built through long training. This problem is worse in crypto: since the same asset trades on dozens of exchanges at once, looking at a single exchange's volume alone doesn't show where the real volume spike actually is. I came to think there were two important points.
1. (Common) How much does this volume mean in the market as a whole?
Every asset has a normal, average scale at which it typically trades. If far more trading is happening than that, the asset is drawing attention right now. Conversely, even when candles look active and volume keeps increasing, if it stays below the whole-market average, it is actually a minor move. In other words, it should be readable instantly against the whole market — not against the immediately preceding period.
2. (Multi-exchange asset) Is this a market-wide event, or a local event on one exchange?
For an asset traded on dozens of exchanges at once, as in crypto, even a very large exchange's volume spike alone won't move the price much — because the remaining exchanges still hold volume that can't be ignored. The same spike means something completely different depending on whether it happens across many exchanges at once or only locally — and neither a single exchange's volume, nor a simple aggregate of them, shows this difference clearly (it ends up buried under the pattern of whichever pair has overwhelming volume, like Binance).
🔷 SOLUTION
1. (Common) The whole chart's accumulated average volume is extracted as a base line, and each bar's ratio to it is standardized into a common UV-scaled color. For crypto, one step further — the volumes of 12 major exchange pairs are each weighted by importance and composited into one Final Synthetic UV volume, used as the main volume. This way, every visual element on the chart can be drawn based on one common scale. This is Ultravol.
2. (Multi-exchange asset) The volume spike history of each of those same 12 sources, before Ultravol composites them into one, is decomposed along the time axis using the same UV-scaled color, so you can see at a glance whether the current spike spans the whole market or is local. This is Ultravol Matrix. (Originally one indicator, but split into two because the number of plots needed exceeded Pine's limit (64-plot) — the core engine is the same.)
Volume can now be perceived instantly. Candles carrying below-average volume stay dark and featureless; candles carrying above-average energy render brighter and more intense. The screen looks quiet when the market is quiet, and busy when it is busy. And this color grammar reads the same way on any asset, any timeframe — because the reference is always that market's own whole-history average. This indicator set can fully replace ordinary candles and volume charts.
🔷 Ultravol Core Engine: Processing Diagram
🟣 Full engine mechanics (Master GATE scheduling, coin-unit correction, per-exchange trust weighting, auto listing-join) are documented in the Appendix — see origin indicator .
───────────────────────────────────────────────
Ultravol Matrix - cross-exchange volume spike heatmap
✨ Gives you an insight into hidden, cross-exchange volume spike flow — by color, instantly!
Across many crypto exchanges, Ultravol Matrix curates 12 pairs (spot + perp) — Each exchange's volume, reverted to native base. → normalized to its own signature. → Rendered on the same UV-defined color scale. → Spike flow patterns (not absolute volume) can be compared directly across history in one matrix.
📘 Strong trends begin with cascading vol spikes across all exchanges.
📗 A perp vol spike with no spot participation (all or a single perp pair) is often just a futures liquidation cascade.
📙 Track vol spike trends by exchange. Who is trending? Alone? User base? Region? Spot or Perp? All together?
📕 Trending vol spike sequence — drop to lower TF (1m or seconds) to read the order in detail.
✨ Ultravol Matrix Engine:
Its own unique method. 12-pair per-exchange UV-scaled color leveling is crypto-exclusive.
🔹 How to read it
🔗 The time-axis extension of Ultravol — same language by UV-scaled color: Ultravol Matrix reads history, Ultravol reads live.
🔹 You can easily spot mass volume that's concentrated in a single exchange.
🔹 All together or single spike trending.
🔹 For altcoins, even on the 5m and 15m timeframes, persistent long spikes tend to occur on only a few individual exchanges. This behavior is less frequent in major cryptocurrencies like BTC or ETH. (It is recommended to familiarize yourself with the volume spike patterns of your specific trading pairs in advance.)
Setup Panel
☑ 📱 : Mobile friendly UI setup
• Source : Ultravol (Auto) fixed
• Rescale : Only for extremes, too 🔥 or too ⚫️
Especially for altcoins, the market heats up significantly during trending phases. Consequently, if the heatmap temperature rises to a point where chart variations become difficult to distinguish, lowering the rescale option by -1 or -2 makes it easier to discern the intensity differences on the screen. (In this case, the adjusted value is temporarily displayed in the bottom-right corner.)
🔸 Hover over the nametag for symbol info.
🔸 Maximize the pane (or drag it taller) for detailed matrix flow.
Matrix's volume spectrum is compressed using a separate log-based clamp to fit within a low-height panel. Read it only as relative magnitude — judge volume spikes by color, not by bar height.
⚠️ Required setting: In order to vertically align the Name tag (on matrix)
⚙︎ > Chart option > Canvas > Margins > Top: 0% Bottom: 0% Rights: 50bars
Indicator

Ultravol - correct market volume [GF4M]Ultravol - correct market volume
❗️Reason for displaying two indicators together on the main chart:
🔗 Use together for reading volume — Ultravol, Ultravol Matrix are originally built as one indicator, split in two due to Pine's 64-plot limit & multi-pane drawing limit. (same language by UV-scaled color): Ultravol Matrix reads vol spike history, Ultravol reads live.
❗️Per PulseWire's policy that each script's description must be self-contained on its own, the Ultravol engine description common to both Ultravol and Ultravol Matrix is repeated across both indicators' descriptions.
───────────────────────────────────────────────
🔶 PROBLEM
On a standard chart, volume is just numbers and bars, so to know how much weight is behind the current candle's move, you have to scan the whole chart yourself and judge relative size. Doing that instantly during live trading takes intuition built through long training. This problem is worse in crypto: since the same asset trades on dozens of exchanges at once, looking at a single exchange's volume alone doesn't show where the real volume spike actually is. I came to think there were two important points.
1. (Common) How much does this volume mean in the market as a whole?
Every asset has a normal, average scale at which it typically trades. If far more trading is happening than that, the asset is drawing attention right now. Conversely, even when candles look active and volume keeps increasing, if it stays below the whole-market average, it is actually a minor move. In other words, it should be readable instantly against the whole market — not against the immediately preceding period.
2. (Multi-exchange asset) Is this a market-wide event, or a local event on one exchange?
For an asset traded on dozens of exchanges at once, as in crypto, even a very large exchange's volume spike alone won't move the price much — because the remaining exchanges still hold volume that can't be ignored. The same spike means something completely different depending on whether it happens across many exchanges at once or only locally — and neither a single exchange's volume, nor a simple aggregate of them, shows this difference clearly (it ends up buried under the pattern of whichever pair has overwhelming volume, like Binance).
🔷 SOLUTION
1. (Common) The whole chart's accumulated average volume is extracted as a base line, and each bar's ratio to it is standardized into a common UV-scaled color. For crypto, one step further — the volumes of 12 major exchange pairs are each weighted by importance and composited into one Final Synthetic UV volume, used as the main volume. This way, every visual element on the chart can be drawn based on one common scale. This is Ultravol.
2. (Multi-exchange asset) The volume spike history of each of those same 12 sources, before Ultravol composites them into one, is decomposed along the time axis using the same UV-scaled color, so you can see at a glance whether the current spike spans the whole market or is local. This is Ultravol Matrix. (Originally one indicator, but split into two because the number of plots needed exceeded Pine's limit (64-plot) — the core engine is the same.)
Volume can now be perceived instantly. Candles carrying below-average volume stay dark and featureless; candles carrying above-average energy render brighter and more intense. The screen looks quiet when the market is quiet, and busy when it is busy. And this color grammar reads the same way on any asset, any timeframe — because the reference is always that market's own whole-history average. This indicator set can fully replace ordinary candles and volume charts.
🔷 Ultravol Engine: Processing Diagram
🟣 Check the Appendix — (16 live feeds/candle · coin-unit correction (1000x-listed coins) · USDT/USDC reference price conversion · Master GATE calc scheduling · per-exchange trust weighting · auto listing-join. Full mechanics + reusable code.)
───────────────────────────────────────────────
Ultravol - correct market volume
✨ Gives you a trained trader's sense for volume — by color, instantly!
📘 Reveal key market energy areas through volume-encoded candles, spectrum layer, v-ray, energy flux, and spike panel by color. A full legacy candle & volume chart replacement.
📗 Final synthetic UV — Across many crypto exchanges, Ultravol curates 12 (spot + perp) — reverted to native base → normalized & weighted by custom criteria, spot summed and perp summed separately (used as Energy Flux source), then combined into one — to read the unified volume flow across the whole market.
📙 Per-exchange UV level on the panel — Each exchange's volume, normalized to its own signature. → Rendered on the same UV-defined color scale. → Current candle's volume spike level (not raw volume) can be compared across exchanges at a glance.
✨ Ultravol engine:
Its own unique method. Synthetic UV (12-pair fusion) and Per-exchange UV-scaled color mark are crypto-exclusive — UV-scaled coloring works on any chart.
🔷 How to read it
It is recommended to check the color reference scheme in the settings panel to understand how candle colors are represented. Once you are familiar with these patterns, you can instantly gauge the intensity of current movements during live trading.
Refer to the historical patterns where rare, massive volume occurred (indicated by sky blue, blue, and purple - When similar volume occurs later, frequently become the Top or Bottom.)
Massive volume spike levels frequently act as strong S/R.
🔷 Basic Screen - check volume by color.
Spike Panel
This panel simultaneously displays the live candle volume in two ways: 1) as an absolute value in the base unit, and 2) as a UV-scaled mark. Users can quickly identify which exchange is experiencing a volume spike based solely on the colored emoji characters.
Status Label
The working mode automatically adjusts based on the selected symbol type and information, with the current status displayed via the label in the bottom-right corner.
Panel setup
☑ 📱 : Mobile friendly UI setup
• Source : Use Ultravol (Auto) normally
• Rescale : Only for extremes, too 🔥 or too ⚫️
☑ V-Ray : Vertical highlight marks on big spike.
☑ Energy Flux : 8 Spot(U), 4 Perp(L)
+ Trending energy balance (Spot vs Perp)
☑ Candles : Chart candle × UV fusion.
Each element—Volume, Volume-encoded Candlesticks (Up/Dn), and Ruler—features its own independent color scheme.
No volume chart color
☑ Spectrum : Synthetic UV from 12 vol src.
+ Instant energy read by UV-scaled color
+ Max height. Move to a pane first.
☑ Panel : Exchange's raw vol (number)
+ Current UV-scaled spike (color mark)
☑ s Smaller UI ☑ ↓ Center-right
☑ ! Wait Long · Act Fast (#1 principle)
🔸 Hover over the panel for detailed info.
Vol src info. & current status notice
Volume spike marking by unique UV-scaled color
Works together as one.
You can see historical spike flow and current spike details at the same time.
🔗 Ultravol Matrix reads vol spike history, Ultravol reads live.
⚠️ Ultravol must be placed at the very front.
(To ensure the correct z-layer order of all graphics, including hybrid override candles, is displayed exactly as intended. )
HELP: Check a tooltip on the setup panel & spike panel.
🟣 APPENDIX — A few notes on what happens inside UV engine.
💊 Master GATE (Calculation scheduling)
This indicator reads 16 external data sources in real time: the volumes of 12 exchange pairs, plus market cap, two stablecoin exchange rates, and the market average price. The computation that follows these calls is substantial. But volume is a simple cumulative value — I do not see immediate tick-by-tick recomputation as essential. So the work is divided into what happens when a candle opens (new), while it is in progress (realtime), and when it closes (confirmed) — and the heavy computation was judged reasonable to run only at fixed intervals during the candle. It is the internal scheduler that keeps the whole indicator responsive, and a precondition for this indicator to work at all.
// 🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦
// MASTER GATE - throttling setup
var bool uv_throttleGATE_required = uv_chart_symbol_crypto_basequotetickvol_flg
varip bool bar_NOTLIVE_flg = false
varip bool bar_GATEbypass_flg = false
bar_NOTLIVE_flg := uv_throttleGATE_required
and barstate.isrealtime and (timenow - (time_close + ((time_close - time)*2)) > 0)
bar_GATEbypass_flg := not (uv_throttleGATE_required and barstate.isrealtime and not bar_NOTLIVE_flg)
const int UV_MASTERGATE_RATE_T_VAL = 160 // ms
varip int uv_MasterGATE_last_t = na // Last GATE Open time = LINUX time ms
varip bool uv_MasterGATEopen_flg = false
uv_MasterGATEopen_flg := bar_GATEbypass_flg
or na(uv_MasterGATE_last_t)
or (timenow - uv_MasterGATE_last_t >= UV_MASTERGATE_RATE_T_VAL)
or barstate.isconfirmed
if not bar_GATEbypass_flg and uv_MasterGATEopen_flg
uv_MasterGATE_last_t := timenow
// MASTER GATE - throttling setup End
// 🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦🟧🟦
You can make this simple throttling GATE. After configuring the GATE operating conditions as shown above, you can apply them to the actual indicator calculation section by utilizing uv_MasterGATEopen_flg like below. It is simple yet effective. (Caution: Given how Pine Script executes, this GATE mechanism provides reasonable computational savings rather than perfect scheduling. For precise control, use it alongside barstate.isnew / isrealtime / isconfirmed)
if uv_MasterGATEopen_flg
s1_color_x := f_src_uv_lv_coloring(s1_uv_lv)
s2_color_x := f_src_uv_lv_coloring(s2_uv_lv)
s3_color_x := f_src_uv_lv_coloring(s3_uv_lv)
s4_color_x := f_src_uv_lv_coloring(s4_uv_lv)
s5_color_x := f_src_uv_lv_coloring(s5_uv_lv)
s6_color_x := f_src_uv_lv_coloring(s6_uv_lv)
s7_color_x := f_src_uv_lv_coloring(s7_uv_lv)
s8_color_x := f_src_uv_lv_coloring(s8_uv_lv)
p1_color_x := f_src_uv_lv_coloring(p1_uv_lv)
p2_color_x := f_src_uv_lv_coloring(p2_uv_lv)
p3_color_x := f_src_uv_lv_coloring(p3_uv_lv)
p4_color_x := f_src_uv_lv_coloring(p4_uv_lv)
🏁 Compositing the 12 exchange pairs
The volumes of 8 spot and 4 perpetual pairs are each converted into base-currency units, then merged into a single weighted volume. Ultravol shows the merged value; Ultravol Matrix shows the per-exchange values before merging, on the same color standard. The list stops at 12 because the volume figures of lower-ranked exchanges are often inflated, and would contaminate the result rather than improve it — the top 12 alone carry roughly 80% of real volume. This part is admittedly subjective; it was curated based on general exchange reputation in the market.
🏁 Unifying coin display units
Some coins — 1000PEPE, 1000SATS — are listed by different exchanges at 1000× or 10000× units (typically the case for extremely low-priced assets). Without reverting these to their original common unit, summing volumes across exchanges loses its meaning. There is no published reference for which exchange lists which coin at which multiple, so each case was verified one by one and built into an internal exception table, matched against the crypto name of the current chart. The symbol tickers used to call the 12 volumes are composed in two ways: (a) coins present in the low-volume table use the values defined there; (b) all other coins are composed per-symbol from 12 predefined symbol templates.
💊 This simple function extract crypto-name from any symbols with 1000x 1000000x
f_crypto_symbol_corekey(_tickerid, _basecurrency) =>
_tickerid_upper = str.upper(_tickerid)
_key = str.upper(_basecurrency)
if str.contains(_tickerid_upper, ":1000000BOB")
_key := '1000000BOB'
else
_prefix = str.match(_key, "^(?:1000000|10000|1000)")
_suffix = str.match(_key, "(?:1000000|10000|1000)$")
if _prefix != ''
_key := str.substring(_key, str.length(_prefix))
if _suffix != ''
_key := str.substring(_key, 0, str.length(_key) - str.length(_suffix))
_key
💊 This simple function extract the multiple number from symbol.
f_crypto_symbol_multiple(_fullname, _corekey) =>
_f = str.upper(_fullname)
_k = str.upper(_corekey)
_k_pos = (na(_k) or _k == '') ? na : str.pos(_f, _k)
_multiple = 1.0
if not na(_k_pos)
_colon_pos = str.pos(_f, ':')
_prefix_start = na(_colon_pos) ? 0 : _colon_pos + 1
_between = str.substring(_f, _prefix_start, _k_pos)
_after = str.substring(_f, _k_pos + str.length(_k))
_pre_num = str.match(_between, "^(?:1000000|10000|1000)$")
_suf_num = str.match(_after, "^(?:1000000|10000|1000)")
_raw = _pre_num != '' ? str.tonumber(_pre_num) : _suf_num != '' ? str.tonumber(_suf_num) : 1
_multiple := na(_raw) ? 1.0 : _raw
_multiple
💊 Coin name exceptions
The crypto names used by PulseWire's CRYPTO: and CRYPTOCAP: feeds quite often differ from the names exchanges actually use (this happens among smaller coins — SLC → SLCS, HYPE → HYPEH, and the like). Each time one was found, it was manually verified to be the same coin and added to an exception list. That exception table is pre-checked on the actual M.CAP and Avg. Price security calls.
This simple function maps standard exchange crypto names to PulseWire's native CRYPTO: , CRYPTOCAP: chart names.
f_crypto_cryptocap_tv_ticker(_uv_chart_crypto_tickerhead_str) =>
// CRYPTO: CRYPTOCAP:
//────────────────────────────────────────────---
// EXCHANGES => CRYPTOCAP // Cypto name
//────────────────────────────────────────────---
result_ticker = switch _uv_chart_crypto_tickerhead_str
'SLC' => 'SLCS' // Silencio
'BABY' => 'BABYL' // Babylon
'HYPER' => 'HYPERL' // Hyperlane
'HYPERL' => 'HYPERL' // 〃
'HYPE' => 'HYPEH' // Hyperliquid
'BOB' => 'BOBBUIL' // Build On Bitcoin
'BOBBOB' => 'BOBBUIL' // 〃
'TAG' => 'TAGG' // Tagger
'TAO' => 'TAOB' // TAO
'TOSHI' => 'TOSHI3' // Toshi
'NEIROCTO' => 'NEIROF' // First Neiro On Ethereum
'NEIRO' => 'NEIROF' // 〃
'NEX' => 'NEXUS5' // Nexus
'RATS' => 'RATS2' // Rats
'CHEEMS' => 'CHEEMSC' // Cheems
'SATS' => 'SATSO' // SATS (Ordinals)
'CAT' => 'CATSI' // Simon's Cat
'TRUMP' => 'TRUMPOF' // Trump official
'USDS' => 'USDS2' // USDS
'MOVE' => 'MOVEM' // Movement
'MOCA' => 'MOCAV' // Mocaverse
'ZORA' => 'ZORA2' // Zora
'BARD' => 'BARDL' // Lombard
'ATH' => 'ATHAE' // Aethir
'SONIC' => 'SONICSV' // Sonic SVM
'KNC' => 'KNC' // Kyber Network
'ZRO' => 'ZROL' // LayerZero
'AMP' => 'AMP2' // AMP
'CHIP' => 'CHIPUS' // USD.AI
'RAVE' => 'RAVED' // RaveDAO
'PROS' => 'PROSPH' // Pharos
=> _uv_chart_crypto_tickerhead_str
result_ticker
💊 G-Index px (Reference market price)
A mix of the current chart's price and the whole-market average price. It is a buffer that keeps the base line from being dragged around by a momentary price jump on a single exchange. G-Index Price operates only when the current chart uses USDT, USDC, or USD as its base unit. -> takes the avg. price provided by TV -> converts it to the current chart's unit by exchange rate.
//⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜
// G-Index PX
//
varip bool g_index_px_works = false
varip float g_index_px = na
var float chart_current_multiple = not uv_chart_symbol_crypto_basequotetickvol_flg ?
1.0 : f_crypto_symbol_multiple(uv_chart_tikerid_str, uv_chart_crypto_tickerhead_str)
var string chart_current_currency = syminfo.currency
float USD2USDT_avg_rate = request.security("CRYPTO:USDTUSD", timeframe.period, ta.sma(hlc3, 3))
float USD2USDC_avg_rate = request.security("CRYPTO:USDCUSD", timeframe.period, ta.sma(hlc3, 3))
bool USDT_is_DEPEG = math.abs(USD2USDT_avg_rate - 1.0) * 100 >= 0.1
bool USDC_is_DEPEG = math.abs(USD2USDC_avg_rate - 1.0) * 100 >= 0.2
var int chart_currency_convert_mode = switch chart_current_currency
'USD' => 1
'USDT' => 2
'USDC' => 3
=> 0
float g_avg_chart_ratio = switch chart_currency_convert_mode
1 => 1.0
2 => (1.0 / USD2USDT_avg_rate)
3 => (1.0 / USD2USDC_avg_rate)
0 => 0.0
var bool chart_currency_convert_no_need = (uv_chart_crypto_tickerhead_str == 'USDT')
or (uv_chart_crypto_tickerhead_str == 'USDC')
or (uv_chart_crypto_tickerhead_str == 'USDS')
or (uv_chart_crypto_tickerhead_str == 'PYUSD')
or (uv_chart_crypto_tickerhead_str == 'USDP')
var string g_index_px_crypto_ticker = 'CRYPTO:' + f_crypto_cryptocap_tv_ticker(uv_chart_crypto_tickerhead_str) + 'USD'
if chart_currency_convert_mode != 0
g_index_px := (request.security(g_index_px_crypto_ticker,timeframe.period, close * g_avg_chart_ratio,gaps=barmerge.gaps_on, ignore_invalid_symbol=true) * chart_current_multiple )
if not g_index_px_works and not na(g_index_px) and uv_volmode_ultravol_task_flg and not chart_currency_convert_no_need
g_index_px_works := true
if g_index_px_works and na(g_index_px) and na(g_index_px )
g_index_px_works := false
//G-Index - end
//⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜🟥⬜
🏁 Listing detection and exception reporting
An exchange that was absent early in the chart and began trading midway is automatically included in the calculation from that point on, and appears on the panel. The top-right panel shows the current bar's volume both as an absolute number (in base units) and as per-pair UV-scaled markings. When an exception occurs — some data not provided on a particular timeframe, for instance — you can hover over the panel to see exactly how the indicator is operating right now. Better to show what is happening than to behave strangely in silence.
🏁 You can check the uv engine (marking area like below) inside code.
// ⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜
// Ultravol Core Engine
// ⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜
Indicator

Gravity Reactor [by Oberlunar]Gravity Reactor is a structural trading engine built around one central idea: price does not move only in trend or only in reversion, but continuously oscillates around a dynamic gravity center. This center is computed from the fast/mid/slow moving-average stack, and the script measures the gravity gap as the ATR-normalized distance between price and that centroid. From there, the model evaluates whether the market is in compression, directed expansion, or overstretched displacement.
The rationale is to distinguish between two very different situations that are often confused by conventional indicators. A move away from gravity can be the start of a real expansion, or it can be an exhaustion event ready to mean-revert. For that reason, Gravity Reactor does not rely on simple MA crosses or isolated momentum spikes. It combines gravity distance, stack alignment, distance velocity, volume pressure, and multi-timeframe agreement into a single structural score. This score is then interpreted through two operative regimes: Thrust, when compression releases into a confirmed directional move, and Snapback, when price reaches an extreme displacement and shows signs of absorption or rebalancing.
Visually, the script puts gravity in the foreground through lane heatmaps that display local gravity and higher-timeframe gravity states side by side, so the trader can immediately see whether the chart is aligned, fragmented, or overstretched across scales. The goal is to detect where the price stands relative to its internal market geometry and whether that displacement is being reinforced or rejected.
Oberlunar ◉✦ Indicator

Cosmic Volume Analyzer [JOAT]
Cosmic Volume Analyzer - Astrophysics Edition
Overview
Cosmic Volume Analyzer is an open-source oscillator indicator that applies astrophysics-inspired concepts to volume analysis. It classifies volume into buy/sell categories, calculates volume flow, detects accumulation/distribution phases, identifies climax volume events, and uses gravitational and stellar mass analogies to visualize volume dynamics.
What This Indicator Does
The indicator calculates and displays:
Volume Classification - Categorizes each bar as CLIMAX_BUY, CLIMAX_SELL, HIGH_BUY, HIGH_SELL, NORMAL_BUY, or NORMAL_SELL
Volume Flow - Percentage showing buy vs sell pressure over a lookback period
Buy/Sell Volume - Separated volume based on candle direction
Accumulation/Distribution - Phase detection using Money Flow Multiplier
Volume Oscillator - Fast vs slow volume EMA comparison
Gravitational Pull - Volume-weighted price attraction metric
Stellar Mass Index - Volume ratio combined with price momentum
Black Hole Detection - Identifies extremely low volume periods (liquidity voids)
Supernova Events - Detects extreme volume with extreme price movement
Orbital Cycles - Sine-wave based cyclical visualization
How It Works
Volume classification uses volume ratio and candle direction:
classifyVolume(series float vol, series float close, series float open) =>
float avgVol = ta.sma(vol, 20)
float volRatio = avgVol > 0 ? vol / avgVol : 1.0
if volRatio > 1.5
if close > open
classification := "CLIMAX_BUY"
else
classification := "CLIMAX_SELL"
else if volRatio > 1.2
// HIGH_BUY or HIGH_SELL
else
// NORMAL_BUY or NORMAL_SELL
Volume flow separates buy and sell volume over a period:
calculateVolumeFlow(series float vol, series float close, simple int period) =>
float currentBuyVol = close > open ? vol : 0.0
float currentSellVol = close < open ? vol : 0.0
// Accumulate in buffers
float flow = (buyVolume - sellVolume) / totalVol * 100
Accumulation/Distribution uses the Money Flow Multiplier:
float mfm = ((close - low) - (high - close)) / (high - low)
float mfv = mfm * vol
float adLine = ta.cum(mfv)
if adLine > adEMA and ta.rising(adLine, 3)
phase := "ACCUMULATION"
else if adLine < adEMA and ta.falling(adLine, 3)
phase := "DISTRIBUTION"
Gravitational pull uses volume-weighted price distance:
gravitationalPull(series float vol, series float price, simple int period) =>
float massCenter = ta.vwma(price, period)
float distance = math.abs(price - massCenter)
float mass = vol / ta.sma(vol, period)
float gravity = distance > 0 ? mass / (distance * distance) : 0.0
Signal Generation
Signals are generated based on volume conditions:
Buy Climax: Volume exceeds 2 standard deviations above average on bullish candle
Sell Climax: Volume exceeds 2 standard deviations above average on bearish candle
Strong Buy Flow: Volume flow exceeds positive threshold (default 45%)
Strong Sell Flow: Volume flow exceeds negative threshold (default -45%)
Supernova: Volume 3x average AND price change 3x average
Black Hole: Volume 2 standard deviations below average
Dashboard Panel (Top-Right)
Volume Class - Current volume classification
Volume Flow - Buy/sell flow percentage
Buy Volume - Accumulated buy volume
Sell Volume - Accumulated sell volume
A/D Phase - ACCUMULATION/DISTRIBUTION/NEUTRAL
Volume Strength - Normalized volume strength
Gravity Pull - Current gravitational metric
Stellar Mass - Current stellar mass index
Cosmic Field - Combined cosmic field strength
Black Hole - Detection status and void strength
Signal - Current actionable status
Visual Elements
Volume Ratio Columns - Colored bars showing normalized volume
Volume Flow Line - Main oscillator showing flow direction
Flow EMA - Smoothed flow for trend reference
Volume Oscillator - Area plot showing fast/slow comparison
Gravity Field - Area plot showing gravitational pull
Orbital Cycle - Circle plots showing cyclical pattern
Stellar Mass Line - Line showing mass index
Climax Markers - Fire emoji for buy climax, snowflake for sell climax
Supernova Markers - Diamond shapes for extreme events
Black Hole Markers - X-cross for liquidity voids
A/D Phase Background - Subtle background color based on phase
Input Parameters
Volume Period (default: 20) - Period for volume calculations
Distribution Levels (default: 5) - Granularity of distribution analysis
Flow Threshold (default: 1.5) - Multiplier for flow significance
Accumulation Period (default: 14) - Period for A/D calculation
Gravitational Analysis (default: true) - Enable gravity metrics
Black Hole Detection (default: true) - Enable void detection
Stellar Mass Calculation (default: true) - Enable mass index
Orbital Cycles (default: true) - Enable cyclical visualization
Supernova Detection (default: true) - Enable extreme event detection
Suggested Use Cases
Identify accumulation phases for potential long entries
Watch for distribution phases as potential exit signals
Use climax volume as potential exhaustion indicators
Monitor volume flow for directional bias
Avoid trading during black hole (low liquidity) periods
Watch for supernova events as potential trend acceleration
Timeframe Recommendations
Best on 15m to Daily charts. Volume analysis requires sufficient trading activity for meaningful readings.
Limitations
Volume data quality varies by exchange and instrument
Buy/sell separation is based on candle direction, not actual order flow
Astrophysics concepts are analogies, not literal physics
A/D phase detection may lag during rapid transitions
Open-Source and Disclaimer
This script is published as open-source under the Mozilla Public License 2.0 for educational purposes. It does not constitute financial advice. Past performance does not guarantee future results. Always use proper risk management.
- Made with passion by officialjackofalltrades
Indicator

Rotational Gravity OscillatorMade using elements from two Cheatcountry scripts:
Includes a Bollinger Band for bounds that forms a trend follower based on the 0 point.
Includes CheatCountry color code signals, different color scheme. Bright colors are strong signals, ark are weak, green bull, red bear, the basics.
Switches for Bollinger Band color codes, which can actually be useful signals.
This oscillator can be used for divergences, trends, signal strength, confirmation, volatility readings, you name it.
It is a comparative oscillator, that compares adaptively smoothed, weighted modified Change of Gravity oscillators between 2 symbols and multiple lengths to determine directional momentum as one asset compares to another.
The default uses the Crypto TOTAL market cap to help trade cryptocurrencies. You will notice that BTC will give sell signals in uptrends at times. That is because it is being compared to an index of the total Crypto market cap, and since alt-coins move faster, BTC will lag behind this index.
Give CheatCountry a follow, hes one of the MVPs of Tradingview Pinescripters, constantly giving us access to novel new concepts as they are published by professionals. Indicator

Indicator

Indicator

Indicator

Indicator

Indicator

Indicator

Strategy

Indicator
