Grid profit measures gains from completed buy and sell cycles. Total grid-bot profit also reflects the current value of unsold inventory and all included costs. A bot can show positive grid profit while losing money overall. Reconcile its ending cash and token holdings against starting capital, deposits and withdrawals before turning that result into a return percentage.
A completed grid cycle tells you that one matched purchase and sale captured a price difference. It says little about the tokens still waiting for their sell orders. Those holdings belong in the same account result, even when the bot displays them in another panel.
Read the number behind the label
For its Spot Grid product, Bybit distinguishes completed grid profits from total profit. Its total-profit calculation values the base-token and quote-token holdings and compares their combined equity with investment. Falling base-token value can outweigh successful grid trades.
OKX's Spot Grid reporting methodology similarly includes open holdings in Total PnL and accounts for top-ups and withdrawals. It describes Grid Profits as an estimate for completed cycles. Its Unpaired PnL is the residual after subtracting Grid Profits from Total PnL, so that label should not automatically be interpreted as a universal, pure unrealized-price figure.
Record the venue's definition, the product and the timestamp. A figure labeled “current” may differ from one labeled “total”: Bybit's Spot Grid FAQ, for example, subtracts cumulative withdrawn grid profit in its Current P&L formula. Comparing labels without their withdrawal treatment can create an apparent mismatch.
The broader distinction between booked results and open exposure is covered in the realized versus unrealized PnL guide. The grid-specific task is to match completed order pairs while retaining launch inventory and unfinished purchases in the ledger.
Follow two winning cycles into a falling market
This entirely hypothetical example uses a fictional UNIT/USDT spot pair. It is an accounting exercise, not market history, a KLINEO result or a venue fee schedule. USDT is the reporting currency; no equivalence with US dollars is assumed.
Start with 2,000 USDT and no UNIT. The simplified grid has levels at 80, 90, 100 and 110 USDT, with two UNIT per order. At launch, buy two UNIT at 100 for a sell order at 110. That upper sell never fills.
Price then travels from 90 to 100 twice, completing two separate buy/sell pairs. Finally, price falls through 90 and 80, filling both buy orders, and ends at a reference price of 70. The lower grid boundary is 80, so this example adds no further buy at 70.
Assume every fill executes exactly as listed. Each trade pays an illustrative 0.1% fee entirely in USDT. There are no partial fills, borrowing costs, rewards, taxes or other assets. Fees are expensed when paid, rather than added to inventory cost.
| Filled event | UNIT bought or sold | Notional in USDT | Fee in USDT | Cash after fill | UNIT held |
|---|---|---|---|---|---|
| Launch buy at 100 | Buy 2 | 200.00 | 0.20 | 1,799.80 | 2 |
| First cycle: buy at 90 | Buy 2 | 180.00 | 0.18 | 1,619.62 | 4 |
| First cycle: sell at 100 | Sell 2 | 200.00 | 0.20 | 1,819.42 | 2 |
| Second cycle: buy at 90 | Buy 2 | 180.00 | 0.18 | 1,639.24 | 4 |
| Second cycle: sell at 100 | Sell 2 | 200.00 | 0.20 | 1,839.04 | 2 |
| Final decline: buy at 90 | Buy 2 | 180.00 | 0.18 | 1,658.86 | 4 |
| Final decline: buy at 80 | Buy 2 | 160.00 | 0.16 | 1,498.70 | 6 |
Each completed cycle earns 2 × (100 − 90) − 0.18 − 0.20 = 19.62 USDT. Together, the two cycles show 39.24 USDT of net grid profit under this worksheet's convention.
The six remaining UNIT still have price exposure. Two came from launch, two from the unmatched buy at 90 and two from the unmatched buy at 80. Counting only completed pairs excludes all six.
This worksheet assigns sales to their matching 90-USDT buys. A different lot-allocation policy can change that breakdown; it cannot change cash or total holdings.
Reconcile the cycles with the whole account
At the final reference price, the remaining inventory is worth 6 × 70 = 420 USDT. Add that to cash:
Ending equity = 1,498.70 + 420 = 1,918.70 USDT
With no external flows yet, the account result is 1,918.70 − 2,000 = −81.30 USDT, or −4.065% of starting capital over this hypothetical interval. That percentage describes the account, including its cash balance.
An independent decomposition reaches the same result. Remaining inventory cost, excluding fees, is 2 × 100 + 2 × 90 + 2 × 80 = 540 USDT. Its unrealized price loss is 420 − 540 = −120 USDT. Fees on those unmatched purchases total 0.20 + 0.18 + 0.16 = 0.54 USDT.
Total result = 39.24 completed-cycle profit − 120 inventory loss − 0.54 remaining purchase fees = −81.30 USDT
The cycle profit already includes its own 0.76 USDT of fees. Subtracting all 1.30 USDT of trading fees from that decomposition would charge the cycle fees twice. Conversely, omitting the 0.54 USDT paid on unsold lots would overstate the result.
The cash check avoids pairing assumptions altogether: total purchases cost 900 USDT before fees, gross sales return 400 USDT and all fees total 1.30 USDT. Therefore, 2,000 − 900 + 400 − 1.30 = 1,498.70 USDT cash. Adding inventory reproduces equity.
This is why continued cycle gains do not prove recovery. When price leaves the lower boundary, inspect the remaining quantity and its valuation using the grid-bot outside-range checklist. A quiet order counter does not freeze inventory value.
Keep deposits and withdrawals out of trading profit
Now add a hypothetical 500 USDT deposit and a 20 USDT withdrawal, with no price movement or new fills between them. Cash becomes 1,978.70 USDT and equity becomes 2,398.70 USDT.
Ending equity exceeds the original 2,000 USDT by 398.70 USDT. Calling that trading profit would count contributed money as a gain. For the chosen bot-account boundary, use:
Cash-adjusted PnL = ending equity − starting equity − external deposits + external withdrawals
Here, 2,398.70 − 2,000 − 500 + 20 = −81.30 USDT. The loss is unchanged. Withdrawing money already earned also does not create a second profit; it moves value outside the measurement boundary.
A transfer from another account you own is external to this bot if the other account is excluded. It becomes internal when both accounts are consolidated. For tokens contributed in kind, preserve their quantity, transfer time and reporting-currency value under the same valuation policy.
This equation measures currency PnL. A percentage return with contributions during the run needs a timing convention and appropriate valuations. The time-weighted versus money-weighted return guide explains which question each measure answers. Neither dividing raw equity growth by the original deposit nor annualizing the cycle counter fixes missing cash-flow records.
A valuation is not a closing receipt
The 70 USDT reference is a valuation assumption. It does not establish the fill price for selling six UNIT. If a hypothetical exit instead fills at 69.80, gross proceeds are 418.80 USDT. At the same assumed fee rate, the exit fee is 0.4188 USDT.
After the external flows above, final cash would be 1,978.70 + 418.80 − 0.4188 = 2,397.0812 USDT. Cash-adjusted PnL becomes −82.9188 USDT, or approximately −82.92 USDT. The extra 1.6188 USDT loss consists of the 1.20 USDT price gap and the 0.4188 USDT exit fee.
Conversion treatment also matters in an actual product. Bybit's Spot Grid settlement explanation states that converting the returned assets into one token uses a market conversion and incurs the corresponding spot fee. Record the actual settlement choice and receipt rather than treating a preceding screen as a guaranteed payout.
If the bot returns both tokens and cash, the token exposure continues in the receiving account. A consolidated valuation must keep those tokens until they are sold or otherwise leave its boundary.
Build a reusable grid reconciliation worksheet
Export fills and account movements for one bot and one interval. Use a common end timestamp for every balance and price. Include tokens and cash reserved for open orders; reserved assets are still holdings, so do not add an order's notional as another asset.
| Record | What to preserve | Reconciliation purpose |
|---|---|---|
| Measurement boundary | Bot ID, included accounts, start/end times, currency | Establish which transfers are external |
| Opening assets | Cash, token quantity and value before launch trades | Keep initial inventory purchases and fees visible |
| Each executed fill | Fill ID, order ID, side, price, quantity, fee amount and currency | Rebuild cash and token balances without counting submissions as trades |
| Cycle matches | Which buy quantity is assigned to each sold quantity | Separate completed pairs from unsold lots |
| External movements | Signed deposits, withdrawals and in-kind values | Remove funding changes from trading PnL |
| Ending assets | Total cash, total tokens, valuation price and timestamp | Calculate equity independently of the grid counter |
| Additional costs | Platform charges and other attributable debits | Explain costs outside paired-trade profit |
Real fees need not follow this example's USDT-only assumption. The OKX methodology illustrates base-currency buy fees and quote-currency sell fees, including residual token amounts caused by rounding. Reconcile actual net token quantities before matching cycles. A tiny unsold balance belongs in inventory even if it cannot meet the minimum trade size.
Check any subscription or operating costs against the trading-bot total-cost worksheet. If a cost was paid outside the bot account, it may require an explicit adjustment to an all-in strategy result. Label the scope so readers can distinguish the bot ledger from the wider operating result.
Finish by comparing three independently built numbers: the provider's total figure, cash plus valued holdings adjusted for flows, and matched-cycle profit plus the remaining inventory result and unallocated costs. Investigate differences through fee currency, unmatched quantities, transfers and valuation time. Keep the completed-cycle figure beside the whole-account result: in this example, +39.24 USDT and −81.30 USDT describe different parts of the same ledger.
