Geometric grid
Long-only geometric grid on SOL/USD, ETH/USD and BTC/USD through Jupiter — three bots, one strategy. Capital is split evenly across levels between a lower and an upper bound; each buy fill posts a sell one level up, each sell fill re-posts its buy.
Intent
A grid does not predict anything. It monetises oscillation: as long as price keeps crossing back and forth over a band of levels, each crossing pair harvests the gap between two adjacent levels, minus the cost of two fills. The strategy has no view on where price goes — only on how much it moves and where it stays. The risk is entirely in that second assumption. Outside the range the grid stops working, and it stops working in a way that is easy not to notice.
Model
Level geometry
Levels are spaced geometrically, not arithmetically, so every step is the same percentage rather than the same number of dollars:
which makes the ratio between neighbours a constant, and the step percentage the same at the bottom of the range as at the top:
With grid-sol's live range — , , — that is a 7.1773% step, identical at every level. The whole ladder, at $1.00 a level:
| Level i | Price | Buy notional | Sell target |
|---|---|---|---|
| 0 | $55.00 | $1.00 | $58.95 |
| 1 | $58.95 | $1.00 | $63.18 |
| 2 | $63.18 | $1.00 | $67.71 |
| 3 | $67.71 | $1.00 | $72.57 |
| 4 | $72.57 | $1.00 | $77.78 |
| 5 | $77.78 | $1.00 | $83.36 |
| 6 | $83.36 | $1.00 | $89.35 |
| 7 | $89.35 | $1.00 | $95.76 |
| 8 | $95.76 | $1.00 | $102.63 |
| 9 | $102.63 | $1.00 | $110.00 |
| 10 | $110.00 | — (sell target only) | — |
The other two grids are the same shape over their own ranges: grid-eth between $1,375 and $2,700, a 6.9809% step; grid-btc between $52,500 and $92,500, a 5.8274% step. Each range is that asset's own 90-day low and high widened by the same margins the SOL range uses — the lower bound at 0.911× the low, the upper at 1.119× the high — so the three grids bracket their realised ranges identically instead of each carrying a separately guessed width. The step falls out of the range rather than being chosen, which is why the more volatile asset ends up with the wider step.
Sizing
Capital is split evenly across the steps, so each level buys the same dollar amount and therefore a different quantity:
Ten levels rather than more is a cost decision. At this allocation, twenty-five levels would be $0.40 a level, and the flat per-swap cost — the Solana base fee plus a priority fee — stops being a rounding error against an order that small. $1.00 is the floor the config loader warns below.
Round-trip economics
One round trip is a buy at and the matching sell at , so the gross return on that level's dollar is the step itself, and the cost is two fills:
using the paper cost model's 10 bps fee and 10 bps slippage per fill. The viability condition follows directly, and it is the one thing a grid configuration has to get right:
The shipped SOL range clears it by about eighteen times over, the ETH range by seventeen and the BTC range by fifteen. A tighter range, more levels, or a venue with worse execution narrows that margin, and below the line the grid does not lose slowly — it grinds capital into fees on every oscillation.
Signal rules
- Initialisation, once. On the first bar the strategy ever sees, it posts a buy limit at every level strictly below spot — levels 0 through 9 only; the top price is a sell target and never a buy. It never re-initialises and never re-centres on a new price.
- Buy fill at level i. Post a sell limit for exactly the quantity just bought, at . Inventory is tracked per level, so each parcel is sold at its own target rather than pooled.
- Sell fill at level i. Re-post the buy at . The level is armed again.
- Nothing else. Bars after the first produce no orders at all. Every subsequent order is a reaction to a fill.
Parameters
| Parameter | Live value | Meaning |
|---|---|---|
| lower / upper | 55 / 110 · 1375 / 2700 · 52500 / 92500 | Range bounds (L, U) on SOL, ETH and BTC. Outside them the grid is inert. |
| levels | 10 | Number of geometric steps (N). |
| capital_usd | 10 | Split evenly across levels — $1.00 each. |
| max_order_pct | 25 | Order-size cap: 25% of $10 = $2.50. |
Risk behaviour
- Maximum exposure is the allocation. Every level filled means 10 parcels of $1, which is the whole $10. There is no leverage and no path to owing more than was allocated.
- Order cap $2.50 against a deepest buy worth $2.00. The gap between those two numbers is worth explaining once, because a $1.00 parcel appears to need nothing like a $2.50 cap: the risk gate values an order at the current reference price, not at the limit price it is resting at. A buy waiting at $55 while spot sits at $110 is valued at $2.00 — the level notional times the full width of the range — and that, not the $1.00 the parcel actually costs, is what the cap has to clear. ETH's deepest buy is worth $1.96 on the same arithmetic and BTC's $1.76. The loader rejects a grid whose deepest buy exceeds its cap.
- No stop loss. The grid never sells below the level it bought at. Price leaving the bottom of the range is held, not cut.
- Limits are emulated, not resting. Jupiter has no resting order book, so each limit is held by the runner and converted to a market order on the first bar whose low or high touches it. A bar that gaps straight through several levels converts them at the market price, not at the level price.
- Stale prices and pauses. Bars older than 90 seconds at receipt are withheld entirely. Resting limits sleep through a pause intact and convert on a later touch rather than being cancelled.
- Rejected initialisation. The strategy marks itself started before the ladder is approved, so a gate rejection of the opening batch would leave it permanently empty. The runner clears the started flag on rejection and the ladder is re-placed on the next bar.
Failure modes
Price leaves the bottom. Below every level has filled, the grid is fully invested at an average well above spot, and it has nothing left to do but wait. All the accumulated round-trip profit is smaller than the unrealised loss on the inventory, because that is the shape of the trade: many small wins funding one large open position.
Price leaves the top. Above every parcel has been sold and the grid sits entirely in cash while the market keeps going. Not a loss, but a large opportunity cost, and the grid will not re-engage until price comes back inside the range.
Silent inertness. If spot is below on the first bar the strategy sees, no level qualifies, no buys are posted, and because initialisation happens once and only once the grid never trades again. This is the one grid failure the config loader still cannot catch: checking it needs a price and the loader has none, so an inert bot passes validation cleanly and nothing raises an alarm. A bot showing zero fills looks a lot like a bot waiting patiently. Stated here because it is still not guarded against.
A range is a forecast. Choosing $55–$110, $1,375–$2,700 and $52,500–$92,500 is the strategy's only real judgement call, and it is a forecast wearing the clothes of a parameter. Deriving the three ranges from the same 90-day margins makes them consistent with each other; it does not make them right. Everything above is arithmetic; the range is an opinion, and it is the part most likely to be wrong.