Realized vs. unrealized PnL on Hyperliquid
What closedPnl measures
Every closing fill on Hyperliquid carries a closedPnl field: the gain or loss
crystallized by that specific (partial) close, computed by the exchange itself from your
average entry. Open-long more? The opening fill carries closedPnl: 0. Close
30% of a position? That fill carries the realized PnL for those 30%. Liquidated? The
forced close is still a close — it carries the realized loss.
This is the number that generally matters for reporting under capital-style frameworks: unrealized PnL on an open position is not a reportable event until it closes. Your mark-to-market number can swing wildly through the year; only closes create the per-event records a filing is built from.
Why generic tools get it wrong
Spot-first importers reconstruct PnL by pairing entry and exit rows. Perps break that pattern in three places: partial closes that pair against an average entry rather than a specific row; position netting where long and short legs offset; and liquidations that look like ordinary fills with a special flag. Reconstructed totals drift from exchange-reported ones — the drift traders report most often is a PnL figure that is off by exactly the funding or by the last partial close.
The robust alternative is to read the exchange's own closedPnl instead of
re-deriving it. That is what the scanner does: it sums
exchange-computed realized PnL per year and market, so the total matches what Hyperliquid
itself reports for your address.
Realized PnL is a fact — its treatment is not
What counts as taxable, when, and at what rate depends on jurisdiction and classification. The tool's job is to preserve the facts (per-close PnL, dates, fees, liquidation flags); your professional's job is the treatment. See the full filing walkthrough for where these numbers land on a return.
Check your realized PnL totals in 30 seconds
Exchange-reported closedPnl, grouped by year and market — free and read-only.
Scan my wallet