Results
Scoring and ratings.
A match score rewards terminal wealth and charges for carrying inventory through the match. The ladder rating uses placement, not the raw score amount.
Settlement
At the hidden end tick, the engine reveals final values for A, B, and I. Open orders no longer matter. Each position is marked to its settlement value:
terminal wealth = cash + Σ(position[a] × settlement[a])
score = terminal wealth − inventory risk chargeEvery seat starts with zero cash and zero inventory. Cash can be negative; it already includes trade payments, taker fees, maker rebates, and message overage fees. Internally it is stored in centi-units, so one score unit equals 100 centi.
Inventory risk is charged through time
The engine accumulates the squared position in every instrument on every tick:
sum_q2 = Σ_t Σ_a position[a,t]²
risk_centi = round_half_up(sum_q2 / 500)
score_centi = terminal_wealth_centi − risk_centiThe current public parameter manifest stores the coefficient as the integer fraction 1/500 centi per lot squared per tick. That is equivalent to 2 × 10⁻⁵ score units. The engine accumulates sum_q2 exactly and rounds only once when it converts the accumulated value to centi-units.
Example: buy 10 lots of A at 1000 as a taker, hold them for 100 ticks, and settle at 1005. Cash becomes −1,000,500 centi after the 500-centi taker fee; inventory is worth 1,005,000 centi; terminal wealth is 4,500 centi. The risk accumulator is 10² × 100 = 10,000, so risk is 20 centi and final score is 4,480 centi, or 44.80 score units.
The current accrued charge is included in your tick packet. It is not a hidden adjustment added only after the match. Hedging related exposure may reduce economic risk in your model, but the game charge is applied to the squared position in each instrument separately.
Placements
Competitor seats are sorted by score from highest to lowest. House bots are excluded. If two competitors have the same score, the lower processed-message count wins the tie-break. Seats with both the same score and the same message count share a placement.
The replay footer records terminal wealth, risk charge, final score, placement, final positions, fills, fees, rebates, and message count for each seat.
Ratings are placement-based
Each league runs its own OpenSkill ladder using the six-way finishing order. A huge win and a narrow win are both first-place finishes for rating purposes. Raw score still matters inside the match because it determines that order.
New ratings begin at μ = 25 and σ = 25/3. The public leaderboard shows the conservative value μ − 2σ: a strong estimate with high uncertainty ranks below the same estimate backed by more evidence. Repeated results usually reduce uncertainty. Resubmission and inactivity policies for a public season will be stated in that season's terms; the staging ladder does not establish them.
Why the two layers?
Score gives the bot a dense economic objective: make money, control inventory, and avoid waste. Placement gives the ladder a robust multiplayer result. It limits the rating value of rare, enormous payoffs and makes performance comparable across matches with different realized news.
Practical implications
- A profitable position can still be a poor trade if it is held too large for too long.
- Maker rebates help only when the spread and selection risk justify the inventory.
- Messages above the free budget should have enough expected value to cover their fee.
- Because rating uses placement, consistency across seeds matters more than one spectacular replay.