Metrics
The full computed metric set for any pair and timeframe: seven volatility estimators, surge detection, volume analytics, pace-adjusted order flow, BTC correlation, funding and the trend engine. 30+ values per pair, recomputed every 30 seconds.
/v1/metrics/{symbol}/v1/metrics?symbols=…This is the deepest endpoint in the API: the complete output of the metrics engine for one pair, organized into seven families. Everything the screener can rank by, every number on the chart page's info panels, comes from here. The engine sweeps the entire market every 30 seconds; windowed families are computed per timeframe, so the same request with a different interval answers a different question (is this pair unusual this minute vs this week).
Request
| Parameter | In | Description |
|---|---|---|
interval | query | Timeframe for the windowed families: 1m 5m 15m 1h 4h 1d 1w. Default 5m. Funding and trend are interval-independent. |
symbols | query (bulk form) | Comma-separated list, up to 50 pairs. Unknown symbols are silently dropped from the response. |
exchange | query | Venue to read. See Exchanges. Default: Binance. Trade-tape families (trades, taker delta) are empty on venues that don't publish them. |
curl "https://osiristrader.com/api/v1/metrics/SOLUSDT?interval=5m" \ -H "Authorization: Bearer osk_YOUR_KEY" curl "https://osiristrader.com/api/v1/metrics?symbols=BTCUSDT,ETHUSDT,SOLUSDT&interval=5m" \ -H "Authorization: Bearer osk_YOUR_KEY"
Response
{
"symbol": "SOLUSDT",
"interval": "5m",
"data": {
"volatility": { "NATR": 0.214, "RR": 0.0011, "PK": 0.0013, "GK": 0.0012, "RS": 0.0012, "YZ": 0.0014, "SURGE": 1.21 },
"volsurge": { "SCORE": 0.71, "VOL_RATIO": 1.10, "TR_RATIO": 1.42, "RET_ZSCORE": 0.80 },
"volume": { "USDT_VOLUME": 5391077, "AVG_VOLUME": 449256, "VOL_STDDEV": 112340, "VOL_GROWTH": 1.08, "VWAP": 183.42, "OBV": 120443 },
"trades": { "TC_GROWTH": 1.05, "QV_GROWTH": 1.12, "TC_ZSCORE": 0.4, "QV_ZSCORE": 0.7, "FLOW": -0.04, "BUY_RATIO": 0.48, "SIZE_GROWTH": 1.30, "AVG_TRADE_SIZE": 842.1 },
"correlation": { "retCorr": 0.87, "realTimeVol": 1.7, "natrRatio": 1.9, "surgeRatio": 1.2 },
"funding": { "RATE": 0.0000410, "PREMIUM": -0.0001, "AVG_24H": 0.00005, "TREND": -0.00001, "APR": 4.49, "NEXT": 1783900800000 },
"trend": {
"local": "Uptrend", "global": "Sideways",
"scores": { "LOCAL_SCORE": 0.42, "GLOBAL_SCORE": 0.05, "ALIGNMENT": 0.05, "DIVERGENCE": 0.37, "CONSENSUS": 0.43, "MOMENTUM": 0.11 }
}
}
}volatility: seven estimators
Realized volatility has no single correct formula; each classic estimator uses different parts of the bar and has different strengths. We compute all of them over a rolling window of bars at your interval, so you can pick the one matching your use case (or use their disagreement as a signal in itself: range-based estimators running hot vs close-based ones flags intrabar chop without direction).
| Field | Estimator | Character |
|---|---|---|
NATR | Normalized ATR, % of price | The practical one: average true range as a percent, directly comparable across pairs. "NATR 0.2 on 5m" means a typical 5-minute bar spans 0.2%. Position sizing, stop distances, chart annotations. |
RR | Close-to-close (Rogers ret. stddev) | The textbook estimator: stddev of log returns. Ignores everything inside the bar: stable, slow. |
PK | Parkinson | Uses high-low range. Captures intrabar movement that close-to-close misses; assumes no drift. |
GK | Garman-Klass | Combines open/high/low/close; more statistically efficient than Parkinson on the same data. |
RS | Rogers-Satchell | OHLC-based and drift-independent; stays accurate in strong trends where PK/GK overstate. |
YZ | Yang-Zhang | The most complete: adds overnight/gap variance to Rogers-Satchell. In 24/7 crypto, "gaps" are bucket-boundary jumps; YZ catches volatility the others attribute nowhere. |
SURGE | Current TR vs ATR | How stretched the latest bar's range is vs the recent norm: a per-bar expansion flag rather than a window average. |
volsurge: normalized surge detection
The surge family answers one question: is this pair doing something unusual right now? Three raw ratios live on very different scales (volume pace hits 5-20× during a real surge, range expansion rarely tops 2-4×, return z-scores reach 3-6), so each is divided by its own "clear surge" level before SCORE takes their maximum. The result: SCORE ≥ 1.0 means at least one dimension is clearly surging, whichever one it is. The current bar is pace-adjusted (projected to a full bucket by elapsed time), so a surge is visible seconds into a bar, not only after it closes.
| Field | Meaning |
|---|---|
SCORE | Max of the three normalized ratios. ≥1 = clear surge; the screener's "Surge" sort ranks by this. |
VOL_RATIO | Pace-adjusted current volume vs window average. |
TR_RATIO | √t-adjusted current true range vs ATR: range expansion. |
RET_ZSCORE | √t-adjusted |current log return| vs window stddev: how abnormal the move itself is. |
volume
| Field | Meaning |
|---|---|
USDT_VOLUME | Quote volume over the window. |
AVG_VOLUME / VOL_STDDEV | Per-bar mean and stddev: the baseline that growth and z-scores are measured against. |
VOL_GROWTH | Current bar's pace vs the average bar (1.0 = normal). |
VWAP | Volume-weighted average price over the window, the institutional reference: price above VWAP means buyers in the window are, on average, in profit. |
OBV | On-balance volume over the window: cumulative signed volume. Divergence between OBV and price (price up, OBV flat) questions the move's backing. |
trades: pace-adjusted order flow
The subtlety here is pace adjustment. A 5-minute bar that is 10 seconds old contains ~3% of a normal bar's trades; naive "current vs average" comparisons on live bars mostly measure the clock. All rate metrics project the live bar to a full bucket by elapsed time before comparing, so the values are meaningful at any point inside the bar. (The first 5% of a bucket is too noisy to extrapolate and is clamped.)
| Field | Meaning |
|---|---|
TC_GROWTH / QV_GROWTH | Pace-adjusted trade count / quote volume vs window mean (×). |
TC_ZSCORE / QV_ZSCORE | The same, as z-scores: "how many standard deviations from normal", better for cross-pair screening than raw ratios. |
FLOW | Net taker flow of the current bar, −1…+1: (buys − sells) / total. The sign of aggression right now. |
BUY_RATIO | Taker-buy share of quote volume over the whole window, 0…1: the persistent version of FLOW. 0.48 = mild net selling. |
SIZE_GROWTH | Current average trade size vs the window's average, the "whales stepping in" detector: rising size with rising volume is institutional participation, rising count with falling size is retail noise. |
AVG_TRADE_SIZE | Window average USDT per trade: the pair's baseline participant size. |
correlation: everything vs BTC
Bitcoin is the market's gravity; these four fields measure how much a pair escapes it. All are computed against BTCUSDT over the same window at your interval.
| Field | Meaning |
|---|---|
retCorr | Pearson correlation of log returns, −1…+1. High = the pair is a BTC proxy; low = it trades its own story. |
realTimeVol | The pair's return volatility as a multiple of BTC's: a beta-like reading (2.0 = twice as volatile). |
natrRatio | NATR relative to BTC's NATR: the range-based version of the same idea. |
surgeRatio | The pair's surge reading vs BTC's: is it expanding on its own, or is the whole market expanding? |
retCorr < 0.3 and volsurge.SCORE > 1, which finds pairs surging on their own story while ignoring bitcoin.funding
The perpetual funding state, refreshed every 60 seconds. RATE is the current predicted rate (decimal; 0.0001 = the 0.01% baseline); PREMIUM is the live mark-vs-index basis, which is funding's leading indicator (premium moves first, the rate follows); AVG_24H averages the actually-paid fundings of the last 24h; TREND is the current rate minus the last paid one (funding momentum); APR annualizes at the pair's real payment interval; NEXT is the next payment timestamp. The full mechanics and the paid-payments history live on the Funding page.
trend: the trend engine
The trend engine scores every pair on every timeframe by blending EMA spread, MACD histogram and RSI bias, weighted by ADX strength and squeeze state, plus candle-pattern adjustments, squashed through tanh to a −1…+1 score. Lower timeframes aggregate into a local horizon (hours), upper ones into global (days-to-weeks). local/global are the human-readable labels ("Uptrend", "Sideways", "Downtrend"); scores exposes the raw numbers underneath:
| Field | Meaning |
|---|---|
LOCAL_SCORE / GLOBAL_SCORE | The two horizon scores, −1…+1. The labels are these numbers bucketed. |
ALIGNMENT | Strength both horizons share: positive when local and global agree in direction, negative on conflict. High alignment = trend-following conditions. |
DIVERGENCE | Local minus global. A positive spike is a short-term move against the macro trend: either the start of a reversal or a fade opportunity, your strategy decides. |
CONSENSUS | Net share of individual timeframes agreeing on a direction, −1…+1. High |consensus| = the whole stack points one way. |
MOMENTUM | Local score minus its own EMA: a turning-point detector that moves before the label changes. |
Practical notes
- Fields that cannot be computed yet (young listing, insufficient window) are absent, not zero. Code defensively:
data.volsurge?.SCORE. - Windowed hashes carry a
timestampfield (ms): the sweep that produced them. Use it to detect staleness instead of assuming freshness. - The bulk form is the cheap way to sweep a watchlist: 50 pairs per request. For ranking the whole market by one metric, Rankings is one request instead of eleven.
- Not every family covers every interval (e.g. surge skips 4h; volume/trades use curated windows per timeframe). An absent family at an exotic interval is expected, not a bug.