OPEN-SOURCE SCRIPT
更新済

Volatility Expansion Score (0-4) v2.2 [TotoMazter]

508
Volatility Expansion Score (0-4)

WHAT IT IS

This indicator detects one specific market state: a compressed market whose calm is starting to break. It scores every closed bar from 0 to 4, one point per condition:

Compressed regime — ATR% in the lower tercile of its own last 500 bars
Expansion starting — ATR% higher than on the previous bar
Narrow Bollinger Bands — band width in the lower tercile of its last 120 bars
Volume waking up — tick volume above its 100-bar mean (z-score > 0)

Score 3 (orange) is the signal threshold; score 4 (red) is a full trigger. Everything is self-normalized (rolling percentiles and z-scores, no absolute levels), so the indicator needs no recalibration across price regimes: in our research it behaved the same with gold at 1,800 and at 4,800.

WHAT IT DOES NOT DO — READ THIS FIRST

It does NOT predict direction. In the research program behind this script, the directional question was tested three separate ways on 14 years of XAUUSD minute data — 132 technical variables, a dedicated 40-feature study (intraday synthetic dollar index, gold/silver lead-lag, compression context, M1 microstructure, path features), and real aggressor order flow from COMEX gold futures — and all three came back null. A 4/4 score says "an impulse is more likely than usual", never which way. Any use of this tool as a bullish/bearish signal is outside what was validated.

It also does not promise big moves in dollar terms. The signal fires when ATR is compressed (about 0.83x its normal level), and the subsequent move measured in % of price is slightly SMALLER than average (about 0.97x). What increases is the move relative to current volatility. If you size stops and targets in ATR units (R multiples), the historical edge is real; if you think in dollars, there is none.

MEASURED RESULTS (all historical, XAUUSD 1h, 2013-2026, ~79,000 bars)

Out-of-sample validation on a pre-registered 2023-2026 holdout, opened once: bars with score >= 3 were followed by a 2-ATR impulse 1.95x more often than the base rate (95% CI 1.76-2.03). Score = 4: 2.73x (CI 2.09-2.94).
Honest base rates: with a ~5% base impulse rate, 2.7x lift means roughly 13-14% of full triggers are followed by an impulse. Most signals are NOT followed by a large move. Position sizing must assume this.
The follow-through advantage, measured in ATR units and controlled for time of day, is about x1.106, favorable in all 21 measurable hourly buckets and in 13 of 14 years. Without the time-of-day control the raw number is x1.139 — the control matters, and the built-in table applies it for you.
Where signals cluster on gold: the New York morning (13:00-15:00 UTC) and the London open (08:00-09:00 UTC). The most volatile hour of gold's day in this dataset is 14:00 UTC (about 1.8x the daily average hourly range).

STOCKS (NVDA, AMD, TSLA — high-volume, high-volatility test set)

The signal transfers, but with roughly half the strength: x1.04-1.08 in ATR units after the same time-of-day control (below 1 in dollar terms). Three structural rules came out of that validation and are enforced by the script's guards:

Do not use 5-minute charts: intraday volume is U-shaped and the signal degenerates into a closing-auction detector (a fake x1.68 "edge" came entirely from the last 30 minutes of the session).
Do not use 1-hour charts on RTH equities: the session's partial bar has a smaller range by construction and concentrates signals. The script excludes partial bars automatically (marked with a dot).
Use 15m or 30m, and keep the characterization horizon inside the session (H <= 12 on 15m, H <= 11 on 30m). Windows containing long closures (overnight gaps, weekends) are excluded by the gap guard.

Earnings are not the driver: excluding extreme-gap days does not change the result.

THE BUILT-IN CHARACTERIZATION TABLE

The table answers, for THE SYMBOL AND TIMEFRAME ON YOUR CHART, whether the signal has historically preceded larger moves, using three measures: raw MFE in ATR (inflated by the denominator and by time of day — reference only), MFE in % of price (immune to the denominator), and the intra-hour advantage (computed within each hour of day, then aggregated — the one that decides, highlighted in yellow). It also reports the ATR-at-signal ratio (~0.8 expected) and the maximum hourly concentration of signals (if it exceeds ~8 pp, part of what you see is the clock, not the market). If it says "short sample", the guards are refusing to output a number that cannot be measured cleanly on your chart — that is a feature.

WHY IT IS ORIGINAL

Rolling percentiles converted to the exact convention of pandas rolling rank, so the script reproduces the research module it was ported from (practical parity check: on XAUUSD 1h, score >= 3 should fire on roughly 17% of bars, score = 4 on roughly 3.7%).
Wilder ATR (RMA), population standard deviations, closed-bar evaluation with alerts on bar close, and an entry reference at the next bar's open — no repainting of the validated signal.
Session guards: partial-bar exclusion (any intraday bar shorter than its timeframe) and a data-measured gap guard (characterization windows may not contain a closure longer than 3x the timeframe), so equity overnight gaps and weekends do not contaminate the statistics while gold's 1-hour daily break does not block them.
A self-auditing characterization table with denominator-aware and time-of-day-controlled measures. It will happily tell you the signal does NOT work on your chart.

SETTINGS

Signal windows (14 / 500 / 120 / 100) and tercile cuts are the canonical values of the validated module; changing them invalidates every reference number above. "Confirm on bar close" keeps the indicator inside its validated definition. The alert message includes the score breakdown and states that the entry reference is the next bar's open. The characterization table can be displayed in English or Spanish via the "Table language" setting.

LIMITATIONS

All figures are historical measurements from the research program described above; past behavior does not guarantee future behavior. The stock characterization is in-sample (no reserved validation window). This is a statistical tool for regime awareness — when to pay attention — not a trading system: it provides no direction, no entries, and no risk management.
リリースノート
v2.3b — Critical table fix + diagnostics

Fixed a bug (present since v2.0) where the "all" columns of the characterization table re-initialized on every bar due to comma-separated var declarations: only the first variable in each line kept persistence. Symptom: impossible values like "n events: signal 2962, all 1". If you saw table numbers before this update, disregard them all except the intra-hour edge row, which is array-based and was never affected. Found on a live chart — thanks to the process of checking outputs against known reference values.

Also added: when the table has no measurable bars, it now tells you why — "feed has no volume data" (this signal requires tick volume; some symbols/feeds don't provide it), "warming up: N/505 bars", or "short sample".

No changes to the signal logic itself.
リリースノート
v2.4 — Configurable colors

Added a "Colors" group in the settings: score histogram colors (4 / 3 / 2 / 0-1), first-trigger marker, threshold line, and the four table colors (header background, body background, text, and the highlight of the intra-hour edge row). The original palette remains the default, so existing charts look unchanged unless you customize them. TradingView's color picker includes opacity, so transparencies are configurable too.

Publication chart refreshed to show only the indicator, per publication guidelines.

No changes to signal logic, alerts, or table calculations.

免責事項

これらの情報および投稿は、TradingViewが提供または承認する金融、投資、取引、またはその他の種類の助言もしくは推奨であることを意図したものではなく、またこれらに該当するものでもありません。詳細は利用規約をご覧ください。