One of Blave's core alpha indicators — what it measures, why it matters, and three ways to build strategies with it.
Every trade on a crypto exchange has a maker (the resting limit order) and a taker (the market order that fills against it). Taker Intensity (TI) measures the standardized net difference between market buy orders and market sell orders over a rolling window.
| TI Value | What it means |
|---|---|
| Positive (+) | Net market buy pressure — traders are aggressively buying |
| Zero (≈ 0) | Balanced — neither side is dominant |
| Negative (−) | Net market sell pressure — traders are aggressively selling |
The value is standardized relative to recent history, so it reflects how unusual the current imbalance is compared to the past period — not an absolute level of volume. The same buying volume can produce a TI of +0.5 in a highly active market and +2.5 in a quiet one. Blave provides TI at six timeframes: 15m, 1h, 4h, 8h, 24h, 3d. Longer timeframes are smoother and more suited for position strategies; shorter timeframes are noisier but react faster.
This is where most people get the indicator wrong. Market buy orders come from two sources:
Enter long when TI exceeds an entry threshold; exit when TI falls below an exit threshold. The dead zone between the two thresholds prevents the strategy from flip-flopping when TI hovers near a single level.
ENTRY_TH = 1.693
EXIT_TH = -0.453
def compute_signals(df, entry_th=None, exit_th=None):
eth = entry_th if entry_th is not None else ENTRY_TH
xth = exit_th if exit_th is not None else EXIT_TH
ti = df['TI']
signal = pd.Series(np.nan, index=df.index)
signal[ti > eth] = 1.0 # enter long
signal[ti < xth] = 0.0 # go flat
return signal
This is exactly the logic in the btc_ti_5min example — TI on a 24h window, checked every 5 minutes. The ENTRY_TH = 1.693 and EXIT_TH = -0.453 values were found by parameter scanning, not guessed.
Treat the zero line as the signal threshold. Long when TI crosses above zero, flat when it crosses below. This is intuitive but tends to generate many short-lived trades on 15m or 1h timeframes, running up fees. Works better on 8h or 24h windows where crossovers are more meaningful.
signal[ti > 0] = 1.0 signal[ti < 0] = 0.0
Use TI as a gate for another primary signal. Only take entries when TI is positive (net buying pressure exists). This prevents trend strategies from entering into heavy selling environments.
primary = compute_primary_signals(df) # e.g. SMA cross ti_positive = (df['TI'] > 0) signal = primary.copy() signal[~ti_positive] = 0.0 # suppress entries when TI is negative
Regime filtering typically reduces trade count and fees while improving Sharpe, at the cost of missing some trades. It works best with TI on longer timeframes (8h, 24h) as a macro filter on shorter-interval strategies.
| TI Window | Best for | Notes |
|---|---|---|
15m | Very short-term scalping | Very noisy, high fee exposure |
1h | Intraday strategies | Balanced |
4h | Swing strategies | Fewer signals, higher quality |
8h | Regime filter on short strategies | Good macro signal |
24h | Daily position management | Smoothest, least noise |
3d | Multi-day trend confirmation | Very smooth, good for regime detection |
In btc_ti_5min, the strategy runs every 5 minutes but uses 24h TI. This is intentional: you want the speed of a 5-minute check (react quickly to TI crossing a threshold) without the noise of a 5-minute TI window.
TI in isolation is useful. TI combined with Blave's other alpha indicators is powerful:
| Combination | Purpose |
|---|---|
| TI + Holder Concentration (HC) | Distinguish genuine buying from short squeezes. Both positive = institutional-backed bull move. |
| TI + Whale Hunter (WH) | WH detects large OI/volume changes; TI confirms direction. Both strong = high-conviction entry. |
| TI + Market Direction (MD) | Use MD as a macro filter, TI as the entry trigger. Reduces against-trend trades. |
stat field (up_prob, exp_value, return_ratio) provides historical context for each indicator reading. Always check is_data_sufficient before trusting the stats.