Repository navigation
Releases: pm-trade/pmt
Release list
pmtrader v0.9.0
A new standalone shadow service, and three grading bugs that each misreported the ledger.
Fixed
- 4h windows were missing from the record. A strict slug parser demanded a minutes token, so six settled 4h wins (+$164.35) silently never reached the ledger. All-time now matches the raw wallet walk to the cent.
- Silent losses rode forever. A losing position pays $0 and posts no wallet row, so a wallet-only tally books every win and can never book a loss — three resolved-lost windows sat "riding" for up to 25h, hiding −$272.35. Grading now falls back to the market's own resolution. The tie-break that should have caught this never fired because the gamma lookup omitted
closed=true, and gamma defaults it to false: every settled window answered "no such market", which parsed as "not resolved yet". - A zero-share $0 redeem is a stub, not a payout. Placeholder rows posted beside two resolution-confirmed wins were read as the wallet's own $0 settlement and graded both windows as full losses.
crypto watchno longer drops tape records when the terminal is squeezed, and merges eval/gate lines across symbols instead of per-symbol.
Added
pilot2— a standalone shadow service with its own entry point, its own state and its own risk law; not apmt cryptosubcommand. It prices the 5m majors from a calibrated terminal model blended with the de-vigged book and logs every trade it would have made. Shadow by default: going live needs two explicit switches, is limited to its own series list, and refuses outright on any series an engine already owns.crypto outcomesbanks the exchange's settled outcome into the corpus, ranked above chainlink/book inference. On the first backfill it upgraded 709 inferred outcomes and disagreed with two of them.python -m polymarket.printsharvests the public print tape continuously rather than once, rotated by print time and bounded by a retention window.crypto watchis one table — arms, positions and recent windows folded together, with live odds on every position row until it grades.crypto arm --settle-twpasses the measured 60s settlement width, and 5m stream-fed arms raise to it automatically; grading follows the same width.
pmengine v0.6.0
Public flavor — private strategies not included. This build carries only the in-tree example strategy; it is not the binary the live engine runs.
Two engine-halting bugs, and the tape now reaches a remote operator.
Fixed
- The circuit breaker halted on a paper loss it could not price. It judged on realized + unrealized, but taker fills never write realized, and
mid_pricereturns nothing for a one-sided book — so a resolving market's mark froze, the next position reconcile re-derived a doubling loss against that stale price, and the breaker tripped at −412 while the session was up $29. It now reads realized P&L in full plus marks on only the positions carrying a fresh, tradeable price, and reconcile moves share counts without inventing a re-mark. - Cancel storm. A cancel the CLOB refused terminally — already cancelled, already matched, not found — was read as "still live" and re-sent every 50ms tick: 16,028 round trips against 195 dead order ids, with 97% of batch cancels retiring nothing. A terminal answer now retires the order once; only transient failures retry, backing off 0.5s to a 30s ceiling. The worst observed window drops from 416 refusals to at most 5 calls.
- Cancel/replace churn on coarse-tick markets. The keep-vs-replace check compared the strategy's raw model price against the order's wire price — two different grids — so a sub-tick drift cancelled and re-posted the identical wire order, buying nothing and paying queue position.
- Position reconcile fetches the account once per pass instead of once per subscribed token. Sixteen sequential whole-account downloads every ~1.5s were starving the control plane for up to 9s and running the tick loop 22% behind schedule.
Added
GET /tape?since=&limit=on the control plane — a bounded reverse-tail of the eval/fire tape, sopmt crypto watchrenders against an engine on another host. It never enters the trading loop, and is capped twice: at most 512KB read off the tail and at mostlimitrecords parsed, so cost does not grow with the tape.PM_SIGNATURE_TYPE=3for deposit wallets (EIP-1271 / ERC-7739). Frozen golden vectors prove the Rust order path byte-identical to the Python reference offline. An unrecognised value now warns instead of silently becoming an EOA.PMENGINE_SERIES_ALLOWLIST— the slug prefixes this engine may trade. Two engines under one operator account share a book, so one can match the other's resting quote; arms outside the list are now refused. Unset keeps prior behaviour byte-for-byte.replay --tracewrites a decision trace per tape record, and an unknowntunableskey is a hard error rather than a silent fall back to the default.
pmtrader v0.8.0
Full Changelog: pmengine-v0.4.0...pmtrader-v0.8.0
pmtrader v0.7.0
Full Changelog: pmengine-v0.3.0...pmtrader-v0.7.0
pmtrader v0.6.0
Full Changelog: pmengine-v0.2.0...pmtrader-v0.6.0
pmtrader v0.5.0
Full Changelog: pmengine-v0.1.11...pmtrader-v0.5.0
pmengine v0.5.0
Public flavor — private strategies not included. This build
carries only the in-tree example strategy; it is not the binary
the live engine runs.
Full Changelog: pmengine-v0.4.0...pmengine-v0.5.0
pmengine v0.4.0
Full Changelog: pmengine-v0.3.0...pmengine-v0.4.0
pmengine v0.3.0
Full Changelog: pmengine-v0.2.0...pmengine-v0.3.0
pmengine v0.2.0
Full Changelog: pmengine-v0.1.11...pmengine-v0.2.0