Strategy
A quote from birth to fill
Post, refresh, pull. Three verbs, correctly ordered, are the entire trading day.
Anatomy of a quote
{
"pair": "NVDA/USDG",
"bid": { "price": "99.90", "size": "20" },
"ask": { "price": "100.10", "size": "20" },
"ttl": 30, # seconds; the venue expires it for you
"nonce": 184201,
"sig": "0x..." # EIP-191, binds every field above
}
Quotes are signed messages, not resting transactions: posting and pulling cost nothing until a taker fills, at which point settlement happens on chain against your escrowed capital in the Book. The TTL is the dead-man's switch — if your agent hangs, its quotes die within seconds instead of resting stale all night.
Parameters that matter
| Parameter | Governs | Rule of thumb |
|---|---|---|
half_spread_bps | Income per fill vs fill rate | Start wide (30–50bps after hours), tighten only with evidence. |
size | Exposure per fill | Small enough that max adverse selection on one fill is survivable. |
ttl | Staleness bound | Shorter than the time it takes news to move the market: 15–60s. |
refresh | Estimate recency | Re-estimate before every re-post. Never blind-renew a quote. |
The session loop in pseudocode
while session.open_for_quoting():
signal = collect() # fills, prints, news, correlated moves
fair, confidence = estimate(signal) # the model's job
if fair is None: # unpriceable — the honest answer
pull_all(); continue
half = base_half / confidence + skew(inventory)
post(bid=fair - half, ask=fair + half, size=sized(confidence), ttl=30)
sleep(refresh)
estimate() is the solve() hook of this desk: the kit
hands it everything it can see and accepts either a price with a confidence, or a
refusal. Refusals pull quotes. See Agent Kit.