Hyperliquid leaderboard: the top traders, and how they trade
Hyperliquid's top traders ranked by PnL, ROI, win rate, volume, drawdown, Calmar or profit factor over a day, a week, a month or all time, each with its size and PnL cohort, and a ranking that keeps trading PnL apart from deposits. Over MCP, the leaderboard API and the CLI, on one free key.
“Who are the top 10 Hyperliquid traders by PnL this month, and what are their win rates?”
hl_leaderboard“Which Hyperliquid traders made the most this week with at least 20 trades?”
hl_perp_top_traders“Who are the top Hyperliquid perp traders this week, and what are they long?”
hl_perp_top_traders hl_walletThe Hyperliquid leaderboard now
The top 10 by realized PnL over the last 30 days, the route's defaults, with their cohorts, win and loss counts and account value. Change the window, the ranking or the page size below.
Leaderboard · /leaderboard
/v1/hyperliquid/leaderboard?limit=10The leaderboard API: rank traders on any metric
Two rankings of the same traders and one that strips deposits out, each over a day, a week, a month or all time.
Traders & leaderboard
Trader rankings by PnL, ROI, win rate, volume and risk metrics over a window, with cohort filters.
- Routes
/v1/hyperliquid/traders,/v1/hyperliquid/leaderboard- Built on
- Fills
- MCP
hl_perp_top_traders
Load it
/v1/hyperliquid/leaderboard?window={window}&sort={sort}&limit={limit}GET /v1/hyperliquid/leaderboard · Traders ranked on any of 20 metrics, with the full risk set
- CLI
vike-data hl leaderboard- MCP
hl_leaderboard· 1 credit- Cost
- 1 request of the hourly limit
Trader leaderboard carrying the full risk-metric set.
Drawdown, Calmar, recovery factor, profit factor, expectancy and streaks sit beside PnL: a wallet up 300% through a 70% drawdown is not the same find as one up 300% without, and a PnL-only board cannot tell them apart.
calmar_ratio and recovery_factor divide by CURRENT account value, so they are null under $1 of it, and sort=calmar, recovery_factor or roi skips those wallets (an emptied account used to lead with a ratio in the billions). profit_factor is capped at 999: 999 means no losing trade closed, or only a negligible one, not a measured ratio.
Parameters
| Parameter | In | Description |
|---|---|---|
window | query | 1d | 7d | 30d | all. Default 30d. The trades CLOSED in the current UTC day and the 1, 7, 30 or 365 days before it, so PnL, trade counts, win rates and tags are what was realized in the window |
sort | query | One of pnl, realized_pnl, roi, volume, trades, win_rate, long_win_rate, short_win_rate, account_value, profit_factor, expectancy, calmar, recovery_factor, max_drawdown, current_drawdown, avg_leverage, avg_duration, fees, win_streak, loss_streak. Default pnl. An unknown key is a 400, not a default |
order | query | asc | desc. Default desc |
cohort | query | One label on axis |
axis | query | size | pnl | pnl_abs. Default size |
min_trades | query | Minimum closed trades in the window. Default 3, the floor /traders applies; pass 0 for no floor |
min_win_rate | query | Minimum win rate |
min_volume | query | Minimum total volume |
limit | query | Default 25, max 500 |
cursor | query | Keyset cursor |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/leaderboard?window=7d&limit=25"
import os, requests
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=7d&limit=25",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data hl leaderboard --window 7d --limit 25
# any MCP client; or from the terminal:
vike-data call hl_leaderboard --args '{"window": "7d", "limit": 25}'
GET /v1/hyperliquid/traders · The top traders by PnL, ROI, win rate or volume
- CLI
vike-data perp top-traders- MCP
hl_perp_top_traders· 2 credits- Cost
- 1 request of the hourly limit
Top HL perp traders by the requested metric over the window.
Kept on the tool implementation rather than moved to the new engine: MCP and the AI chat call the same code, and a second ranking that disagreed with the one the assistant quotes would be worse than a near-duplicate route. /leaderboard is the richer, cursor-paged version.
Parameters
| Parameter | In | Description |
|---|---|---|
window | query | 1d | 7d | 30d | all. Effective default 30d |
sort | query | pnl | roi | win_rate | volume | trade_count | drawdown | account_value | long_pnl | short_pnl. Default pnl |
order | query | asc | desc. Default desc |
min_trades | query | Minimum closed trades. Floored at 3: omitting it or passing 0, 1 or 2 gives 3 |
min_win_rate | query | Percent, 0–100, not a fraction |
min_volume | query | Minimum total volume |
size | query | Number of traders, 1–100 |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/traders?window=7d&size=10"
import os, requests
r = requests.get(
"https://data.vike.io/v1/hyperliquid/traders?window=7d&size=10",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data perp top-traders --window 7d --size 10
# any MCP client; or from the terminal:
vike-data call hl_perp_top_traders --args '{"window": "7d", "size": 10}'
Trading PnL only: deposits and withdrawals kept apart
Ranked on the PnL of the fills themselves, with each wallet's deposits and withdrawals in the window reported beside it, so you see what was left out.
Ranked on fills-derived PnL, the flows beside it
- Route
GET /v1/hyperliquid/leaderboard/flow-adjusted- CLI
vike-data hl leaderboard- MCP
hl_leaderboard· 1 credit- Cost
- 1 request of the hourly limit
Leaderboard ranked on trading PnL, with external flow reported beside it.
An account-value delta is not a trading result: a wallet that deposits $1M and loses $50k reads as +$950k on any equity-delta ranking. This ranks on fills-derived realized PnL, which excludes deposits by construction, and returns the deposits, withdrawals and the daily attribution figures in the same row so a caller can see what was excluded rather than trust that something was.
Each row carries flow_unbalanced. It is true when the wallet had a send in the window, which is when the *attributed* block beside the rank is unreliable — ledger_events records send one-sided, so an outflow is seen while the matching inflow is not. The rank itself does not depend on attribution and is unaffected. The flag is reported, never used to filter: active traders move money constantly, and excluding them would empty the board rather than clean it.
Parameters
| Parameter | In | Description |
|---|---|---|
window | query | 1d | 7d | 30d | all. Default 30d. The trades CLOSED in the current UTC day and the 1, 7, 30 or 365 days before it, so PnL, trade counts, win rates and tags are what was realized in the window |
limit | query | Default 25, max 500 |
cursor | query | Keyset cursor |
min_trades | query | Minimum closed trades in the window. Default 3; 0 keeps any wallet with at least one |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/leaderboard/flow-adjusted?window=30d&limit=25"
import os, requests
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard/flow-adjusted?window=30d&limit=25",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]},
)
print(r.json())
vike-data hl leaderboard --view flow_adjusted --window 30d --limit 25
# any MCP client; or from the terminal:
vike-data call hl_leaderboard --args '{"view": "flow_adjusted", "window": "30d", "limit": 25}'
Every ranking, every window
| Route | sort | window | Notes |
|---|---|---|---|
/v1/hyperliquid/leaderboard | pnl realized_pnl roi volume trades win_rate long_win_rate short_win_rate account_value profit_factor expectancy calmar recovery_factor max_drawdown current_drawdown avg_leverage avg_duration fees win_streak loss_streak | 1d 7d 30d all | A wallet needs 3 closed trades in the window unless min_trades says otherwise; win_rate is a fraction from 0 to 1; up to 500 rows a page, with a cursor; cohort keeps one size or PnL cohort. |
/v1/hyperliquid/traders | pnl roi win_rate volume trade_count drawdown account_value long_pnl short_pnl | 1d 7d 30d all | The AI chat's ranking: win rate in percent (0-100), one page of up to 100. |
Window: 1d, 7d, 30d or all. The trades CLOSED in the current UTC day and the 1, 7, 30 or 365 days before it: PnL, trade counts, win rates and tags are what was realized in it.
Ask your AI for the top traders
Two MCP tools answer it in Claude, ChatGPT or Cursor; the same calls run from the CLI.
hl_leaderboard
“Who are the 10 most consistent Hyperliquid traders this month, by Calmar ratio, with at least 20 closed trades?”
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hl_leaderboard",
"arguments": {
"window": "30d",
"sort": "calmar",
"min_trades": 20,
"limit": 10
}
}
}
vike-data hl leaderboard --window 30d --sort calmar --min-trades 20 --limit 10
hl_perp_top_traders
“Who are the top Hyperliquid perp traders this week, and what are they long?”
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hl_perp_top_traders",
"arguments": {
"window": "7d"
}
}
}
vike-data perp top-traders --window 7d
Connect Claude, ChatGPT or Cursor in a minute, and every Hyperliquid tool: AI & API →
The leaderboard on vike.io, no key
Questions about the top traders, answered with code
Each with the sentence to ask your AI instead. Every block was run against the live API on 2026-11-03.
Top Hyperliquid traders by PnL, ROI and win rate (7d / 30d)
Rank Hyperliquid traders by 30-day realized PnL, then pull the best one's trade statistics.
- Uses
/traders,/wallets/{…}/trades/summary- Verified
- live API, 2026-11-03: 2 calls, all 200
The code
"""Rank Hyperliquid traders by 30-day realized PnL, then look inside the best one's record.
Run: VIKE_API_KEY=... python hl-top-traders.py (--dry-run lists the requests and makes none)
"""
import os
import sys
from urllib.parse import urlencode
NAME = "hl-top-traders"
BASE = "https://data.vike.io"
DRY = "--dry-run" in sys.argv
def fail(why):
sys.exit(f"{NAME}: {why}")
def call(path, method="GET", **params):
url = BASE + path + ("?" + urlencode(params) if params else "")
if DRY:
print(method, url)
return None
key = os.environ.get("VIKE_API_KEY") or fail("set VIKE_API_KEY")
import requests
r = requests.request(method, url, headers={"X-API-Key": key}, timeout=60)
if r.status_code != 200:
fail(f"{method} {path} answered HTTP {r.status_code}: {r.text[:200]}")
return r.json()
def main():
# /traders returns one page of up to 100 and has no cursor; three is plenty here.
board = call("/v1/hyperliquid/traders", window="30d", sort="pnl", size=3)
wallet = "0x25773676902085225ae5751075e4161369334897" # --dry-run has no response to read
if not DRY:
if not board["traders"]:
fail("/traders returned no traders")
for t in board["traders"]:
print(f"{t['address']} pnl ${t['total_realized_pnl']:,.0f} win rate {t['win_rate_pct']}% trades {t['trade_count']}")
wallet = board["traders"][0]["address"]
summary = call(f"/v1/hyperliquid/wallets/{wallet}/trades/summary", window="30d")
if DRY:
return
o = summary["overall"]
if not o["trade_count"]:
fail(f"{wallet} has no trades in the window")
# One outsized trade drags a mean far from the typical trade, so read the median beside it.
print(f"{wallet}: {o['trade_count']} trades, net ${o['net_pnl']:,.0f}")
print(f" gain mean ${o['avg_gain']:,.2f} median ${o['median_gain']:,.2f}")
print(f" loss mean ${o['avg_loss']:,.2f} median ${o['median_loss']:,.2f}")
if __name__ == "__main__":
try:
main()
except Exception as e: # a shape the example does not expect fails by name, not by traceback
fail(f"{type(e).__name__}: {e}")
Find high win-rate Hyperliquid traders with at least 30 closed trades
Call /leaderboard with min_trades=30 and min_win_rate=0.6 (a fraction), sorted by PnL, to list wallets that won at least 60% of 30 or more trades closed in the window.
- Uses
/leaderboard,/traders- Verified
- live API, 2026-11-03: 4 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# wallets with 30+ closed trades and a 60%+ win rate over 30 days, biggest PnL first
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=30d&min_trades=30&min_win_rate=0.6&sort=pnl&limit=5",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the same filter ranked by win rate
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=30d&min_trades=30&min_win_rate=0.6&sort=win_rate&limit=5",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# 60%+ win rate, 30+ trades and at least $10M of volume over 30 days
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=30d&min_trades=30&min_win_rate=0.6&min_volume=10000000&sort=win_rate&limit=25",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the /traders form: 60 means 60% here
r = requests.get(
"https://data.vike.io/v1/hyperliquid/traders?window=30d&sort=win_rate&min_trades=30&min_win_rate=60&size=20",
headers={"X-API-Key": API_KEY},
)
Are today's top Hyperliquid earners consistent over the week and the month?
Take the window=1d leaderboard, then read each wallet's 7d and 30d metrics from /wallets/{address}; a consistent earner is near the top in all three windows, with a sample that grows with the window.
- Uses
/leaderboard,/wallets/{…}- Verified
- live API, 2026-11-03: 4 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# today's top earners by realized PnL
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=1d&limit=5",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the number one wallet's metrics over 30 days
r = requests.get(
"https://data.vike.io/v1/hyperliquid/wallets/0xfc667adba8d4837586078f4fdcdc29804337ca06?window=30d",
headers={"X-API-Key": API_KEY},
)
# then: jq '{window, metrics_updated_at, metrics}'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the same wallet over 7 days
r = requests.get(
"https://data.vike.io/v1/hyperliquid/wallets/0xfc667adba8d4837586078f4fdcdc29804337ca06?window=7d",
headers={"X-API-Key": API_KEY},
)
# then: jq '.metrics | {total_realized_pnl, trade_count, win_rate, profit_factor, max_drawdown_pct}'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the 30-day board, wallet, rank and PnL only
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=30d&limit=500",
headers={"X-API-Key": API_KEY},
)
# then: jq '.traders | map({wallet, rank, total_realized_pnl, trade_count})'
Rank Hyperliquid traders by Calmar or profit factor with a real sample
Sort /leaderboard by calmar or profit_factor with min_trades=50, inside one account-size tier, so emptied accounts and one-trade wallets cannot take the top.
- Uses
/leaderboard- Verified
- live API, 2026-11-03: 4 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# best Calmar ratio over 365 days among $1M-$2.5M accounts with 50+ closed trades
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=all&sort=calmar&min_trades=50&axis=size&cohort=whale&limit=5",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# highest profit factor among $1M-$2.5M accounts with 50+ closed trades
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=all&sort=profit_factor&min_trades=50&axis=size&cohort=whale&limit=25",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# best Calmar among accounts over $10M with 50+ closed trades
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=all&sort=calmar&min_trades=50&axis=size&cohort=4x_whale&limit=25",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the unfiltered Calmar board, led by near-empty accounts
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=all&sort=calmar&min_trades=50&limit=5",
headers={"X-API-Key": API_KEY},
)
Hot newcomers: huge ROI on few trades, and why not to follow them
Sort the leaderboard by expectancy (PnL per closed trade) with a one-trade floor to surface wallets that made a fortune on a handful of trades, then read their whole record from /trades/summary.
- Uses
/leaderboard,/wallets/{…}/trades/summary- Verified
- live API, 2026-11-03: 4 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the biggest PnL per closed trade over 7 days, wallets with as little as one trade
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=7d&sort=expectancy&min_trades=1&limit=5",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# how many trades the number one wallet has ever closed, and when it started
r = requests.get(
"https://data.vike.io/v1/hyperliquid/wallets/0x615a2071e01b28093e65d81be32cea6e173d69d5/trades/summary?window=all",
headers={"X-API-Key": API_KEY},
)
# then: jq '.overall | {trade_count, closed_trade_count, fill_count, net_pnl, max_trade_size_usd, median_duration, first_trade_ts, last_close_ts}'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the ROI board, dominated by near-zero accounts
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=30d&sort=roi&min_trades=0&limit=5",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# biggest PnL per trade among wallets with 30+ closed trades in 7 days
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=7d&sort=expectancy&min_trades=30&limit=25",
headers={"X-API-Key": API_KEY},
)
Are today's top Hyperliquid winners skilled or lucky? (flow-adjusted leaderboard)
The flow-adjusted leaderboard ranks on realized trading PnL and returns the sample size, the lifetime record and the deposit flows beside it, which is what separates a skilled run from one lucky trade.
- Uses
/leaderboard/flow-adjusted- Verified
- live API, 2026-11-03: 4 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# today's top earners from trading, with flows and the full risk set beside each
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard/flow-adjusted?window=1d&limit=3",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the 30-day board, ranked the same way
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard/flow-adjusted?window=30d&limit=25",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# today's board without lifetime losers and without unreliable flow attribution
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard/flow-adjusted?window=1d&limit=100",
headers={"X-API-Key": API_KEY},
)
# then: jq '.traders[] | select(.cum_realized_pnl > 0 and (.flow_unbalanced | not)) | {wallet, rank, total_realized_pnl, trade_count, profit_factor, cum_realized_pnl, pnl_cohort}'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# today's board, wallets with at least 20 closed trades
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard/flow-adjusted?window=1d&min_trades=20&limit=25",
headers={"X-API-Key": API_KEY},
)
What do Hyperliquid's worst-performing wallets do differently: leverage, hold time, losing streaks?
Filter /leaderboard to the 3x rekt cohort (bottom 5% by lifetime realized PnL) for hold time and losing streaks, compare it with 3x smart, and read leverage from their open positions, because the leaderboard's avg_leverage is only the leverage of positions open at the last refresh.
- Uses
/leaderboard,/positions- Verified
- live API, 2026-11-03: 4 calls, all 200
The code
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the bottom-5% cohort's longest losing streaks over 30 days, wallets with 30+ closed trades
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=30d&axis=pnl&cohort=3x_rekt&sort=loss_streak&min_trades=30&limit=5",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the top-1% cohort's longest losing streaks, same window and floor
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=30d&axis=pnl&cohort=3x_smart&sort=loss_streak&min_trades=30&limit=5",
headers={"X-API-Key": API_KEY},
)
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# median hold time, losing streak and win rate over one 500-row page of the bottom cohort
r = requests.get(
"https://data.vike.io/v1/hyperliquid/leaderboard?window=30d&axis=pnl&cohort=3x_rekt&min_trades=30&limit=500",
headers={"X-API-Key": API_KEY},
)
# then: jq '.traders | {n: length, median_hold_s: (map(.avg_duration_seconds) | sort | .[length/2|floor]), median_loss_streak: (map(.max_loss_streak) | sort | .[length/2|floor]), median_win_rate: (map(.win_rate) | sort | .[length/2|floor])}'
import os
import requests
API_KEY = os.environ["VIKE_API_KEY"] # your key, read from the environment
# the bottom cohort's 25 biggest open BTC positions
r = requests.get(
"https://data.vike.io/v1/hyperliquid/positions?symbol=BTC&axis=pnl&cohort=3x_rekt&sort=size&limit=25",
headers={"X-API-Key": API_KEY},
)
Hyperliquid leaderboard FAQ
Is there a Hyperliquid leaderboard API?
/v1/hyperliquid/leaderboard ranks traders on any of 20 metrics over 1d, 7d, 30d, all, up to 500 a page with a cursor, and /v1/hyperliquid/traders returns a top 100 in one call. One free key, 20,000 requests an hour, over MCP and the CLI too.How are Hyperliquid traders ranked?
sort (pnl, realized_pnl, roi, volume, trades, win_rate, ...) and the window with window; a wallet needs 3 closed trades in the window unless min_trades says otherwise, and cohort keeps one size or PnL cohort.Does the leaderboard count deposits as profit?
/v1/hyperliquid/leaderboard/flow-adjusted also returns each wallet's deposits and withdrawals beside its PnL, with flow_unbalanced on a row whose attribution is unreliable.What is the difference between /traders and /leaderboard?
/traders is the ranking the AI chat quotes: one page of up to 100, win rate in percent (0-100). /leaderboard carries the full risk set (drawdown, Calmar, profit factor, streaks), pages with a cursor up to 500 rows, and its win_rate is a fraction from 0 to 1.