@vike-io/cli 0.15.0 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/README.md +11 -7
- package/package.json +1 -1
- package/skills/vike/SKILL.md +45 -31
- package/skills/vike-alerts-setup/SKILL.md +7 -5
- package/skills/vike-alerts-webhook/SKILL.md +4 -3
- package/skills/vike-candles/SKILL.md +3 -2
- package/skills/vike-core/SKILL.md +3 -3
- package/skills/vike-daily-brief/SKILL.md +68 -0
- package/skills/vike-follow-the-money/SKILL.md +60 -0
- package/skills/vike-hl-asset-briefing/SKILL.md +48 -0
- package/skills/vike-hl-builder-intel/SKILL.md +39 -0
- package/skills/vike-hl-cohort-backtest/SKILL.md +61 -0
- package/skills/vike-hl-cohort-positioning/SKILL.md +69 -0
- package/skills/vike-hl-liquidation-radar/SKILL.md +55 -0
- package/skills/vike-hl-position-match/SKILL.md +3 -2
- package/skills/vike-hl-top-traders/SKILL.md +21 -8
- package/skills/vike-hl-trader-profile/SKILL.md +65 -0
- package/skills/vike-perp-crowding/SKILL.md +49 -0
- package/skills/vike-perp-funding/SKILL.md +4 -1
- package/skills/vike-perp-overview/SKILL.md +23 -3
- package/skills/vike-pm-l2-archive/SKILL.md +50 -0
- package/skills/vike-pm-market-diligence/SKILL.md +60 -0
- package/skills/vike-polymarket-market-detail/SKILL.md +20 -15
- package/skills/vike-polymarket-markets/SKILL.md +2 -1
- package/skills/vike-polymarket-smart-money/SKILL.md +9 -0
- package/skills/vike-polymarket-trader/SKILL.md +10 -1
- package/skills/vike-smart-money-discovery/SKILL.md +4 -3
- package/skills/vike-stream/SKILL.md +34 -10
- package/skills/vike-token-holder-diligence/SKILL.md +58 -0
- package/skills/vike-token-holders/SKILL.md +6 -4
- package/skills/vike-token-research/SKILL.md +6 -6
- package/skills/vike-token-screener/SKILL.md +3 -3
- package/skills/vike-token-search/SKILL.md +2 -1
- package/skills/vike-token-smart-money-trend/SKILL.md +57 -0
- package/skills/vike-token-transfers/SKILL.md +8 -6
- package/skills/vike-wallet-balances/SKILL.md +9 -7
- package/skills/vike-wallet-batch/SKILL.md +3 -3
- package/skills/vike-wallet-compare/SKILL.md +2 -2
- package/skills/vike-wallet-counterparties/SKILL.md +2 -2
- package/skills/vike-wallet-discover/SKILL.md +3 -1
- package/skills/vike-wallet-ens/SKILL.md +2 -2
- package/skills/vike-wallet-label-provenance/SKILL.md +5 -4
- package/skills/vike-wallet-pnl-history/SKILL.md +2 -2
- package/skills/vike-wallet-portfolio/SKILL.md +10 -8
- package/skills/vike-wallet-summary/SKILL.md +6 -6
- package/skills/vike-wallet-trace/SKILL.md +4 -3
- package/skills/vike-wallet-transactions/SKILL.md +2 -2
- package/skills/vike-wallet-who-is/SKILL.md +50 -0
- package/skills/vike-wallets-related/SKILL.md +52 -0
- package/skills.sh.json +26 -11
- package/src/commands/stream.js +1 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vike-hl-builder-intel
|
|
3
|
+
description: Hyperliquid builder codes - which front-ends and bots earn the most fees, how concentrated their users are, their symbols and fee series, and which builders one wallet routes through. Use when the user asks "which Hyperliquid builder codes earn the most" / "who runs builder X and how big is it" / "builder fee revenue" / "how much of Hyperliquid volume is routed through builders".
|
|
4
|
+
allowed-tools: Bash(vike-data:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# vike-hl-builder-intel
|
|
8
|
+
|
|
9
|
+
A builder code lets a front-end or bot attach its address to an order and keep a slice of the fee. About 5 calls, 1 credit each.
|
|
10
|
+
|
|
11
|
+
## Chain
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
vike-data hl builders --view leaderboard --window 30d --sort fee --limit 10 --json # who earns
|
|
15
|
+
vike-data hl builders --view stats --window 30d --json # venue totals, routed share of volume
|
|
16
|
+
B=0x5af1b5f44207784dcb850bbb4143c5dcd1885f71
|
|
17
|
+
vike-data hl builders --view profile --builder $B --window 30d --json # by symbol, by dex, user deciles, lifetime
|
|
18
|
+
vike-data hl builders --view users --builder $B --window 30d --limit 10 --json
|
|
19
|
+
vike-data hl builders --view series --builder $B --bucket 1d --limit 30 --json
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`search <name>` finds a builder by name (its `builders` section). Other views: `fills` (the raw routed fills, `--symbol`, `--side`). One wallet's builders: `vike-data hl wallet-activity <wallet> --view builders --window 30d`. `--window` is `1d|7d|30d|all`; page with `nextCursor` -> `--cursor`. `profile`, `users`, `fills` and `series` require `--builder`; a flag a view does not take is refused, not ignored.
|
|
23
|
+
|
|
24
|
+
## Reading
|
|
25
|
+
|
|
26
|
+
- `leaderboard` rows: `rank`, `builder`, `fee_usd`, `volume_usd`, `fills`, `users`, `revenue_per_user`, `fee_rate_bps`, `taker_pct`, `market_share_pct`, `active_days`. `--sort fee` ranks the builder's own cut, not what traders paid; the order differs from `--sort volume`.
|
|
27
|
+
- **Three fee columns are not interchangeable**: `fee_usd` is the builder's revenue, `trader_fee_usd` what traders paid in total, `builder_routed_deployer_fee_usd` the deployer's cut on builder-routed flow only. On `fills`, `fee` is in its own `fee_token`.
|
|
28
|
+
- `stats.totals.builder_routed_share_pct` is the share of all fill notional carrying a builder code.
|
|
29
|
+
- `profile` adds `by_symbol`, `by_dex`, `user_volume_distribution` (users split into volume deciles: separates "19k users" from "one whale plus a tail") and `lifetime`. In `users`, `closed_pnl_usd` (and `--sort pnl`) is the TRADERS' realized PnL, not the builder's.
|
|
30
|
+
- `series` `users` is a distinct count per bucket and not additive across days; take a period total from `profile`. Builder history starts at different dates: compare `active_days` and the resolved `window` first.
|
|
31
|
+
|
|
32
|
+
## Anti-patterns
|
|
33
|
+
|
|
34
|
+
- Don't call a builder profitable or its users winners from `closed_pnl_usd`.
|
|
35
|
+
- Don't add daily `users` together, or compare two windows of unequal `active_days`.
|
|
36
|
+
|
|
37
|
+
## Pairs well with
|
|
38
|
+
|
|
39
|
+
- `vike-hl-top-traders`, `vike-hl-trader-profile` (one wallet's routing)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vike-hl-cohort-backtest
|
|
3
|
+
description: Method for testing whether a Hyperliquid wallet cohort's positioning led or lagged price, with point-in-time labels and without look-ahead - which axes are honest, how to pull and align the hours, the seams and controls, how to report. Describes a method on this data; it does not claim a tradable edge. Use when the user asks "did whale / smart money positioning predict BTC" / "backtest the cohort signal" / "does the smart-minus-rekt spread lead price" / "lead or lag of Hyperliquid cohorts".
|
|
4
|
+
allowed-tools: Bash(vike-data:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# vike-hl-cohort-backtest
|
|
8
|
+
|
|
9
|
+
Cohort positioning against price over history. A single `--hours` call returns `hours x rungs` rows (2160 hours of the 13-rung `pnl` axis is about 28,000 rows, 13 MB), so **write each pull to a file and analyse it with code; never print it into the conversation.** 1 credit per call.
|
|
10
|
+
|
|
11
|
+
## Pull
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
vike-data hl cohort-metrics BTC --axis pnl --label-basis point_in_time --hours 2160 --json > btc_pnl_pit.json
|
|
15
|
+
vike-data hl cohort-metrics BTC --axis size --hours 2160 --json > btc_size.json
|
|
16
|
+
vike-data candles hl BTC --view export --interval 1h --start 2026-08-01T00:00:00Z --json > btc_1h.json # up to 5000 bars a call
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Rows: `ts` (hour, UTC), `cohort`, `total_position_value`, `total_position_value_long` (USD notional), `bias` (fraction -1..+1). Newest hour first; page older hours with `nextCursor` -> `--cursor`. Candles: `ts` is epoch ms, left-aligned, the window half-open `[start, end)`.
|
|
20
|
+
|
|
21
|
+
Whole-venue alternative (all symbols summed): `vike-data hl segments --view history --cohort "3x smart" --axis pnl --hours 2160 --json` (axis `size` or `pnl`; hours before 2026-04-07 are never returned; page back with `--end` = the oldest `ts` minus 1 second). Position-level history: `hl market --view positions --symbol BTC --start ...` rows carry `label_causal`, the previous hour's label.
|
|
22
|
+
|
|
23
|
+
## Which labels are honest
|
|
24
|
+
|
|
25
|
+
| Axis / option | Look-ahead? |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `pnl` with `--label-basis point_in_time` | No. Point-in-time history starts 2026-04-07 (earlier hours return nothing). |
|
|
28
|
+
| `size`, `tier` | No by construction: account value or position size at that hour |
|
|
29
|
+
| `pnl` default (`current`) | **Yes**: today's grading applied to old hours |
|
|
30
|
+
| `pnl_abs` | **Yes** always: dollar bands of today's PnL |
|
|
31
|
+
| `pnl_unrealized` | No, but it grades POSITIONING (who is currently onside), not skill, and turns over far faster than the realized ladder |
|
|
32
|
+
| `--grading realized-pit` | A frozen control that stops growing: a recent window comes back short; `freshness.behind_hours` says by how much |
|
|
33
|
+
|
|
34
|
+
`--opened-within` is refused with `point_in_time`, `realized-pit` and `pnl_unrealized`. With `point_in_time` the rows leave out `position_count*`, `total_unrealized_pnl` and `total_position_size*`: use only the notional columns and `bias`, and never read a missing value as 0. Read `label_computed` on every response: it names the source and the seam. **Label resolution changes at 2026-08-06**: daily labels before (constant across that day's 24 hours), hourly after. A turnover count or a difference taken across the seam shows an artefact that looks like a regime change; split the sample there or use `realized-pit` as the control.
|
|
35
|
+
|
|
36
|
+
## Signal definitions
|
|
37
|
+
|
|
38
|
+
- Group several rungs by summing notional: `bias_g = (2*sum(L) - sum(V)) / sum(V)` with `L = total_position_value_long`, `V = total_position_value`. Never average the biases.
|
|
39
|
+
- Level (`bias_g`), change (`bias_g[t] - bias_g[t-k]`), or the spread between a top group (`3x smart`, `2x smart`, `smart`) and a bottom group (`rekt`, `2x rekt`, `3x rekt`). Leave `unknown` out.
|
|
40
|
+
|
|
41
|
+
## Alignment and statistics
|
|
42
|
+
|
|
43
|
+
1. The in-progress hour is never returned, so a row stamped `T` is only knowable once hour `T` has closed. Measure forward returns from the OPEN of candle `T+1h`, never from candle `T`. Check the alignment on your own sample before trusting a lag of one or two hours.
|
|
44
|
+
2. Forward returns at several horizons (1h, 4h, 24h) and lead/lag correlations over lags in both directions. If the cohort moves AFTER the return, that is positioning chasing price, not a lead.
|
|
45
|
+
3. Neighbouring hours overlap and positions are autocorrelated: report the number of independent observations, not the number of hours, and a confidence interval. Count the cohorts, lags and horizons you tried and correct for it.
|
|
46
|
+
4. Split the sample (before / after 2026-08-06, or first half / second half) and say which half the result lives in.
|
|
47
|
+
5. Add a placebo: the same test on the `size` axis, or on a shuffled cohort assignment.
|
|
48
|
+
|
|
49
|
+
## What to report
|
|
50
|
+
|
|
51
|
+
> On `<symbol>`, `<axis>` with point-in-time labels, `<start>` to `<end>` (`N` hours, about `M` independent): `<signal>` vs the `<h>`-hour forward return from the next candle's open: correlation `<r>` (CI `<lo, hi>`); first half `<r1>`, second half `<r2>`; placebo `<r0>`. Labels change resolution on 2026-08-06. This describes this sample; it is not an out-of-sample test or a trading rule, and costs, funding and slippage are not included.
|
|
52
|
+
|
|
53
|
+
## Anti-patterns
|
|
54
|
+
|
|
55
|
+
- Don't use the default `pnl` labels or `pnl_abs` for anything backtest-like.
|
|
56
|
+
- Don't quote a hit rate without the sample size and the placebo; don't call a lag "alpha".
|
|
57
|
+
- Don't extrapolate: the point-in-time history starts 2026-04-07, one regime.
|
|
58
|
+
|
|
59
|
+
## Pairs well with
|
|
60
|
+
|
|
61
|
+
- `vike-hl-cohort-positioning` for the current read, `vike-candles` for the price series, `vike-hl-asset-briefing` for context
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vike-hl-cohort-positioning
|
|
3
|
+
description: Are whales, profitable wallets or losing wallets net long or short a Hyperliquid symbol right now - long/short notional per wallet cohort on the size and pnl ladders, the smart-money and whale indices, and the biggest individual positions, plus live feeds of the cohort lean, cohort leverage and the top-10 positions per coin. Use when the user asks "are whales long or short BTC" / "what are profitable Hyperliquid wallets doing on ETH" / "who is long SOL on Hyperliquid" / "Hyperliquid positioning" / "net long or short by wallet size".
|
|
4
|
+
allowed-tools: Bash(vike-data:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# vike-hl-cohort-positioning
|
|
8
|
+
|
|
9
|
+
A current read of how each wallet cohort is positioned in ONE symbol. 1 credit per call, about 6. For history and anything backtest-like use `vike-hl-cohort-backtest`: this skill's `pnl` labels are today's.
|
|
10
|
+
|
|
11
|
+
## Chain
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
vike-data hl segments --view cohorts --json # the exact cohort labels per ladder
|
|
15
|
+
vike-data hl cohort-metrics BTC --axis size --hours 1 --json # whales: one row per size rung
|
|
16
|
+
vike-data hl cohort-metrics BTC --axis pnl --hours 1 --json # profitable vs losing wallets (today's grading)
|
|
17
|
+
vike-data hl market --view indices --symbol BTC --hours 24 --json # series: smi, wsi per hour; latest: also smart_bias, whale_bias
|
|
18
|
+
vike-data hl segments --view summary --axis pnl --cohort smart --json # that cohort across ALL symbols
|
|
19
|
+
vike-data hl market --view positions --symbol BTC --sort size --limit 20 --json # the biggest open positions, largest first
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`--hours 1..24` is a current read; the newest SETTLED hour comes back (the hour in progress never does). Symbols are upper case; a HIP-3 market is `dex:TICKER`. Read `freshness`: `stale: true` means do not call it "now" (`behind_hours` says how far behind).
|
|
23
|
+
|
|
24
|
+
## Units and the ladders
|
|
25
|
+
|
|
26
|
+
- `bias` = (long - short) / (long + short) of NOTIONAL, a **fraction** from -1 (all short) to +1 (all long). Long share = (1 + bias) / 2. `total_position_value` and `total_position_value_long` are USD; `position_count` counts positions.
|
|
27
|
+
- **Several rungs as one group: sum the notional, never average the biases.** `bias_group = (2 * sum(total_position_value_long) - sum(total_position_value)) / sum(total_position_value)`.
|
|
28
|
+
- `size` ladder = account value: `shrimp` from $0, `fish` $10k, `dolphin` $50k, `shark` $250k, `whale` $1M, `2x whale` $2.5M, `3x whale` $5M, `4x whale` $10M and up. `pnl` ladder = percentile of cumulative realized PnL with at least 10 closed trades, from `3x smart` (top) through `winner` / `loser` to `3x rekt`; `unknown` = too few trades. `hl segments --view segments` gives each rung's bounds.
|
|
29
|
+
- The indices are ratios from -1 to +1: `smi` = long share of the smart cohorts minus that of the rekt cohorts, `wsi` = long share of whales minus shrimp, `smart_bias` / `whale_bias` = (long - short) / (long + short) of those groups. `hl market --view indices` returns `series` (settled hours, `smi` and `wsi` only, pnl rungs graded as of their hour) and `latest` (the newest snapshot, today's grading, with `smart_bias` and `whale_bias` too). `smi_wsi_gap` exists only on the `hl.indices` stream and in `hl_cohort_bias` alerts.
|
|
30
|
+
|
|
31
|
+
## Reading
|
|
32
|
+
|
|
33
|
+
- Check `position_count` and the rung's notional before saying a cohort "is short": 20 wallets, or one wallet, can set a rung's bias. Compare rungs, not just totals: whales net short while `smart` is net long is a disagreement worth stating as such.
|
|
34
|
+
- `--opened-within 24h|7d|30d` (on `cohort-metrics` and `segments summary`) restricts to recently opened positions: how much of the lean is new.
|
|
35
|
+
- `hl market --view positions --sort size` needs `--symbol` and at most `--limit 500`, and takes no cursor; each row has `size_usd`, `leverage`, `liquidation_price`, `unrealized_pnl`, `opened_at` and the wallet's `account_value`. Without `--sort size` rows come in key order, not by size. Never run `positions` without `--symbol` or `--wallet`.
|
|
36
|
+
|
|
37
|
+
## Live
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
vike-data stream hl-cohorts --channel hl.cohort_bias --filter coin=BTC --filter axis=pnl # every cohort's long/short, each position capture (~12 min)
|
|
41
|
+
vike-data stream hl-cohorts --channel hl.indices --filter coin=BTC,ETH --filter index=smi,wsi # only when an index crosses -0.10 / +0.10
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`hl.cohort_bias` covers the 50 coins with the most open value; a `cohort` belongs to one axis (`3x smart` with `axis=size` matches nothing).
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
vike-data stream hl-cohorts --channel hl.cohort_leverage --filter axis=size --filter cohort=whale,shark # leverage per cohort, once an hour
|
|
48
|
+
vike-data stream hl --channel hl.top_positions --filter coin=BTC --filter event=entered # who enters the BTC top 10
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- **`hl.cohort_leverage`** is the hourly leverage of each cohort on its own money: `perp_bias` = (long - short) / account value, `equity_exposure` = (long + short) / account value (`null` when no wallet of the cohort has a positive account value), with `equity_covered_share` saying how much of the cohort's notional the counted wallets hold. Main-dex positions of native perp accounts, no coin and no wallet; the newest hour arrives at once, then one an hour (hour 08:00 at about 09:03). The same numbers as history: `hl segments --view history --axis size --cohort whale --include leverage`.
|
|
52
|
+
- **`hl.top_positions`**: per coin of the top 50, a position that `entered`, `left` or `moved` within the top 10, at each capture (about 12 minutes), with `rank`, `prev_rank`, `direction`, `size_usd`, `leverage`, `liquidation_price`. The first capture sends the whole top 10 of every coin as `entered` (with a `coin` filter: 10 events). The ranking is that of `hl market --view positions --sort size`, live.
|
|
53
|
+
- The three `stream hl-cohorts` lines above are alternatives: one key holds one connection per path, so a second `stream hl-cohorts` replaces the first (`4410`). Put channels in one command only when each takes every `--filter` key (`hl.cohort_leverage` has no `coin`), or give each its own key.
|
|
54
|
+
|
|
55
|
+
For a stored rule: `vike-data alerts create --type hl_cohort_bias --index smi ...` (see `vike-alerts-setup`).
|
|
56
|
+
|
|
57
|
+
## Answer template
|
|
58
|
+
|
|
59
|
+
> BTC on Hyperliquid, hour `<ts>` UTC (`freshness.stale: false`): whales (`4x`..`whale`) are `<bias_group>` (`$L` long / `$S` short across `N` positions); `smart` wallets are `<bias>`; `rekt` wallets `<bias>`; `smi` `<v>`. Positioning is notional-weighted, today's cohort labels, Hyperliquid only: a position can be a hedge held elsewhere.
|
|
60
|
+
|
|
61
|
+
## Anti-patterns
|
|
62
|
+
|
|
63
|
+
- Don't turn a lean into a price forecast, and don't say "smart money is short" when the group is one rung of 20 positions.
|
|
64
|
+
- Don't use these default labels on history: the `pnl` ladder is graded today (look-ahead).
|
|
65
|
+
- Don't write `bias` or an index as a percent: they are fractions.
|
|
66
|
+
|
|
67
|
+
## Pairs well with
|
|
68
|
+
|
|
69
|
+
- `vike-hl-asset-briefing` (adds funding, OI, liquidations), `vike-hl-cohort-backtest` (history), `vike-hl-trader-profile` (one wallet from the positions list)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vike-hl-liquidation-radar
|
|
3
|
+
description: Where Hyperliquid liquidations are likely - which liquid symbols have the most open interest near liquidation, where one symbol's liquidation clusters sit around the mark, which liquidations just happened, and a live feed of positions entering the liquidation zone, of liquidations as they print and of leveraged position changes. Use when the user asks "which coins are closest to a liquidation cascade" / "where are ETH liquidations clustered" / "liquidation heatmap" / "who just got liquidated on Hyperliquid" / "alert me to big liquidations".
|
|
4
|
+
allowed-tools: Bash(vike-data:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# vike-hl-liquidation-radar
|
|
8
|
+
|
|
9
|
+
Three reads of the same idea and a live feed, 1 credit per call. Risk and the heatmap come from 5-minute position snapshots, so they are inferred; the liquidation events are read from the liquidated accounts' own fills since 2026-08-03 (inferred from snapshots before).
|
|
10
|
+
|
|
11
|
+
## Chain
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
vike-data hl liquidations --view risk --min-value-usd 50000000 --json # symbols with $50M+ open, ranked by percent_risk
|
|
15
|
+
vike-data hl liquidations --view heatmap --symbol ETH --bins 20 --json # liquidation value per price bin
|
|
16
|
+
vike-data hl liquidations --view fills --symbol ETH --direction long --limit 50 --json # recent long liquidations
|
|
17
|
+
vike-data candles hl ETH --interval 1h --limit 48 --json # distance from the mark to the clusters
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Reading
|
|
21
|
+
|
|
22
|
+
- **`risk`**: rows `symbol`, `total_value_usd`, `risk_value_usd`, `percent_risk` (a **fraction**, 0.234 = 23.4%), `positions_count`, `at_risk_count`. A position is at risk when it sits within half of its liquidation buffer. The ranking is by `percent_risk`, so without `--min-value-usd` thin HIP-3 and micro-cap markets lead. Add `--axis size|pnl|pnl_abs --cohort <label>` to ask the same of one cohort.
|
|
23
|
+
- **`heatmap`** (`--symbol` required, `--bins` 5-500): bins are equal-width over +-50% of `mark_price`, each with `liquidation_value_usd`, `positions_count`, `long_value_usd`, `short_value_usd`, `most_impacted_cohort`. **Long liquidations sit below the mark** (price falling), shorts above. `coverage` says what the map leaves out (positions beyond +-50% and those with no liquidation price), so a cluster is a floor.
|
|
24
|
+
- **`fills`**: `--direction` is the side of the position that was CLOSED (`long` = longs liquidated = price falling). `--wallet <addr>` asks whether one wallet was liquidated. Most rows are small: sort by size before quoting.
|
|
25
|
+
- Liquidation prices move with margin, price and funding; a cluster is a snapshot, not a level that will be hit.
|
|
26
|
+
|
|
27
|
+
## Live
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
vike-data stream hl --channel hl.liq_risk hl.liquidations --filter coin=BTC,ETH,HYPE --filter min_usd=1000000
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
- **`hl.liq_risk`**: a position of $100,000 or more announced once as its `liq_ratio` reaches 0.80 (0 = at entry, 1 = at the liquidation price), not again until it drops below 0.70 or closes. It comes with each position capture, about every 12 minutes. The first capture after the channel starts sends every position already in the zone with `prev: null` (about 300 on 2026-11-02); after that `prev: "out"` = just entered. `data` has `direction`, `liq_ratio`, `mark_price`, `entry_price`, `liquidation_price`, `size_usd`, `leverage`.
|
|
34
|
+
- **`hl.liquidations`**: each liquidation from the account's own fill, typically within a minute or two, `data.direction` the closed side, `size_usd`, `mark_price`; no size floor of its own.
|
|
35
|
+
- `min_usd` is the position size on `hl.liq_risk` and the liquidation size on `hl.liquidations`. A stored rule for one wallet: `vike-data alerts create --type hl_liq_proximity --wallet 0x... ...` (see `vike-alerts-setup`).
|
|
36
|
+
- **`hl.positions`**: the fills that change a big position (a wallet of $250,000 or more, or a position that size before or after the fill), each with `data.leverage` and `data.liquidation_px` of the wallet's position BEFORE the fill (the last capture, up to about 25 minutes old; `null` for an `open`; a `liquidation_px` of 0 means none) and `labels.tags`. `min_leverage=20` keeps the fills of positions at 20x or more (a `null` never matches); `tag` filters the wallet's trader tags; `min_usd` is the FILL's size (a floor of $1,000 you cannot lower). `hl.liq_risk` and `hl.liquidations` refuse `min_leverage` and `tag`, so it cannot share the command above:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# instead of the line above (one connection per key and path: a second `stream hl` replaces the first with 4410), or under its own key
|
|
40
|
+
vike-data stream hl --channel hl.positions --filter coin=BTC,ETH,HYPE --filter min_leverage=20
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Answer template
|
|
44
|
+
|
|
45
|
+
> Closest to a cascade among symbols with at least $50M open: `<symbol>` `<percent_risk>` (`$risk` of `$total`). `<ETH>`: `$V` of long notional liquidates between `<p1>` and `<p2>` (`<x%>` below the mark), `$W` of shorts above `<p3>`; the map covers `<c>` of open notional. Last hour: `<n>` long liquidations, largest `$M`.
|
|
46
|
+
|
|
47
|
+
## Anti-patterns
|
|
48
|
+
|
|
49
|
+
- Don't rank micro-cap or HIP-3 markets next to BTC without the notional floor.
|
|
50
|
+
- Don't write `percent_risk` as a percent without multiplying, or treat the heatmap as complete.
|
|
51
|
+
- Don't predict a cascade: say where open interest is exposed.
|
|
52
|
+
|
|
53
|
+
## Pairs well with
|
|
54
|
+
|
|
55
|
+
- `vike-hl-asset-briefing`, `vike-hl-cohort-positioning` (who holds the exposed side), `vike-candles`, `vike-stream`
|
|
@@ -78,9 +78,10 @@ The response includes `tolerance_used` so the caller knows which band matched (`
|
|
|
78
78
|
|
|
79
79
|
- Don't fabricate matches when the tool returns `match_count: 0`. Say "no open position matches that share card" — closed positions, post-card adds, or non-HL cards all produce empty results.
|
|
80
80
|
- Don't strip the address when displaying — share-card investigations always want the full 0x...40hex (users copy-paste it).
|
|
81
|
-
- Don't infer trader skill from a single share-card match.
|
|
81
|
+
- Don't infer trader skill from a single share-card match. Profile the wallet with `vike-hl-trader-profile` (`vike-data hl wallet <address>`).
|
|
82
82
|
|
|
83
83
|
## Pairs well with
|
|
84
84
|
|
|
85
|
-
- `vike-hl-
|
|
85
|
+
- `vike-hl-trader-profile` — track record, equity, open positions, funding and deposits of the matched wallet.
|
|
86
|
+
- `vike-hl-top-traders` — where the wallet ranks. (`vike-data wallet summary` has no Hyperliquid data: it shows on-chain transfer activity on one chain only.)
|
|
86
87
|
- `vike-wallet-label-provenance` — find out if the wallet is a known CEX/fund/MM rather than a retail trader.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: vike-hl-top-traders
|
|
3
|
-
description: Rank
|
|
3
|
+
description: Rank Hyperliquid perp traders by PnL / ROI / win rate / volume / trade count / drawdown over a window - the quick top list, or the full leaderboard with Calmar, profit factor, streaks, cohort filters, paging and PnL net of deposits - and see where one address ranks. Use when the user asks "top HL traders" / "best Hyperliquid wallets" / "HL leaderboard" / "who made the most on Hyperliquid this week" / "top traders net of deposits".
|
|
4
4
|
allowed-tools: Bash(vike-data:*)
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -36,21 +36,35 @@ An object `{ "traders": [...], "total": N }`; each trader:
|
|
|
36
36
|
|
|
37
37
|
`address`, `total_realized_pnl` (USD), `roi_pct`, `win_rate_pct`, `long_win_rate_pct`, `short_win_rate_pct`, `win_count`, `loss_count`, `trade_count`, `total_volume` (USD), `long_pnl`, `short_pnl`, `max_drawdown_pct`, `account_value` (USD), `avg_leverage`.
|
|
38
38
|
|
|
39
|
-
All `*_pct` fields are percents: `12.5` means 12.5%. (Before 2026-10-19 `roi_pct` and `max_drawdown_pct` came back 100× too large; a transcript showing a 1,750% ROI is from that period.) `avg_leverage` is
|
|
39
|
+
All `*_pct` fields are percents: `12.5` means 12.5%. (Before 2026-10-19 `roi_pct` and `max_drawdown_pct` came back 100× too large; a transcript showing a 1,750% ROI is from that period.) `avg_leverage` is the notional-weighted leverage of the open positions (real since 2026-10-25); 0 = no open position. There is no `pnl_usd` and no `max_drawdown_usd`.
|
|
40
40
|
|
|
41
41
|
## Reading
|
|
42
42
|
|
|
43
43
|
- **`roi_pct` is realized only.** It is the window's realized PnL divided by the wallet's CURRENT account value. Open positions are not counted, and a wallet that has since withdrawn most of its equity looks better than it was (and a recent deposit makes it look worse).
|
|
44
|
-
- **`max_drawdown_pct` is account-level and all-time
|
|
44
|
+
- **`max_drawdown_pct` is account-level and all-time** here, a percent from 0 to 100 built from the account's equity history; `null` = too little equity history to say. It does not change with `--window`.
|
|
45
45
|
- **Windows are UTC days:** `1d`, `7d`, `30d` mean today plus the previous 1, 7 or 30 days; `all` is the last 365 days.
|
|
46
|
-
- **`trade_count` counts
|
|
46
|
+
- **`trade_count` counts the trades CLOSED in the window** (filed under the UTC day they closed, whenever they opened). A trade still open is not counted, so a wallet's count here differs from a per-wallet trade summary (which counts open trades too).
|
|
47
47
|
- A wallet with 90% win rate on 4 trades is statistical noise. Min trades 10–20 for any "skill" claim.
|
|
48
48
|
- Top by PnL ≠ top by ROI. Whales win big in $ but small in % terms; ROI sort surfaces smaller-account discretionary skill.
|
|
49
49
|
- The leaderboard rewards survivors: wallets that blew up don't appear, so the PnL distribution is right-skewed.
|
|
50
50
|
|
|
51
|
+
## `hl leaderboard`: the full board
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
vike-data hl leaderboard
|
|
55
|
+
[--view ranking|flow_adjusted] [--window 1d|7d|30d|all]
|
|
56
|
+
[--sort pnl|realized_pnl|roi|volume|trades|win_rate|profit_factor|expectancy|calmar|max_drawdown|current_drawdown|fees|win_streak|...] # an unknown key is refused
|
|
57
|
+
[--order asc|desc] [--cohort <label> --axis size|pnl|pnl_abs]
|
|
58
|
+
[--min-trades N] [--min-win-rate F] [--min-volume USD] # win rate is a FRACTION here: 0.6 = 60%
|
|
59
|
+
[--limit N] # default 25, max 500; page with nextCursor -> --cursor (resend the same filters)
|
|
60
|
+
[--json]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Rows are keyed `wallet` (not `address`) with `account_value`, `total_realized_pnl`, `pnl_pct`, `roi`, `win_rate` (a fraction), `profit_factor`, `expectancy`, `max_drawdown_pct`, `current_drawdown_pct`, `calmar_ratio`, streaks, `size_cohort`, `pnl_cohort`. Prefer `pnl_pct` to `roi` (`roi` is unguarded on a near-empty account). Here the drawdown fields are computed over the window's equity (0-100; `null` = too little equity history), unlike `perp top-traders`. `--view flow_adjusted` ranks fills-derived trading PnL, which excludes deposits, and takes only `--window`, `--min-trades`, `--limit`, `--cursor`; when its `flow_unbalanced` is true the flow figures are unreliable.
|
|
64
|
+
|
|
51
65
|
## Is this specific address any good?
|
|
52
66
|
|
|
53
|
-
|
|
67
|
+
Profile the wallet itself: `vike-hl-trader-profile` (`vike-data hl wallet <address>`). To see where it ranks, scan a leaderboard for it:
|
|
54
68
|
|
|
55
69
|
```bash
|
|
56
70
|
vike-data perp top-traders --window 30d --sort pnl --size 20 --json
|
|
@@ -60,9 +74,8 @@ vike-data perp top-traders --window 30d --sort win_rate --min-trades 10 --size 2
|
|
|
60
74
|
```
|
|
61
75
|
|
|
62
76
|
- **Found** → report that row for that window and sort (all columns above). That is the whole profile you can give.
|
|
63
|
-
- **Not found** → say "not in the top
|
|
77
|
+
- **Not found** → say "not in the top N for this window and sort". Absence says nothing about quality; `hl leaderboard --limit 500` pages deeper.
|
|
64
78
|
- `vike-data wallet summary` has **no Hyperliquid data** (it reads on-chain transfers on one chain): don't present it as the HL profile. `vike-data labels <addr>` shows whether the address is a known entity.
|
|
65
|
-
- The REST API has per-wallet Hyperliquid routes (`/v1/hyperliquid/wallets/{address}`, `.../trades/summary`), but no CLI command or MCP tool exposes them yet. Say so if the user needs fills, funding or per-trade history.
|
|
66
79
|
|
|
67
80
|
Classification of a found wallet:
|
|
68
81
|
|
|
@@ -82,6 +95,6 @@ Classification of a found wallet:
|
|
|
82
95
|
|
|
83
96
|
## Pairs well with
|
|
84
97
|
|
|
85
|
-
- `vike-hl-position-match` to find the wallet behind a share card first
|
|
98
|
+
- `vike-hl-trader-profile` for one wallet's full record; `vike-hl-position-match` to find the wallet behind a share card first
|
|
86
99
|
- `vike-perp-funding` to see whether the leaders are positioned against funding
|
|
87
100
|
- `vike-candles` for the price action behind a period of PnL
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vike-hl-trader-profile
|
|
3
|
+
description: Full profile of one Hyperliquid wallet - equity, open positions, cohort labels, lifetime PnL against deposits, win rate and risk metrics, per-symbol record, closed trades, funding paid, deposits and withdrawals, orders, TWAPs, leverage changes, liquidations, builder routing, and a live feed of its fills and closed trades. Use when the user gives a Hyperliquid address and asks "is this trader any good" / "profile this HL wallet" / "what is this wallet's track record" / "show the fills, funding or deposits of 0x..." / "watch this trader".
|
|
4
|
+
allowed-tools: Bash(vike-data:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# vike-hl-trader-profile
|
|
8
|
+
|
|
9
|
+
One address, answered from the wallet's own data (not from scanning a leaderboard). 1 credit per call. Get the address from `vike-hl-top-traders`, `vike-hl-position-match`, `hl market --view positions` or `vike-data search <name>` (its `traders` section).
|
|
10
|
+
|
|
11
|
+
## Chain
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
W=0xfc667adba8d4837586078f4fdcdc29804337ca06
|
|
15
|
+
vike-data hl wallet $W --window 30d --json # equity, open_positions, cohorts, lifetime, ledger_by_type, metrics
|
|
16
|
+
vike-data hl wallet $W --view trades_summary --window 30d --json # closed/open trades, medians, per-symbol record
|
|
17
|
+
vike-data hl wallet-trades $W --limit 50 --json # closed round trips, newest close first
|
|
18
|
+
vike-data hl wallet-activity $W --view funding --limit 50 --json # funding paid or received
|
|
19
|
+
vike-data hl wallet-activity $W --view ledger --limit 50 --json # deposits, withdrawals, sends, vault events
|
|
20
|
+
vike-data hl liquidations --wallet $W --json # has it been liquidated
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Optional, by question: `hl wallet-activity $W --view fills --symbol BTC` (raw fills), `--view builders` (which front-ends it routes through), `hl orders --view wallet --address $W` (what became of its orders, 7 days by default, at most 30), `hl twaps --wallet $W`, `hl leverage-changes --wallet $W`, `hl market --view positions --wallet $W` (open positions with liquidation price). `--window` is `1d|7d|30d|all` (default `all`); page with `nextCursor` -> `--cursor`.
|
|
24
|
+
|
|
25
|
+
## Reading
|
|
26
|
+
|
|
27
|
+
- **A wallet we hold nothing for is an error**, not zeros: `hl wallet` exits 1 with "no Hyperliquid data for wallet 0x...". Say "no Hyperliquid history for this address", not "a flat trader" or "the tool failed". `last_fill_ts` is `null` for a wallet with no fill; `has_metrics: false` on an active wallet means no trades in the window, which is not zero skill.
|
|
28
|
+
- `equity.account_value` is the live account; `cash_balance_usd` can be hugely negative on a cross-margin account next to a healthy account value: don't quote it as cash.
|
|
29
|
+
- **Units**: `*_usd` and `account_value` are USD. `win_rate`, `long_win_rate` are FRACTIONS (0.49 = 49%); `pnl_pct`, `roi`, `*_drawdown_pct` are percents. `perp top-traders` returns `win_rate_pct` as a percent: never mix the two in one table.
|
|
30
|
+
- **`max_drawdown_pct`** is a percent from 0 to 100 of the wallet's own equity (deposits and withdrawals taken out) over the window; `null` means too little equity history to say, not 0. `calmar_ratio` and `recovery_factor` derive from it and are `null` with it.
|
|
31
|
+
- **Lifetime vs ledger**: compare `lifetime.cum_realized_pnl` with `net_deposit_usd` before praising PnL. The ledger records `send` one-sided and signed, so net-flow sums from it lean negative; trust `deposit` and `withdraw`, treat `send` as movement to or from other accounts.
|
|
32
|
+
- **Mean vs median** (`trades_summary`): a few large trades drive the mean (a live 30-day record: `avg_gain` $73.6k against `median_gain` $4.5k). Report medians beside means, with `payoff_ratio`, `profit_factor`, `expectancy`.
|
|
33
|
+
- `trade_count` here counts open and closed trades; the leaderboard counts only completed trades, so the two never match.
|
|
34
|
+
- **Funding**: `payment_usd` is signed from the wallet's side, negative = the wallet PAID. **Fees**: a negative `fee` on a fill is a maker rebate.
|
|
35
|
+
- Cohorts (`size`, `pnl`, style tags) are today's labels. `avg_leverage` is the notional-weighted leverage of the open positions (real since 2026-10-25); 0 = no open position, not unlevered.
|
|
36
|
+
- Identity: a Hyperliquid address is an EVM address; `vike-data labels <addr>` may name it. Sub-accounts and vaults are separate addresses with no merge.
|
|
37
|
+
|
|
38
|
+
## Watch it live
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
vike-data stream hl --channel hl.fills hl.liquidations hl.ledger hl.closed_trades --filter wallet=$W --filter min_usd=0
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`hl.fills` alone defaults to fills of $1,000 or more; `min_usd=0` is every fill. `hl.closed_trades` sends each round trip once, when it is written as closed, in batches every 30 minutes (a trade that closed at 08:12 arrives around 08:35); its `data` is the item of `hl wallet-trades` (`realized_pnl`, `entry_price`, `exit_price`, `duration_seconds`, `max_size_usd`) and `min_usd` on it is the trade's largest size. A close shows at once as an `hl.fills` event whose `data.action` is `close`. One key holds one `stream hl` connection: add channels to this command, never start a second one. A stored rule instead: `vike-data alerts create --type hl_wallet --wallet $W ...` (see `vike-alerts-setup`).
|
|
45
|
+
|
|
46
|
+
## Verdict rubric (rules of thumb, not tool output)
|
|
47
|
+
|
|
48
|
+
| Pattern | Label |
|
|
49
|
+
|---|---|
|
|
50
|
+
| positive `lifetime.cum_realized_pnl` AND window `profit_factor` above 1.5 AND 50+ closed trades AND positive median gain | **Consistent** |
|
|
51
|
+
| big PnL, `win_rate` near 0.5, mean far above median | **Few large winners** (size matters more than hit rate) |
|
|
52
|
+
| high win rate on fewer than 10 closed trades | **Unverified** |
|
|
53
|
+
| `net_deposit_usd` much larger than `cum_realized_pnl` | **Equity driven by deposits**, not trading |
|
|
54
|
+
| realized PnL positive but `total_unrealized_pnl` very negative on a large open book | **Open risk** |
|
|
55
|
+
|
|
56
|
+
## Anti-patterns
|
|
57
|
+
|
|
58
|
+
- Don't call a wallet "the best trader" from a 1d or 7d window, or from one number.
|
|
59
|
+
- Don't give copy-trade advice. The record is past, one venue, labels as of today.
|
|
60
|
+
- Don't read a `null` drawdown as 0.
|
|
61
|
+
|
|
62
|
+
## Pairs well with
|
|
63
|
+
|
|
64
|
+
- `vike-hl-top-traders` (rankings), `vike-hl-position-match` (find the wallet), `vike-wallet-who-is` (on-chain identity)
|
|
65
|
+
- `vike-hl-cohort-positioning` for how that cohort is positioned
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vike-perp-crowding
|
|
3
|
+
description: Is a perpetual-futures symbol crowded one way - funding paid, open interest net of the price move and the long/short lean on each venue, compared with the symbol's own last week, plus the Hyperliquid funding history and wallet-cohort lean. Use when the user asks "is BTC long crowded" / "is ETH positioning stretched across exchanges" / "is open interest rising with price" / "are traders over-leveraged long on SOL".
|
|
4
|
+
allowed-tools: Bash(vike-data:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# vike-perp-crowding
|
|
8
|
+
|
|
9
|
+
Three lenses on one symbol, about 6 credits. No lens has a validated threshold: judge each against the symbol's OWN last week and report what agrees, never a score. Base asset only (`BTC`, not `BTCUSDT`). Open interest and long/short have no command of their own: they are `vike-data call`.
|
|
10
|
+
|
|
11
|
+
## Chain
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
S=BTC
|
|
15
|
+
vike-data perp funding --symbol $S --json # funding on every venue now
|
|
16
|
+
vike-data hl market --view hourly --symbols $S --days 7 --json # Hyperliquid funding, open interest and close per hour
|
|
17
|
+
vike-data call perp_open_interest --args '{"symbol":"BTC","hours":168}' # hourly oi_usd per venue
|
|
18
|
+
vike-data call perp_long_short --args '{"symbol":"BTC","hours":168}' # hourly long_short_ratio per venue, with `basis`
|
|
19
|
+
vike-data candles hl $S --interval 1h --limit 169 --json # price over the same hours, to net it out of OI
|
|
20
|
+
vike-data hl cohort-metrics $S --axis size --hours 1 --json # optional: whales on Hyperliquid
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Without `hours` both `call`s return the newest print per venue; `"exchange":"binance"` narrows to one venue.
|
|
24
|
+
|
|
25
|
+
## Lens 1: funding
|
|
26
|
+
|
|
27
|
+
Raw `funding_rate` is per interval and `interval_h` differs (Hyperliquid 1h, most CEXs 8h): `daily_pct = funding_rate x 24 / interval_h x 100`. Positive = longs pay. `perp funding` is a snapshot, so for the CEXs say "above/below the other venues"; Hyperliquid's own funding history is in the hourly panel, so judge it against its week.
|
|
28
|
+
|
|
29
|
+
## Lens 2: open interest net of price
|
|
30
|
+
|
|
31
|
+
`oi_usd` is USD notional = contracts x mark price, so it rises with price on its own. Over the same hours: `contracts_change% ~ oi_change% - price_change%`. OI rising faster than price = new positions; falling while price rises = positions closing. Venues in `stale_venues` are not in `venues` and never in a total. The series is `[hour, oi_usd]` pairs, `hours + 1` points, the first hour partial.
|
|
32
|
+
|
|
33
|
+
## Lens 3: who leans
|
|
34
|
+
|
|
35
|
+
`long_share` / `short_share` are fractions of 1; `long_short_ratio` = long / short, above 1 long-heavy. **Each venue counts something different** and the row says so in `basis`: binance = top traders by positions, okx and gate = top traders by accounts, bybit = all accounts. Never average across venues; compare each venue with its own 7-day range. About 40 major symbols per venue; other symbols return empty lists and a `note`, not zeros. Hyperliquid cohorts (`bias` -1..+1 of notional, sum rungs by notional) are wallets, not accounts counted by a venue.
|
|
36
|
+
|
|
37
|
+
## Verdict
|
|
38
|
+
|
|
39
|
+
State which lenses point the same way and which do not. Illustrative wording, not live data: "funding positive on most venues, contracts rising on binance but falling on hyperliquid, long ratio at its 7-day high on binance only: mixed, not crowded". Name "crowded long" only when funding, net OI and at least two bases agree and sit at the top of their own week.
|
|
40
|
+
|
|
41
|
+
## Anti-patterns
|
|
42
|
+
|
|
43
|
+
- Don't read `oi_usd` growth as new longs, or a long/short ratio as dollars.
|
|
44
|
+
- Don't average ratios across venues or compare bases; don't forecast a squeeze.
|
|
45
|
+
- Don't leave stale venues in the comparison.
|
|
46
|
+
|
|
47
|
+
## Pairs well with
|
|
48
|
+
|
|
49
|
+
- `vike-perp-funding`, `vike-perp-overview`, `vike-hl-cohort-positioning`, `vike-hl-asset-briefing`, `vike-candles`
|
|
@@ -75,8 +75,11 @@ A funding arb at 0.4–1% daily is real. Anything much higher on a liquid pair i
|
|
|
75
75
|
- Don't blindly pick the lowest-funding venue without checking `vol_24h_usd` — Hyperliquid funding looks great on small alts but the book can be thin.
|
|
76
76
|
- Don't read `funding_rate` of an 8h venue against a 1h venue without normalising.
|
|
77
77
|
- Don't promise a price comparison from this tool: for price gaps across venues use `vike-perp-overview` (`perp spreads`).
|
|
78
|
+
- The arb list often leads with thin tokens: run mode B and read `vol_24h_usd` on both legs before calling a row a trade.
|
|
79
|
+
- Funding is the cost of carrying a position, not how crowded it is: for open interest and long/short per venue see `vike-perp-overview`, and `vike-perp-crowding` for the combined read.
|
|
78
80
|
|
|
79
81
|
## Pairs well with
|
|
80
82
|
|
|
81
|
-
- `vike-perp-overview` for cross-venue price gaps and the market snapshot
|
|
83
|
+
- `vike-perp-overview` for cross-venue price gaps, open interest, long/short and the market snapshot
|
|
84
|
+
- `vike-perp-crowding` to put a funding number next to open interest and positioning; `vike-hl-asset-briefing` for one Hyperliquid symbol
|
|
82
85
|
- `vike-hl-top-traders` to see how Hyperliquid's best traders are doing
|
|
@@ -1,12 +1,30 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: vike-perp-overview
|
|
3
|
-
description: Perp-market snapshot and
|
|
3
|
+
description: Perp-market snapshot and the venue-level reads of one symbol — the top funding arbs, the widest perp price gaps between venues, the Hyperliquid leaderboard, open interest per venue and each venue's long/short lean. Use when the user asks "what's happening in perps today" / "perp market overview" / "any perp arb today" / "price differences across exchanges" / "where's X cheapest" / "open interest of X" / "long short ratio of X".
|
|
4
4
|
allowed-tools: Bash(vike-data:*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# vike-perp-overview
|
|
8
8
|
|
|
9
|
-
One-shot market overview for perpetuals, plus the cross-venue price-gap
|
|
9
|
+
One-shot market overview for perpetuals, plus the cross-venue price-gap, open-interest and long/short tools. There is **no market-wide volume or per-venue mark-price tool**; say so if asked (Hyperliquid's own open interest is `vike-data hl market --json`).
|
|
10
|
+
|
|
11
|
+
## Open interest and long/short (one symbol, per venue)
|
|
12
|
+
|
|
13
|
+
These two tools have no command of their own; `vike-data call` prints their raw JSON (1 credit each):
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
vike-data call perp_open_interest --args '{"symbol":"BTC"}' # newest print per venue
|
|
17
|
+
vike-data call perp_open_interest --args '{"symbol":"BTC","exchange":"binance","hours":48}' # hourly series, 1-168
|
|
18
|
+
vike-data call perp_long_short --args '{"symbol":"ETH"}'
|
|
19
|
+
vike-data call perp_long_short --args '{"symbol":"ETH","exchange":"okx","hours":24}'
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Pass the base asset (`BTC`, not `BTCUSDT`); `exchange` is lower case.
|
|
23
|
+
|
|
24
|
+
- **`oi_usd` is USD notional** (open contracts x mark price when polled): not a contract count, so venues add up, and it moves with price even when no position opens or closes. Venues: aster, binance, bitget, bybit, hyperliquid, kucoin, okx. A venue silent for over an hour is under `stale_venues` and NOT in `venues`: never add it into a total.
|
|
25
|
+
- **`long_share` / `short_share` are fractions of 1**; `long_short_ratio` = long / short, above 1 = long-heavy. **Each venue counts something different, named in the row's `basis`**: binance top traders by positions; okx and gate top traders by accounts; bybit all accounts. Never average across venues; compare a venue with its own history.
|
|
26
|
+
- About 40 major symbols per venue: any other symbol returns empty lists and a `note`, never zeros.
|
|
27
|
+
- Whether a symbol is crowded: `vike-perp-crowding`.
|
|
10
28
|
|
|
11
29
|
## Price spreads
|
|
12
30
|
|
|
@@ -52,7 +70,7 @@ wait
|
|
|
52
70
|
## When to skip the 3-call snapshot
|
|
53
71
|
|
|
54
72
|
- User asked about one symbol's funding or venues → `vike-perp-funding`.
|
|
55
|
-
- User asked about one HL trader → `vike-hl-top-traders
|
|
73
|
+
- User asked about one HL trader → `vike-hl-trader-profile` (or `vike-hl-top-traders` for a ranking).
|
|
56
74
|
- User only wants price gaps → run `perp spreads` alone.
|
|
57
75
|
|
|
58
76
|
## Anti-patterns
|
|
@@ -66,4 +84,6 @@ wait
|
|
|
66
84
|
## Pairs well with
|
|
67
85
|
|
|
68
86
|
- `vike-perp-funding` for the funding deep dive and one-symbol venue comparison
|
|
87
|
+
- `vike-perp-crowding` for funding + open interest net of price + long/short on one symbol
|
|
69
88
|
- `vike-hl-top-traders` for the leaderboard filters and how to read its columns
|
|
89
|
+
- `vike-daily-brief` for the perp section inside a cross-market brief
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vike-pm-l2-archive
|
|
3
|
+
description: Find and fetch the free Polymarket L2 archive - daily Parquet files of the full order-book events, the trade tape and top-of-book quotes, whole or cut per market family such as BTC 5-minute up/down - with their sizes, a 7-day download link, and the on-chain outcomes to join them to. Says when the API tape is enough instead. Use when the user asks "get me Polymarket order book history" / "BTC 5m up/down L2 data for last week" / "download the Polymarket trades for a day" / "data to backtest a Polymarket strategy".
|
|
4
|
+
allowed-tools: Bash(vike-data:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# vike-pm-l2-archive
|
|
8
|
+
|
|
9
|
+
The archive is one Parquet file per UTC day and stream, recorded since 2026-07-25, free under CC BY 4.0 (credit "Polymarket L2 archive (c) Vike (vike.io/data), CC BY 4.0"). `vike-data` lists files and resolves links; **it never downloads.** 1 credit per call.
|
|
10
|
+
|
|
11
|
+
## Chain
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
vike-data polymarket archive --view datasets --asset btc --tenor 5m --stream trades --date-from 2026-10-15 --date-to 2026-10-17 --json
|
|
15
|
+
vike-data polymarket archive --view url --stream trades --date 2026-10-16 --json # multi-asset file, one day
|
|
16
|
+
vike-data polymarket archive --view url --stream trades --asset btc --tenor 5m --date 2026-10-16 --json # family file
|
|
17
|
+
vike-data polymarket settlements --slug-prefix btc-updown-5m- --from-ms <start> --to-ms <end> --limit 1000 --json # how each market resolved
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Streams: `book_events` (full L2: snapshots, `price_change` deltas, trades, tick-size and status markers), `trades` (taker tape), `l1_quotes` (derived top of book). A row carries `date`, `stream`, `layout` (`flat` = every market, `family` = one asset and tenor), `bytes`, `rows`, `url`. `datasets` pages with `--limit` (max 1000) and `--offset` against `total`.
|
|
21
|
+
|
|
22
|
+
## Pick the right file
|
|
23
|
+
|
|
24
|
+
- `--asset` and `--tenor` go together or not at all, and either one hides every flat file. Without them `datasets` mixes both layouts: filter on `layout`, or the same day appears twice.
|
|
25
|
+
- **Check `bytes` first.** Measured 2026-10-19: one day of `trades` about 12 MB; a BTC 5m family `trades` day 3-5 MB; one day of `book_events` **8.5 GB (532 million rows)**. Tell the user before any `book_events` download, and prefer the family file for one asset.
|
|
26
|
+
- A few hours or one token: use the API, not a bulk file: `vike-data polymarket tape --token-id <id> --from-ms ... --to-ms ... --event-type trade` (at most 24 h a call, no wallets), `vike-data polymarket market-trades <condition_id>` (with wallets) or `vike-data candles polymarket <token_id>`.
|
|
27
|
+
|
|
28
|
+
## Fetch (outside this skill's tool grant; hand the user the command)
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
curl -C - -o trades-2026-10-16.parquet "<url from the row>"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The link needs no API key and is valid for 7 days (`expires_at`): treat it as a secret, don't paste it anywhere shared. **Download the file whole and read the local copy** with DuckDB, polars or pyarrow: pointing a reader at the URL turns one file into thousands of range requests. The manifest and a small sample need no key at all: `https://data.vike.io/archive/manifest.json`, `https://data.vike.io/archive/samples/`.
|
|
35
|
+
|
|
36
|
+
## Reading the files
|
|
37
|
+
|
|
38
|
+
- The L2 tape carries no wallet addresses, only size and time. Prices are probabilities, sizes are shares.
|
|
39
|
+
- On the API tape a `0` in `best_bid`, `best_ask`, `price` or `size` on a row type that does not populate it means absent, not zero; check the schema in the manifest before assuming the same of a Parquet column.
|
|
40
|
+
- Join across files on the outcome token id; `settlements` rows carry `token_ids` and `winning_token_id` for the join to outcomes.
|
|
41
|
+
|
|
42
|
+
## Anti-patterns
|
|
43
|
+
|
|
44
|
+
- Don't promise a download from the CLI, and don't fetch `book_events` days to answer a question the API tape can.
|
|
45
|
+
- Don't redistribute without the attribution above.
|
|
46
|
+
|
|
47
|
+
## Pairs well with
|
|
48
|
+
|
|
49
|
+
- `vike-pm-market-diligence` (ids and one market live), `vike-candles` (probability bars), `vike-polymarket-markets`
|
|
50
|
+
- The Hyperliquid twin: `vike-data hl archive --view url --dataset fills --date 2026-10-16` (daily fills and positions files)
|