01What this tool measures
Every second, Binance sends a ticker update for each pair. The server stores those prices in an in-memory buffer and converts them to 1-second log returns (percentage moves). For every leader → follower pair it then computes two things on the selected rolling window:
Pearson correlation of the return series, from −1 to +1. It answers: when the leader moves, does this follower move the same way, at the same time?
Returns are shifted from −maxLag to +maxLag ticks and the shift with
the strongest |r| wins. Negative = follower lags, positive = follower leads.
1m = 60 ticks, 5m = 300, 15m = 900,
1h = 3600. Shorter windows react faster but are noisier.
Sync, lag or lead?
Sync means the strongest relationship is at zero shift — the pair moves together tick for tick. Lags 2.1s means the follower typically reacts about two seconds after the leader. Leads means the follower is early.
The 0.50 noise guard
Scanning ±20 shifts makes even random series produce a peak near 0.3, so a peak below |r| = 0.50 is shown as “No clear lead/lag” with a zero lag instead of a fake timing edge. The raw peak is still available in the tooltip and the CSV export.
02Quick start (60 seconds)
Nothing needs to be typed to get your first matrix: BTC is the leader and the 20 most liquid USDT pairs are pre-loaded as followers.
Open the dashboard
Visit the tool root. On a first visit it starts streaming automatically with the starter set.
Prune the followers
Click the × on any chip to remove it, use Clear all to start fresh, or search any Binance USDT pair to add it back.
Let the buffer warm up
The status pill turns green after roughly 20 ticks (~20 seconds). Cells show waiting until enough returns exist.
Read the strongest rows first
Set the strength filter to Strong only or switch to Heatmap view to see the loudest relationships instantly.
Validate on a second timeframe
If r and the lag survive on 1m and 15m as well, the relationship is more than one noisy window.
Save or share your setup
Export a CSV snapshot, save a preset for later, or copy a deep link such as the one below.
Deep links auto-start
When a link contains both leaders and followers, the dashboard applies
them, saves them and starts streaming immediately — handy for sharing one specific view.
03Dashboard anatomy
Two cards do all the work. The left one chooses what to compare; the right one shows the answer.
| Element | What it does |
|---|---|
| Leaders chips | The coin(s) you expect to move first. Up to 6; the default is BTCUSDT. |
| Followers chips | Up to 24 coins tested against every leader. 20 are pre-loaded; remove with × or Clear all. |
| Timeframe | Rolling window length: 1m / 5m / 15m / 1h of ticks. Changing it refetches immediately. |
| Strength filter | Hides rows below |r| 0.3 (Medium+) or 0.5 (Strong only). Purely visual — data stays intact. |
| Max lag | How many seconds around zero the lag scan searches: ±10, ±20 (default) or ±40. |
| Alerts | Toast + desktop notification once per pair when |r| crosses your threshold, then re-arms. |
| Status pill | Idle → Connecting → Warming up → Live. Amber/red means the API is struggling. |
| Matrix / heatmap | One row per follower, one column per leader. Green = positive, red = negative, neutral = no signal. |
| Meta line | Pairs ready, window, samples and the timestamp of the last successful poll. |
Everything is in memory
The server keeps roughly 4,000 ticks per symbol. A restart or a Render cold start starts the counters from zero, so the matrix needs its warm-up again.
04How to read a cell
Each cell packs strength and timing. The big number is r; the line under it is the lead/lag verdict.
Hover any cell for the tooltip: peak r, raw lag in ticks, direction and sample count. The same fields appear in the CSV export.
Strength scale
| |r| range | What it usually means |
|---|---|
| 0.85 – 1.00 | Very strong. Near-identical moves; mostly the same trade in two tickers. |
| 0.60 – 0.85 | Strong. Reliable co-movement inside this window — the useful zone for relative-strength work. |
| 0.40 – 0.60 | Moderate. Real but loose; verify the lag and the sample count before acting. |
| 0.20 – 0.40 | Weak. Mostly background noise; only interesting when it persists for hours. |
| −0.20 – 0.20 | No usable relationship on this window. The tool says waiting when a series is flat. |
| −1.00 – −0.60 | Strong inverse. Moves against the leader — rare on spot pairs, more common around funding/stablecoin quirks. |
Timing is the fragile half
Strength repeats; exact latency does not. Treat any lag under 3 seconds as “same tick” in practice — exchange latency, the 3-second poll interval and the 1-second tick cadence are all bigger than the differences you are reading.
05A repeatable analysis workflow
One reading is a data point. The value comes from repeating the same five steps and noticing what changes. This is the routine the tool is designed around.
Choose one driver
Start with BTC (or ETH during an ETH-led session). Keep leaders to one or two: every extra leader multiplies the rows you have to interpret.
Scan for strength, not for beauty
Switch to Strong only and heatmap view. Write down the top three rows and their sample counts. Ignore everything under 0.4 in the first pass.
Stress-test the lag
Flip between 1m, 5m and 15m. A real lead/lag survives
with roughly the same sign; a lag sitting exactly at ±maxLag is usually an artefact.
Confirm persistence
Leave the tab running for 10–15 minutes (samples above ~150). Watch whether the cell keeps its colour instead of flickering between green and neutral.
Record and compare
Export a CSV or save a preset, then repeat at a different time of day. Changes between snapshots are the actual signal; any single snapshot is just context.
What a real read looks like
BTC → ETH at 0.79 · sync and BTC → BNB at 0.80 · sync means those two are effectively the same beta trade right now. BTC → SOL at 0.15 · no clear lag means SOL had its own driver in that window. Conclusion: rotate inside the first group, do not treat SOL as a BTC proxy today.
Beware duplicate rows
In a risk-off hour, almost every alt shows 0.7+ against BTC. That is one piece of information repeated 20 times, not 20 opportunities. Ask “what is different about this row?” before adding it to a watchlist.
06What to use it for
These are analytics jobs the matrix does well. None of them is a buy or sell signal on its own.
Find the follower that is decoupling from a strong leader — often the one with its own bid.
A 0.85 pair behaves like one position twice. Use it to see how much overlap a hedge really removes.
If six of your eight coins sit above 0.7 against BTC, your “diversified” book is one trade.
Watch a fresh pair for a day: does it track BTC immediately, or trade on its own flow?
Measure how many seconds a thin pair trails the leader before assuming you can front-run it.
Set a high threshold and let the toast tell you when a normally tight pair breaks its link.
Use it as a filter, not an oracle
The strongest practical use is elimination: skip setups that are just hidden copies of the same trade, and spend attention on the rows that behave differently.
07Feature cheat sheet
| Control | What happens | Tip |
|---|---|---|
| Start live / Stop live | Subscribes the server to the selected streams and polls every 3 s. | Stopping releases the streams so the free instance can idle. |
| Clear all | Empties the follower list after a confirmation and pauses streaming. | Faster than removing 20 chips one by one. |
| Heatmap view | Same numbers as colour blocks — fastest way to spot outliers. | Hover for the exact r and lag. |
| Export CSV | Snapshot of every pair: r, peak r, lag ticks/seconds, direction, samples. | Keep snapshots to compare regimes across the day. |
| Save preset | Stores leaders, followers, timeframe, filter, lag, alerts and view in this browser. | One preset per strategy: “Majors”, “L2s”, “New listings”. |
| Alerts | Fires once per pair when |r| crosses the threshold, re-arms when it drops. | Needs notification permission; falls back to in-app toasts. |
| Deep link | URL query pre-fills both lists and auto-starts streaming. | ?leaders=BTCUSDT&followers=ETHUSDT,SOLUSDT |
| Theme toggle | Dark/light, remembered in localStorage across all pages. |
Light theme is easier on projectors. |
08Rules that keep you honest
These are the points most likely to save you from a bad decision made on a green screen.
Correlation is not causation — and not direction
r = 0.8 does not mean the leader causes the follower; both may react to the same order flow. And r has no trend in it: two coins can be tightly correlated while both fall.
Sample size first, then strength
A 0.9 built on 25 samples is mostly luck. Prefer readings with 150+ samples and plenty of non-zero returns; the sample count is shown in the tooltip and in the meta line.
Re-check across timeframes
A relationship that only exists on 1m may be microstructure noise. Strong
correlation on 5m and 15m is a much better base.
Treat 0.50 as a floor, not a target
The lag guard only filters obvious noise. A 0.52 “lag” is still fragile — do not build a strategy on the weakest cell that happens to pass the filter.
Read percentage moves, not price levels
A $100k coin and a $0.00001 coin can both move 1% in a second. The tool compares returns for exactly this reason, so never translate r into “similar price”.
Expect the data to disappear
Buffers are in memory. Server restarts, deploys, Render free-tier sleeps and idle stops all reset the window — the matrix will say warming up again.
This is an analytics tool, not advice
Nothing here is a recommendation, a forecast or a promise. Trading crypto can lose money faster than it makes it — read the disclaimer before acting on anything you see.
09Troubleshooting & FAQ
Cells say “waiting” and nothing else
The buffer has not collected enough returns yet, or the selected pair is barely trading.
Wait ~20 seconds after starting; if it stays empty on 1h, switch to 1m
or pick a more liquid follower.
The status pill is amber / red
Warming up is normal. Connection issue or Reconnecting… means the
local API poll failed — check that npm start is still running and open
/health in a new tab.
A coin disappeared by itself
Binance rejected the pair (delisted, wrong suffix or not a spot USDT market), so the server reported it as invalid and the UI removed the chip. Add it again from the search results to use the exact symbol.
The lag is exactly ±10, ±20 or ±40
The scan hit its search boundary. That usually means there is no real peak inside the range — raise max lag, or accept no clear lag and work with r only.
Alerts are not popping up
Browser notifications need permission and HTTPS (or localhost). If permission is blocked the tool still shows in-app toasts. Also check that |r| actually crossed your threshold after you enabled alerts.
I cleared my followers — is that permanent?
Only for this browser profile: the saved selection is empty, so the pre-loaded starter set is not refilled again. Search any pair to rebuild the list, or save a preset first.
Does this work if Binance is blocked in my region?
Not without a proxy or a different host. The server needs outbound access to Binance's public WebSocket and REST endpoints; without it the matrix stays empty and health shows reconnect attempts.
10Glossary
| Term | Meaning in this tool |
|---|---|
| Tick | One price update stored with its timestamp. Binance's mini-ticker pushes about once per second. |
| Log return | ln(pricenow / price1s ago) — the percentage move the maths runs on. |
| Rolling window | The last N returns used for a calculation: 60 / 300 / 900 / 3600. |
| Pearson r | Linear co-movement between two return series, −1 … +1. |
| Peak r | The strongest |r| found across all lag shifts, before the 0.50 noise guard. |
| Lag / lead | Follower reacting after (lag) or before (lead) the leader, measured in seconds. |
| Sync | Strongest relationship at zero shift — no usable timing difference. |
| Samples | Number of paired returns in the window; a proxy for how much evidence backs the number. |
| Warm-up | The first ~20 seconds after starting, while the buffer fills. |
| Preset / deep link | A saved setup in this browser, or a URL that carries leaders and followers. |