Exchange rules
Orders and matching.
Each instrument has its own continuous limit order book. Matching uses price-time priority with deterministic FIFO queues at every price.
The tick loop
Messages produced while a bot handles tick t are eligible for processing on the next tick unless compute overrun adds more delay. At each tick, the engine uses the match seed to permute competitor seats once, then processes each seat's ready messages in FIFO order. This prevents a fixed seat or process order from winning every same-tick race while preserving the message order chosen by each bot.
The engine then validates and processes those messages one at a time, advances news and signals, and sends each seat its next private packet. Official FAST and STANDARD matches are not coupled to wall-clock time.
New orders
A NEW_ORDER specifies a client ID, instrument, side, integer limit price, quantity, and time in force. Quantity must be between 1 and 50 lots, and price must be between 1 and 100,000 inclusive. These values come from the current public parameter manifest.
- GTC — good until cancelled. It trades immediately where marketable, then leaves any remainder resting on the book.
- IOC — immediate or cancel. It trades immediately where marketable and cancels any unfilled remainder.
There is no separate market-order message. To trade immediately, send a marketable IOC with a limit price that crosses the current book.
Price-time priority
A buy order can trade against asks at or below its limit. A sell order can trade against bids at or above its limit. The best price trades first; at the same price, the oldest resting order trades first. A large incoming order can fill across several resting orders and price levels.
The execution price is the resting order's price. Partial fills leave the remaining GTC quantity in its original queue position.
Cancels and acknowledgements
CANCEL removes one of your resting orders by engine order ID. CANCEL_ALL clears your orders in one instrument or across all instruments. Every message carries a bot-chosen client_id, and acknowledgements or rejects echo it.
Client IDs are correlation values, not durable order identifiers. They need not be unique. Store the engine's acknowledged order_id and use that when an exact cancel matters.
Position checks
The hard net-position limit is 100 lots per instrument. A buy is accepted only when current position + resting buy quantity + new quantity ≤ 100. A sell is accepted only when −current position + resting sell quantity + new quantity ≤ 100. Exposure is checked independently per instrument; opposite-side resting orders do not offset the worst case because they may never fill.
For example, a seat long 70 lots with 20 resting buys may submit at most 10 more buy lots. Keeping a strategy target below 100 leaves room for fills and messages already in flight.
If an incoming order would trade against the same seat's resting order, the resting order is cancelled and matching continues. A seat never fills against itself.
Fees and rebates
| Event | Cash adjustment per lot |
|---|---|
| Aggressive/taker fill | −0.50 score units |
| Resting/maker fill | +0.20 score units |
| First 500 processed messages | Free |
| Each processed message after 500 | −0.05 score units |
Fees are applied to cash using integer centi-units. An order that generates several fills pays or earns the per-lot amount on the quantity filled.
Message rate
The public rate limit is 10 messages per tick with a burst capacity of 30. Each seat has its own FIFO queue. At a tick, the engine seed-permutes the seat-processing order, refills each seat's tokens, and processes that seat's ready messages from the front until its tokens are exhausted. The remainder stays in the same order for a later tick.
Every processed message counts—including one that is rejected during validation. It increments the placement tie-break count and, after the first 500 processed messages, incurs the message fee. Quote churn therefore has three costs: delayed actions, possible overage fees, and a higher message count.
The anonymous book and attributed tape
Book updates show price levels and aggregate quantity, not the owners of resting orders. Trade prints disclose the instrument, price, quantity, aggressor side, aggressor pseudonym, and resting pseudonym. Pseudonyms remain stable for one match only.
This split lets a passive order rest without advertising its owner. Once it trades, both participants become part of the public tape. See the blog post Why the tape is attributed for the design reasoning.