Open the live demo to read a live crypto tape with screamer, in your browser.
Live trades are noisy. The demo connects to a public exchange feed (Coinbase or Binance, no API key) and displays the raw prints alongside derived price, volume, and indicator panes:
RollingPoly1(window, 0) is the endpoint of a rolling linear
fit. It tracks price with less lag than a moving average.RollingSum(price * size) / RollingSum(size)
shows where the volume traded, not just where the last print landed.The view control switches between a trade-count clock, timestamped 10-second OHLC bars, and a volume clock. On a volume clock each bar is a fixed slice of traded volume, so a burst of micro-trades collapses into a couple of bars instead of stretching across the chart. Time bars use the exchange timestamp when available and the browser receive time otherwise.
All indicators are fed the same one-sample-at-a-time stream. The indicator cards are grouped by their registry family: order flow & volume, momentum, trend, volatility, and Ehlers cycle reads.
On first load each market also warm-starts by fetching its recent public trade tape over REST and replaying it through the same pipeline before the live socket, so the chart and every indicator are populated immediately instead of accreting over a minute. Overlapping trades are de-duplicated by trade id at the boundary.
The time control formats the x-axis in local time or UTC. The chart uses the exchange timestamp when the feed provides one, and the browser receive time otherwise. A bounded browser buffer keeps recent raw trades, so changing the bar clock replays the history instead of starting empty. The buffer is maintained separately for each market, so switching away and back restores that market's recent view without mixing feeds. The browser also retains that market's active operator state, so the indicator cards return with their values instead of warming up from an empty series.
Each operator is fed one trade at a time as it arrives:
import { ready, RollingPoly1, RollingSum, EwMean } from "@screamer-labs/screamer";
await ready();
const lowLag = RollingPoly1(30, 0); // low-lag price
const sumPV = RollingSum(50), sumV = RollingSum(50); // volume-weighted fair value
const flowNet = EwMean(undefined, 50), flowAbs = EwMean(undefined, 50); // order-flow pressure
// sign: +1 when a buyer lifted the offer, -1 when a seller hit the bid
function onTrade(price, size, sign) {
const denoised = lowLag(price);
const fair = sumPV(price * size) / sumV(size);
const pressure = flowNet(sign * size) / flowAbs(size); // in [-1, 1], positive = buyers leaning
// ...draw denoised and fair over the trades, pressure as a green/red strip
}
The same operators run just as well on a stored array as on this live feed, so a study done on history carries over to production unchanged. See Getting started for the input regimes and Node, bundlers, and the browser for how to load screamer in each environment.
The demo is a single self-contained HTML file at
js/examples/live-trades.html.
It loads screamer from a CDN, so it needs internet access for both the module and the trade feed.
If the chart stays empty, the selected market may be restricted in your region; switch markets in
the demo.
For a local copy, serve the examples directory rather than opening the file with file://:
cd js/examples
py -m http.server 8000
Then open http://localhost:8000/live-trades.html.