Bybit Band Cross-Down Scanner

EMA + StdDev upper band · multi-timeframe · all USDT-M perpetuals

Band Settings

Scan Scope

Idle0%

Results

Symbol TF Direction Episode Start (UTC) Signal (UTC) Extreme Price Price at Signal Gap % Band Value Confirmed Peak Search
Configure your settings above and click Run Scan.

How this works / assumptions

Upper band = EMA(close, emaPeriod) + k × StdDev(close, stdevPeriod); lower band = EMA(close, emaPeriod) − k × StdDev(close, stdevPeriod). StdDev is a rolling population stdev of closing price, optionally smoothed with its own EMA (StdDev smoothing) to stop a single outlier candle from making the band snap instantly — right after a big spike, raw rolling StdDev can balloon for several bars until that candle ages out of the window, which can trigger an early, noisy signal before price has genuinely reversed. Smoothing (e.g. 3-6 bars) dampens that without fully removing it; it's not a complete fix for every case, so check flagged events against a chart before trusting them blindly.
Every candle is tested against the band from the PREVIOUS closed candle, not its own. A candle's own EMA/StdDev isn't known until it finishes forming, so testing a candle against a band value that includes its own not-yet-final close is look-ahead bias — a live chart can only show the band from the last already-closed bar throughout the next bar's formation, so this matches that and matches what's actually plotted (e.g. a TradingView HTF study projected onto a lower timeframe, non-repainting).
Important: this band is a specific formula — it will not match whatever moving averages happen to be on your TradingView chart by default. To sanity-check a signal visually, plot the exact same formula rather than eyeballing unrelated lines (ask me for a Pine Script version if useful).
Scan mode picks the direction:
Upper band breakdown: price is above the upper band, then breaks back down through it. Episode Start = the candle that first broke above the upper band; Signal = the candle that closes back below it; Extreme Price = the highest high reached in between.
Lower band breakout: the mirror image — price is below the lower band, then breaks back up through it. Episode Start = the candle that first broke below the lower band; Signal = the candle that closes back above it; Extreme Price = the lowest low reached in between.
This runs in two phases, "detect the signal first, then look back":
Phase 1 – detect: for every symbol/timeframe, fetch just the candles inside your selected date range (plus a small EMA/StdDev warm-up) and flag every bar where the signal condition fires (close crosses back below the upper band, or back above the lower band, depending on Scan mode). Cheap, and only depends on the Signal itself falling inside your date range — it does not require the Episode Start or the extreme price to be in range too.
Phase 2 – backtrack: only for bars flagged in Phase 1, walk backward candle-by-candle from just before the signal, paging in older history automatically as needed (up to Max lookback bars), until it finds the candle where price first broke through the band on the other side — that's the Episode Start. The Extreme Price is the max high (upper mode) or min low (lower mode) across that whole episode, however far back it started, without ever fetching that much history for symbols that had no hit.
Gap % for upper breakdown = (Extreme Price − bandValueAtSignal) / Extreme Price × 100. For lower breakout it's mirrored: (bandValueAtSignal − Extreme Price) / Extreme Price × 100 — both measured to the band's value at the signal bar (the true intersection level), not the candle's close, since close has typically already overshot past the band by the time that bar settles. The candle close is still shown separately as "Price at Signal" for reference.
Confirmed = price stayed on the signal side of the band (below it for breakdowns, above it for breakouts) for at least the configured number of bars immediately after. Events near the very end of available data may show as unconfirmed simply because there isn't enough forward data yet.
Peak Search column: shows ok when the true Episode Start was found within Max lookback bars; shows truncated if the walk-back hit that bar limit (or ran out of exchange history) before finding it — in that case the Extreme Price is a bound, not the true extreme, so raise Max lookback bars if you need the exact figure.
Precision timeframe: the band's value only updates once per candle on your main timeframe (e.g. every 4h), but the actual breach can happen at any point inside that candle. When you set a Precision timeframe (e.g. 1h), the tool holds the main-tf band level fixed and checks the finer candles inside that 4h window to find the exact one whose close first crosses it — that's the timestamp/price shown in the Episode Start / Signal columns. The main-timeframe candle is still what's used for the band formula itself (EMA/StdDev periods, k) and for finding the Extreme Price; precision only sharpens *when* the cross itself actually happened. Leave it "Off" to just use the main-tf candle's own time, as before.
Data source: Bybit public v5 /market/kline & /market/instruments-info (category=linear, USDT-margined perpetuals only). You pick a single Scan date (UTC, midnight to midnight) — only the Signal has to land inside that day. The matching Episode Start and Extreme Price can sit any distance before it, since Phase 2 fetches history independently per candidate instead of requiring one giant warm-up window for every symbol up front.