Match odds browser

both players' odds over every monitored match bet entries ▲ / exits ▼ local-first
select a match
Window levels dateline: click line = one shift+click = all empty = clear tap a line = read it tap empty space = clear drag sideways = pan
Odds — both players view scale gap cut flat cut
Position P&L P&L src
Ladder fit — what the tape offered, and where our bids and asks sat inside it
orders split by sort colour spans
Tradeable range per match, with our orders on it
How far the tape went past us, or fell short
Cheap favourites: were they actually cheap, and when do winners bottom out?
show reading updates with the data
Win rate vs the lowest price a favourite fell to?
When do winners hit their low? (time-to-low × depth)?
select a match
What this is. Every match the bot monitored — bet AND watched-only — charted from its ~25 s tick ledger. On the bot's machine (directly or via loopback) you see full data; the public view is a sanitized bundle: stakes, order ids and P&L never leave the local machine.
The order of this page. It answers the questions in the order they are actually asked. 1 The verdict — what the position made, in dollars and percent, the outcome in one word, and how much of the ceiling came back. 2 The moneySpent | Sold | Profit | Pending on one line, with WHEN under it. 3 The charts. 4 Near misses & exit quality — what almost happened. 5 The results table — every action, with the money. 6 Everything else, folded away: match info, the live test, execution latency and these notes. On a phone that is a strict top-to-bottom order with the lower sections behind tap-to-open headers; on a wide screen 4 and 5 sit side by side.
The verdict band. The coloured headline at the top is the page's answer: final P&L in dollars and percent (percent of everything staked), the outcome word — WON / LOST is what the MARKET decided about the pick, never the trade, because the scalp can bank money on a match the pick eventually lost — and % of max captured, the final P&L as a share of what the position could ever have shown if every share had been held to a winning $1.00 settlement. The bar under that figure is the same number as a shape. Every one of them is read off the same accounting block the results table prints.
The money line. Spent: X | Sold: Y | Profit: Z | Pending: N — four slots, one line, and it is the header of the accounting section as well as part of the headline band. Spent = every dollar that went in across the filled buys. Sold = every dollar the sells brought back. Profit = Sold − Spent + whatever is still held at its settlement (or last) value. Pending = the shares still riding, with what they are worth; zero means the position is fully out. The sub-line under it is WHEN: first buy, last exit, and how long the whole thing took. The public view prints the same four slots in percent and price terms only.
Ranks beside the names. Every place a player or team is named — the match list, the head title, the legend pills, the chart's end-of-line labels and the click readout — prints that side's world rank right after the name (Diana Martynov 461 vs Federica Urgesi 356), in a smaller muted figure so the names stay scannable. It is the rank the board recorded for the match when it was picked up. Unranked players simply have no number — low-tier ITF draws are full of them, and an empty rank is never printed as a blank badge. Ranks are public roster data, so the sanitized public bundles carry them too.
Opponent line. Newer ledgers record the opponent's real book odds (opp_dec). Older files don't — there the line is derived as 1/(1−fav price) and drawn dashed.
TP fav vs MKT fav. Each line is labelled at its right end with the player and their role. TP fav = the algorithm's pick (the side the bot bets). MKT fav = the side the market priced above 50¢ pre-game (median implied price of the ticks before game start). They are often not the same — the bot frequently backs the market underdog; when they are the same that line reads TP+MKT fav and the other reads underdog.
BET and WON tags. BET = the side pmtrade actually placed money on (only when a fill exists — an armed ladder that never filled is not a bet; the bot only ever buys its own pick). WON = the decided match's winner, by authority: (1) the recorded resolution pmtrade stores per match (market resolution cross-checked against the winner-only on-chain redeem) — a recorded void/unresolved means no winner tag at all; (2) the bot's own settled won/lost ledger result; (3) only if neither exists, inference from the tape (game start past and the price pinned at a settlement print — 0¢ or 100¢, not a merely near-certain 98¢ — for at least a minute, cross-checked against the opponent's quote). Inference is last because a fallback price feed can invert a tail. Hover a label to see which of the three decided it. A stop-loss or early close says nothing about who won — undecided matches get no WON tag rather than a guess.
Markers — two families. Hollow △/▽ = RULE TARGET (the tick where the rung threshold / exit rule first triggered, inside the shaded legal entry window). Solid ▲/▼ = ACTUAL execution (confirmed fill / close). ✕ = attempt that failed (unfilled / buy-pending / void). The dashed amber connector + "+Ns" label between a target and its execution is the LATENCY GAP. Rungs are labeled R0/R1/R2 in ladder order. Watched matches show would-have-entered targets from that match's armed ladder; no ladder was ever armed → no targets invented.
What each trade flag says. A buy flag prints what it spent — the dollars on the bot's machine, the same buy's share of everything staked in the public view. A sell flag prints what fraction of the inventory it sold (its shares over every share the position ever bought), then its profit in dollars and percent, coloured green or red. Locally the share count rides along too. Every one of those figures is read straight off the results table's own row — the markers, the table and the Telegram accounting are three renderings of one calculation, so they cannot disagree.
Sell tiers 1-2, and why numbers can look skipped. The sell ladder fires lowest tier first, one per cycle. A tranche worth less than the exchange's minimum order size cannot rest on its own, so its fraction rolls forward into the next tier that does clear the minimum, and the resulting sell is tagged with the highest tier it discharged. On a small book that legitimately leaves gaps — a 3.79-share position sells tiers 1+2 together, then 3+4 together. Nothing is missing and nothing is unrecorded: the flag, the table's words and the notes column all print the whole run (S·t1-2, “tiers 1-2 together”), 1-based everywhere, so a coalesced sell can never read as a lost trade.
Buy & sell zones — where the orders actually were. Both charts shade the sell zone (at or above the cheapest ask that was standing) and the buy zone (at or below the dearest bid), over exactly the ticks those orders were live for, with one labelled line per level: sell1 53¢ 1.89xprice per share AND odds, always both. sell1 is the cheapest exit that ever stood, i.e. the price the tape had to reach first; buy1 is rung 1 — the first LIVE rung, and the first thing that could actually be bought. The pregame anchor is not in this numbering at all: it is a reference line with its own style, never an order. A filled level is solid with a , a cancelled one dashed and faint with a , a level replaced by a re-quote in the same slot ends there with a — nothing lingers on screen as if it were still live. If the tape never enters the sell zone, nothing could have sold, and that now reads at a glance instead of being a forensics exercise.
Where the level prices come from. The bot's own wire log (state/logs): every RESTING BUY/SELL placed / first stood / cancelled / FILLED line, joined by order id. Nothing is derived from a schedule — a price is drawn only because the log says that exact order existed, and a level whose end was never logged is marked standing rather than guessed. It matters because the position record cannot answer this: after the per-rung cutover a live position's tier vector is empty, and the standing-order records are deleted the moment each order is cancelled, so on a finished match the log is the only surviving copy. A match whose log lines have rotated away simply shows no levels.
Where we were WAITING — the armed ladder. A match the bot never traded places no order, so there would be nothing to draw on exactly the match where the only question is “where were we waiting, and how close did the tape get?”. The finely-dotted rungs (b1 28.7¢ 3.48x waiting) are the ladder the COMPOSER stated in this match's own log at arm time — decimal odds, so price per share = 1/odds — over the window they were live for. They are styled apart from placed orders on purpose: they were never on the book. Era-correct by construction: the rungs come from that match's own arming line, never from today's config, so a match from last week shows the ladder that was live for IT. Where the log carries the capped form (MAX-ODDS LADDER CAP … composed ladder is […]) that is the one drawn, because that is the one that was really live.
The missed entry, drawn as a number. Comparing two y-positions is arithmetic; the chart does it for you. When the first rung was never reached, a bracket runs from the tape's low to that rung at the tick the low happened, labelled missed by 15.8¢ with the low, the rung and how much further the price had to fall underneath. The same figure heads the entry band in Near misses, appears as the verdict band's headline on a match that never traded, and rides in the legend. A buy needs the price to FALL to its level, so the number is measured against the tape's LOW while that level was live — settlement pins (0¢/100¢ in the last 10 minutes of a decided match) excluded, because nobody could have bought there.
The pregame anchor. The pink long-dash-dot line is the price the market itself was at when the bot armed — read off the arming line in the log. It is a reference price and never an order, which is why it carries no rung number, no stake, and a line style no order ever uses. It answers one question: how far did the tape get relative to pregame? (“our entry is x% cheaper than pregame prices, and many times price never dips below pregame prices”.) It is never the yardstick for a missed rung — nothing was ever bid at it, so a gap measured to it is a gap to no order. A missed entry is always measured against the next unfilled LIVE rung. Drawn on every match that logged an anchor, traded or not.
The 78% game-time line. At 78% of the sport's average duration the bot cancels every standing buy and flips to sell-only — no more averaging down; the position rides on what it already owns. It is drawn as a red vertical on both charts with everything to its right washed red and tagged sell-only →, so the region is obvious, not just the instant. It is why an order can appear to vanish (783617's 31¢ rung). The line is the log's own MODE: BUY_SCALE → SELL_ONLY event where one survives — when it really fired — and falls back to the scheduled cutoff (arm.wend), drawn faint and labelled scheduled. A cutoff the tape never reached is not drawn at all. Any buy order the line cancelled says so in its own label instead of a bare “cancelled”.
POSITION vs ARMED vs watched. Three states, never two. POSITION = a buy actually FILLED and money was committed. ARMED no fill = the bot took the match on and an order really stood — and nothing ever filled, so not a cent was committed; the match still counts as taken and will not be re-bet, which is why this used to read simply BET while the detail panel said NO POSITION (783617: 6.45 shares bid at 31¢ for 85 minutes, cancelled unfilled). watched = monitored, no order ever placed. The list chips follow the same split, so Armed no fill isolates the missed-opportunity set in one click, and on those matches the badge beside it reads pick won / pick lost — the MATCH result, never a trade result we never had.
The basket, in words. The top of the page states which basket the match was armed into — TP ONLY FAV, AGREED or MKT ONLY, with the side — straight off the arming line in the bot's own log (child_cfg is the fallback). TP_ONLY means the timeportal algorithm's pick is NOT the side the market favours: the edge is the algo's bias, which is why the ladder buys DOWN into the price. Hovering it prints that match's anchor, its dynamic-entry multiplier and the first rung the two produced.
Levels never squash the chart. levels: auto (default) fits the Y-axis to the price action and lets a target the axis does not reach clamp to the edge it went off — a dashed edge run over its own time window plus sell1 53¢ 1.89x ↑ — so a far-away sell can never crush the lines and can never read as “no sell exists”. fit all stretches the axis until every level is on screen. off removes them. buy rungs / sell tiers toggle each family. All persisted, and every one of them is presentation only — nothing here changes what the bot did.
Last buy line. A solid green vertical on both charts marks the final entry, labelled with its clock and price; earlier entries are faint dotted verticals. Everything to the right of it is the position riding on what it already owned — no more averaging down, so from there the only question is whether the tape reached a standing ask.
Levels on the P&L pane. The same orders appear on the lower chart against its left-hand % axis, because a limit at px was worth px ÷ blended cost − 1 at that moment. The line moves as the basis moves: averaging down cuts the cost, so on a laddered position the same 53¢ ask is worth +90% after the first rung and +538% after the last. That is the honest reading of “how much would this exit have made if it had filled right here”.
Slope-stop floor, not a stop-loss. The lower dashed line on the P&L pane (labelled slope-stop floor) is the slope-stop's arming floor from that match's config — the bot does not sell there. The rule fires only when all four hold together: no live score feed for the match, the blended bid at least that far underwater, the position still above the salvage line, and the odds worsening by ≥0.5 points per minute. It is a no-score fallback; matches with score data are handled by the game-state stop instead. The hollow ▽slope-stop marker is just the first crossing of the floor, never an exit.
Game start & H/L marks. The teal dashed vertical line is the game start (tagged start; ledgers with no game time fall back to the pregame anchor lock, tagged anchor). The dots labelled H/L are each side's highest and lowest traded price with its decimal odds. H/L marks exclude the last 10min before settlement (prices pin to 0/1 there) and the odds blow up to 100–2000x, so extremes printed there would be meaningless; a still-live match is searched to the newest tick instead of being trimmed. Values also appear in the click/hover readout.
Running P&L line. The lower pane's second line is this position's running P&L on its own right-hand axis in dollars: cash banked − cash staked + whatever is still held, marked at the tape price at every tick. Zero is shared with the open-P&L% axis on the left, so one break-even line serves both. It is local-only — the public board carries no P&L series unless the push flag is turned on, and then only as % of stake.
MAX $1 — the ceiling line. The dashed gold line on the P&L pane is the most this position could possibly show at each moment: everything already banked, minus everything staked, plus every share still held valued at $1.00 (a winning share redeems at $1). It steps up at every buy — more shares, more upside — and down at every sell, because shares banked below $1 shrink the ceiling toward what is already realized; once everything is sold or redeemed the two lines meet. The vertical gap between it and the P&L line is exactly how much of the maximum was not captured. The max button (and its legend pill) hides it, and the Y-axis then re-fits to the remaining lines — a ceiling 6× above the profit line would otherwise flatten it. Public view carries it as % of stake only.
Where the P&L numbers come from. The bot's positions ledger owns the timing of every buy and sell it booked. The wallet's on-chain totals (state/accounting.json) own the amounts. When a fill settles after the bot has stopped tracking a market the ledger is left short a booking — it still shows shares “riding” that the chain says were sold. The line runs on the ledger and takes the chain's totals from one labelled step (chain recon), so it ends at the true final number. P&L src switches between the reconciled and the raw ledger path.
Results table — every buy & sell, with the money. Headed by the same Spent | Sold | Profit | Pending line the verdict band prints, so the rows always sit under the four totals they add up to. One row per executed action, in order, carrying shares AND dollars side by side so nothing has to be multiplied: what changed hands, at what price, for how much, the position and its dollar value after that row, the blended cost basis, the profit that row realized in $ and %, and the running cumulative in $ and %. Every column sorts; the money columns carry a per-column heat wash so a column reads as a shape before it reads as figures. Percent denominators differ by row type on purpose and every header says which: a buy's % is its cost as a share of everything staked (the buys sum to 100%), a sell's % is its price against the blended basis at that moment, and cum % is against the cash staked up to and including that row — not the final stake. The P&L src switch above re-drives the whole table: ledger = the bot's own bookings, chain = those plus the on-chain fills it never booked.
Near misses & exit quality — what almost happened. Its own section, right under the charts, because it is what the sell rules get tuned from. The coloured band is the unsold slice: the shares this position bought and never sold — how many, what they cost, what they actually recovered (0¢ if the pick lost, 100¢ if it won, the last price while the match is live), what the standing sells that never triggered would have fetched, and the best price the tape ever printed. The table under it is the sell book, order by order: each tier's target, its limit price, the shares it offered, how far the tape's peak sat from it in cents and in percent, and what happened — FILLED, CLEARED, NOT FILLED (the price traded at or through the limit and the order still did not execute — an execution problem, not a market one) or missed by so many cents. Sort any column. The notes below cover tiers discharged together, shares with no standing sell behind them at all, and entry orders that triggered and never executed. The bot's Telegram near-miss and exit-quality alerts run the same arithmetic, so the board and the feed never disagree.
Public view = percentages and prices, never dollars. On the bot's own machine the results table is the full money view. Everywhere else it carries percentages, prices and event counts only — no dollar amounts and no share counts, with the position's size shown as % of the shares bought rather than a count. The exporter builds that view by allowlist (a new field can never leak by being forgotten) and re-scans every staged bundle before upload: a single $ figure, share count or order id aborts the whole upload.
Settlement. Once pmtrade has a recorded resolution, anything still held is valued at its redemption price — $1 a share if the pick won, $0 if it lost — instead of its last quote, so a match that ran on after the exit is not marked at a dead price. The redemption is marked × on the line.
Start countdown. The head chip counts down to the first ball, then counts how long the match has been running, then shows the final state — ticking every second, with the start time printed in your timezone (the ledger records UTC).
Finding a match. The search box takes either player in any order — rows read “the bot's pick vs the opponent” and the pick is often the market underdog, so the name you think of first is frequently the second one on the row. Accents and punctuation are ignored. Polymarket sometimes lists one real pairing as two markets; those are tagged dup and always shown next to each other, never hidden.
Ladder fit — what the tape offered. The one book-wide section: it does not change with the match you have selected. Everything else on this page says what a position paid and made; this says what the market actually offered, and draws our orders inside it. Each match is one vertical span — every price its tape printed while tradeable — with the buy window (up to the 78% sell-only line) solid inside it, our buy rungs as green wedges on the left and our sell tiers as purple wedges on the right, solid where they filled and hollow where they stood and never did. The settlement walk to 100¢/0¢ is cut out with the same detector the H/L marks use, so a market walking to the wall cannot look like it reached every order ever placed.
The two headroom numbers. The lower canvas is the answer to “raise or lower”, as two distributions with one dot per match. Bid side = our lowest bid minus the cheapest price the tape printed inside the buy window. Ask side = the best price the tape reached after our first fill, minus our highest ask. Both are signed the same way: above zero the tape went past us (it traded through the bottom of the ladder, or ran on past the top exit); below zero it never reached us. The thick bar is the median, the box is the middle half. Split it by basket (AGREED vs TP_ONLY) or by outcome — they are different books and the pooled number hides it.
Two order tiers, and why the default is the strict one. A match’s orders come from the bot’s wire log where one survives — that carries orders which stood and never filled, which is the only way to say “the tape never came to us”. Older matches have had their logs rotated away and only the ledger’s own fills survive; every order visible there traded by definition, so its headroom cannot be negative and pooling the two washes the finding out. full history is the default and the honest read; fills only answers a different question (what we paid, against the tape); both is the whole book with the dilution stated.
Prices and odds, one switch. Every value in this section carries its decimal-odds twin (odds = 1 ÷ price) and the same odds / price ¢ / Linear / Log buttons that drive the match charts drive it too — the value axis, the headroom axis, the burned labels and the readouts all restate together. Click a span or a dot to read that one match; the same match lights up on the other canvas. Click empty space to clear. It never scrolls the page.
Controls. Wheel = x-zoom. Drag = pan. Shift+drag = brush zoom. Shift+wheel or the Y slider (or dragging the y-axis gutter) = data Y-stretch. Double-click = reset. Both charts share one x-axis. Click a line — a player, a P&L line or a level — to read that one; shift+click reads everything at that time; click empty space to clear.
The readout never covers the axis. The hover / click readout parks in whichever half of the pane the point is not in and stays inside the plot, clear of the y-axis gutter it used to sit on, so the ticks stay readable while it is up. It lists, at that exact tick, both players' odds and price per share, every level standing right then with its price, its odds, its size and how many cents the tape still had to travel to reach it — and the P&L lines. Nothing on either chart should need the axis to be read.
Downsampling & clip. Series over 3000 ticks are bucketed server-side keeping first/last/min/max per bucket — spikes survive; bet rows are always kept (). The odds axis is clipped at 20x (4¢ floor in ¢ mode); a dead game's 100–2000x tail pins at the cap with a "clipped" hint instead of flattening the tradeable range.
Times. All timestamps are rendered in your local timezone (); the ledger records UTC.
Live test. While the bot is running a live acceptance test of the sell architecture, the matches under test carry a magenta TEST badge in the list and in the match head, and a Live test section appears under the charts: the plan's function-coverage checklist, every wire action counted as kind × outcome (placed / stood / filled / rejected / refused / ignored / failed / unbooked) with a per-kind time strip, and every anomaly with its log excerpt. It disappears the moment the test stops. It carries no money — statuses, kinds and counts only; stakes, share counts and order ids never leave the local machine, and the exporter refuses to upload the file if a single one appears.