Repository navigation
Releases: ziyangliu-666/FastMM
Release list
FastMM 0.6.0
Connectors for Hyperliquid and Lighter, both signing natively. The store and fastmm-top show why
an order went out or did not, and parameter changes are confirmed and kept as history.
Highlights:
hyperliquidconnector, main and HIP-3 dexes (Added, venues)lighterconnector for Lighter perpetuals (Added, venues)fastmm-topshows per side what is asked, what works and the first obstacle (Added, live)- every refused order is stored with the limit that refused it (Added, store)
fastmm-ctl param --wait, with parameter history in the store (Added, live, store)
Added
- venues:
hyperliquidconnector for perpetuals, main and builder-deployed (HIP-3) dexes. - venues: Hyperliquid order signing with libsecp256k1 0.6.0, pinned and built in-tree.
- configs:
hyperliquid.toml, BasicMM on the Hyperliquid BTC perpetual. - venues:
lighterconnector for Lighter (zkLighter) perpetuals. - venues: Lighter transaction signing, native and checked against the official Go signer.
- configs:
lighter.toml, BasicMM on the Lighter NVDA perpetual. - tools:
tools/lighter_api_key.pyregisters a Lighter API key. - live:
fastmm-topshows the session's threads from/proc: CPU, core, context switches, faults. - data:
fastmm-data analyze <live.fmj> [--json]marks a live session's fills against its mids. - replay:
fastmm-replay --check [--json]lists what a replay needs, without replaying. - store:
fastmm-pnl ledgergives one row per execution across sessions, with its flags. - store:
fastmm-pnl order --order <id>shows one order's sends, refusals, fills and state. - live:
fastmm-topshows per side what is asked, what works and the first obstacle (v21). - api:
ctx.note_quoteandctx.metricpublish the strategy's reasons and numbers live. - store: refused orders with the limit that refused them and the budget then (schema 9).
- live: the status shows each account's order windows, refusals by limit and the risk bucket.
- store: parameter history (schema 8):
fastmm-pnl params --at,param-changes,param-diff. - store:
fastmm-pnl configprints the configuration a session ran with, for a backtest of it. - live:
fastmm-ctl paramanswersqueued seq=N;--waitwaits for it;paramsreads them back. - live:
param --sourcenames who changed a parameter, in the journal and the status file (v19). - live:
fastmm-livelogs a topology check at start: hot threads sharing a core, and adaptive spin. - python:
fastmm init --profile productionaddsproduction.toml, tuned for a dedicated host. - python:
fastmm simruns the simulated exchange;fastmm initwritessim.tomlto trade it.
Changed
- live: the network thread sends queued orders between one socket's event and the next.
- venues: a pool's accounts take their IP's shared weight without a kernel wait on each order.
Fixed
- store: refusals of a pool's accounts in turn were counted under the first account's record.
- core: a pool order refused for a full or paused account takes no
[risk]token.
Documentation
- docs: the economics page, the tutorials and the
fastmm initREADME give the numbers alone. - docs: the README and Install name Linux x86-64 and run the quick start in Docker elsewhere.
- docs: Run on testnet has Hyperliquid and Lighter sections.
- docs: the README and the home page open on a two-minute film; the home page lists all three.
Install
pip install "fastmm-engine[live]==0.6.0"
docker pull ghcr.io/ziyangliu-666/fastmm:0.6.0The Linux tarball below runs on glibc 2.28 or newer. Install guide, Deploy.
Full Changelog: v0.5.1...v0.6.0
FastMM 0.5.1
Fixed
- init: the generated README runs
pipandpythonfrom the active environment. - venues: a warm standby started early in a rate-limit minute has its books before the handoff.
Install
pip install "fastmm-engine[live]==0.5.1"
docker pull ghcr.io/ziyangliu-666/fastmm:0.5.1The Linux tarball below runs on glibc 2.28 or newer. Install guide, Deploy.
Full Changelog: v0.5.0...v0.5.1
FastMM 0.5.0
fastmm-live --dry-run quotes on paper, the release tarball runs on any Linux with glibc 2.28 or
newer, and fastmm init writes a live config next to the backtest. Python 3.9 is no longer supported.
Breaking changes
- python:
fastmm-enginerequires Python 3.10 or newer; no cp39 wheels are built. - live: a dry run runs as engine
<name>-dryrun, with its own status file, socket and journal. - live:
--dry-runwith--standbyor--takeoverexits with status 2.
Added
- live:
--dry-runquotes on paper: orders are acknowledged locally and never sent. - live: a dry run logs what it would have sent per instrument every 5 s.
- init:
fastmm initalso writeslive.toml(BTCUSDT on Binance Spot Demo Mode). - init: the starter
backtest.pytakes--configand--datato replay a recorded journal. - backtest: a kill-switch stop reports
kill_reasonandkill_at_sin the summary andstats(). - hot: the
@fastmm.hotcheck names each allocation and its line. - logging:
[logging] status_interval_ssets how often the per-venue status line is printed.
Changed
- packaging: the tarball is built in
manylinux_2_28with OpenSSL and libstdc++ linked statically. - packaging: the tarball is tested on Ubuntu 22.04/24.04, Debian 12, Rocky 9 and Amazon Linux 2023.
- packaging: the tarball ships
fastmm-sim-exchangeand its configs; its README starts with it. - live: a dry run leaves the keyed session's store, kill ledger, state file and instance lock alone.
- live: a planned stop logs
stopping: pulling quotes and cancelling allat INFO. - logging: the status line is printed every 10 s on stderr; a log file still gets it every second.
- init: the starter quotes 0.0001 BTC per side; its default backtest stays under
[risk] max_loss. - examples:
examples/quickstartfetches the release tag, notmain.
Fixed
- logging:
[logging] fileopens the log file. - logging: log files are flushed after each burst.
- build:
scripts/bootstrap.shhonours$CXXand findsg++-13,clang++-16and later. - python:
BacktestConfig.from_tomlaccepts unset${VAR}in[venues.*].
Documentation
- docs: the quick start creates a virtual environment first (PEP 668).
- docs: Register a strategy installs FastMM as an SDK build without tests, benchmarks and examples.
Install
pip install "fastmm-engine[live]==0.5.0"
docker pull ghcr.io/ziyangliu-666/fastmm:0.5.0The Linux tarball below runs on glibc 2.28 or newer. Install guide, Deploy.
Full Changelog: v0.4.0...v0.5.0
FastMM 0.4.0
Account pools put several accounts of one exchange behind one venue, with a shared rate limiter, a
treasury and a hot handoff between processes. The release also adds the Gate USDT perpetual
connector, a fill audit against the venue's trade history and more realistic simulator fills.
Highlights:
- Account pools: up to 8 accounts of one exchange behind one venue (Added, venues)
fastmm-live --takeoverand--standbyhand a running session to a new process (Added, live)- A pool treasury keeps an asset spread over the accounts by internal transfer (Added, live)
- Gate USDT perpetual futures connector (Added, gate)
- Fill audit against the venue's trade history, live and in
fastmm-pnl(Added, live) - Simulated fills take the print's quantity, not the whole order (Breaking changes, sim)
Breaking changes
- sim: a trade through a resting order fills the print's quantity, not the whole order.
- sim: one print is shared across our orders in price priority; backtest fills and hashes change.
- venues:
RateLimiter::weight_bucketandorder_bucketreturnstd::optional<RateBucket>. - live: the status file is at version 18 (fill audit and treasury counters).
- binance_usdm: an account in hedge mode exits with status 3.
Added
- venues:
pool_of = "<primary>"pools up to 8 accounts of one exchange behind one venue. - venues: a pooled order goes to the account with room and the most order window left.
- venues:
Venue::transfermoves an asset between the accounts of one exchange. - venues:
BalanceMsg::withdrawablecaps a treasury move; USDⓈ-M reportsmaxWithdrawAmount. - venues:
source_ip/source_interfacebind every connection of a venue to a local address. - venues:
public_only = truemakes a venue market-data only, with no keys and nothing sent. - engine:
.account(venue)on a quote level names the pool account its order goes from. - engine:
ctx.pool()andctx.account_usable()describe a venue's pool to the strategy. - engine:
ctx.balance(),ctx.order_budget()andbalance_room()are per account. - engine:
on_batch_end(ctx), requested byctx.request_batch_end(), runs once after a burst. - engine: a quote short of a
[risk] orders_per_sectoken is held and placed as the bucket refills. - engine:
[engine] quote_token_reservekeeps order tokens for other orders. - engine:
[engine] feed_budget_per_ringsets how many events a ring yields before the next one. - engine:
[engine] net_spin_dedicatedlets network threads on dedicated cores busy-poll. - engine:
[engine] rt_priorityandnet_rt_priorityrun the threads underSCHED_FIFO. - engine:
[engine] cpu_dma_latency_usholds a CPU latency request for the session. - engine:
[engine] log_irq_affinitylogs NIC queue interrupt placement at start. - live:
--takeover,--standby,fastmm-ctl handoffand[engine] instance_lock: hot handoff. - live: a warm standby on Binance Spot runs market data and its strategy while the old one trades.
- live:
[venues.<primary>.treasury]keeps an asset spread over a pool's accounts by transfers. - live: a treasury has transfer limits, a crash-safe ledger and metrics.
- live:
fill_audit_interval_saudits the stored fills against the venue's trade history. - binance: Spot and USDⓈ-M transfer between sub-accounts with a separate transfer-only master key.
- binance: the fill audit runs on Spot and USDⓈ-M and can book the fills it finds missing.
- binance:
order_rate_threshold(default 0.9) caps the share of the 10 s and daily order limits. - binance_usdm:
md_ticker_connsopens extra bookTicker connections; first copy of an update wins. - binance_usdm:
one_way_mode = trueandleverage = <n>set the account up at start. - gate: Gate USDT perpetual futures connector (
kind = "gate_usdt") with a dead man's switch. - pnl:
fastmm-pnl audit --exchange <file>exits 5 when stored fills differ from exported trades. - journal: sessions record restored strategy state and snapshots (
state_snapshot_interval_s). - journal:
fastmm-replayreplays restored sessions exactly. - backtest: the treasury runs on simulated time (
[backtest] transfer_latency_ms,transfers.csv). - backtest:
initial_state = "journal"andparams_from_journal = truestart from a live session. - backtest:
journal:x.fmjreads all parts of a session split byjournal_max_bytesas one stream. - backtest:
journal:…,remap=1maps a recording's instruments to the configuration's by symbol. - backtest:
order_service_usmodels per-connection order processing;latency_cancel_uscancels. - backtest:
[backtest] orders_10s/orders_1dsimulate Binance's order-count limits. - data:
fastmm-data calibratefits cancel latency, order service time and jitter from journals. - data:
fastmm-data calibrate --from-live-statecompares runs started from live state. - data:
fastmm-data fill-checkbreaks down the fillsl2_queuemisses by markout, queue, print. - sim:
SimExchangeServer::accepted_client_order_ids(). - tools:
scripts/host-setup.sh cstateslimits idle states per CPU. - tools:
scripts/host-setup.sh irq-affinityspreads NIC queue interrupts.
Changed
- engine: a strategy can declare up to 128 parameters (was 64); the journal layout is unchanged.
- binance: the periodic execution replay queries only symbols with recent order activity.
- binance_usdm: a hedge-mode error names the setting and
one_way_mode. - binance_usdm: mixed settlement currencies without
[accounting]print the lines to add. - gate: a base coin label longer than the instrument field is shortened with a warning.
Fixed
- binance: a signed REST request queued behind an execution sweep no longer fails with -1021.
- binance: pooled accounts share one request-weight window per IP.
- venues: a pooled account whose order window is full gets no automatic orders.
- venues: quotes on one pooled account are no longer sized to another's room.
- engine: a fill arriving after its order was cancelled marks it
Filledand updates the store. - sim: fees are charged on the contract's notional including its multiplier.
- journal: a journal with more parameters than the reader supports opens.
- journal: every journal refusal says which check failed.
- backtest:
--data "a;b"no longer corrupts memory on depth snapshots deeper than 256 levels.
Documentation
- docs: the README is rewritten around the engine's features.
- docs: How fast it is, a new page, shows the latency and load of a production session.
Install
pip install "fastmm-engine[live]==0.4.0"
docker pull ghcr.io/ziyangliu-666/fastmm:0.4.0The Linux tarball below runs on glibc 2.28 or newer. Install guide, Deploy.
Full Changelog: v0.3.0...v0.4.0
FastMM 0.3.0
This release adds OKX and Coinbase connectors, cross-venue hedging with HedgeExecutor and the
xmm strategy, balances, margin and perpetual mark and funding for strategies, and exact fill
recovery after a restart. Unknown configuration keys are now errors.
Highlights:
- OKX perpetual swaps and both Coinbase APIs (Added, okx and coinbase)
HedgeExecutorand thexmmstrategy: quote on one venue, hedge on another (Added, strategies)- Balances, margin and perpetual mark, index and funding reach every strategy (Added, engine)
- Strategy state persists across sessions (Added, engine)
- Fills made during an outage are booked after a restart on Binance and Bybit (Added, venues)
- An unknown configuration key is an error (Breaking changes, config)
Breaking changes
- config: an unknown key or section is an error with its line number,
[strategy.params]included. - config:
BacktestConfig.from_tomlraisesConfigErroron an unknown key. - config: a venue with
stale_msabovedead_ms, orstale_ms = 0, is refused at start-up. - net: user-space TCP is removed:
order_transport = "user_tcp"is refused; OUCH uses kernel TCP. - strategies:
lead_mmno longer has theown_in_feedparameter. - core:
sim::FeeModelis renamedFeeTable(core/fees.hpp). - core:
validate_venuesno longer takes a warnings argument. - build:
FASTMM_BUILD_NET=ONneedsmaketo build liburing from source. - gateway: attach protocol version 7; strategies and
fastmm-gatewaymust be upgraded together.
Added
- okx: OKX v5 connector for USDT-margined perpetual swaps, with fill replay and
cancel-all-after. - coinbase: Coinbase Advanced Trade connector (
kind = "coinbase_advanced", spot, CDP keys). - coinbase: Coinbase Exchange connector (
kind = "coinbase_exchange", spot, sandbox). - strategies:
xmmquotes one venue and hedges with IOC orders on another (xmm-demo.toml). - strategies:
HedgeExecutorhedges across several instruments with failover, halt and de-risking. - examples:
examples/cpp/hedged_mm.cpp, a quoter on one venue hedged on two others. - engine:
ctx.mark,ctx.fundingandon_perp_statecarry a perpetual's mark, index and funding. - engine:
[accounting] markvalues positions at the venue's mark. - engine:
ctx.balance,ctx.marginandon_balance: balances and margin from every connector. - engine:
state()/restore()and[strategy] state_filekeep strategy state across sessions. - engine:
on_risk_rejectreports orders refused by[risk]. - engine:
ctx.order_budget(venue)shows the remaining order and request-weight budget. - engine:
ctx.fees,ctx.risk_headroomandctx.venue_health: fees, risk room and feed lag. - engine: execution view:
ctx.own_qty,ctx.best_ex_self,ctx.queue_ahead,ctx.order_times. - engine:
[accounting]converts several settlement currencies toreporting_currencythrough FX. - risk:
[risk] check_balance(default on) refuses orders the balance cannot cover. - risk:
[risk.underlying.<BASE>] max_netlimits the net position in one base asset across venues. - risk:
[risk] max_feed_lag_mspulls quotes while a venue's market data lags. - gateway:
[gateway.underlying.<BASE>] max_netdoes the same for the account behind a gateway. - gateway:
[gateway.shared."<venue>:<symbol>"]shares one instrument between strategies, with STP. - ctl:
fastmm-ctl limits underlying.<BASE>.max_net=...sets the limit on a running session. - venues: perpetual state comes from Binance USDⓈ-M, OKX, Bybit, Deribit and Gemini.
- venues: a reconciliation on Binance Spot, USDⓈ-M and Bybit books the fills made during an outage.
- venues: a restart restores the position.
- venues:
api_passphrasecredential for venues that need one (OKX, Coinbase Exchange). - venues: a book checksum mismatch resyncs the book.
- binance:
amend_keep_priorityreduces an order's quantity in place and keeps its queue position. - binance:
fetch_fees = trueon Spot reads the account's commission rates at start-up. - binance_usdm: venue-side dead man's switch,
dead_mans_switch_ms, on by default. - binance_usdm: a lost dead man's switch countdown kills the venue.
- binance_usdm:
post_only_rpi = truesends RPI post-only orders. - binance_usdm:
TRADIFI_PERPETUALcontracts are accepted. - bybit: venue-side dead man's switch,
dead_mans_switch_s, off by default. - backtest:
fastmm.walk_forward/bt::walk_forwardrun walk-forward sweeps over K time folds. - backtest:
[backtest] md_arrival = "recorded"replays market data at its recorded receive time. - data:
fastmm-data calibratefitsl2_queueand latencies to live journals; prints[backtest]. - net: the WebSocket client and server pass the Autobahn RFC 6455 suite (
scripts/autobahn.sh).
Changed
- engine: a strategy can declare up to 64 parameters (was 32); one more refuses the strategy.
- cli: command lines are parsed with CLI11; numbers are validated, flags and exit codes unchanged.
- cli:
fastmm-ctlandfastmm-toptake--version. - backtest: the
l2_queuequeue model caps queue position with the book ticker and the trade tape. - backtest:
queue_conservatismdefaults to[engine] queue_conservatism. - strategies:
xmmdoes not hedge on a venue that is killed, feed-lagged or stale. - strategies:
HedgeExecutorsizes hedges to the remainingmax_gross_notional/max_net_notional. - store:
fastmm-pnl duplicatesand the start-up duplicate check are about 10x faster (schema 7). - net: the io_uring backend uses liburing 2.15.
- build: zlib is no longer needed.
Fixed
- binance: starting with many symbols stays under the request-weight limit; the IP is not banned.
- binance: combined-stream URLs with more than about 14 symbols connect.
- binance: a book no longer resyncs right after connecting.
- binance:
cancel_all()retries after a 418 or 429. - binance_usdm: WebSocket order placement no longer charges request weight.
- binance_usdm: history queries respect the minute's weight and
Retry-After; a 418 stops REST. - venues: a requote is no longer refused
BalanceShortafter a cancel ack. - venues: order and cancel acks carry the venue's time on all connectors.
- venues: a quiet channel returning to Live no longer logs a state change every 20 s.
- store: fills with the same execution id on different venues, symbols or sides are kept (schema 5).
- store: a restart after consecutive crashes no longer books executions twice.
- store: a session killed during its start-up replay keeps its fills on the next start (schema 6).
- engine: an order's fill reported both by cumulative quantity and by execution is booked once.
- engine:
[accounting.fx]rates from a quiet book no longer go stale ([accounting] stale_fx_ms). - strategies:
HedgeExecutorandxmmsplit a hedge larger than a[risk]per-order limit. - gateway: after a restart, fills made while it was down reach the strategy that owns the order.
- gateway: orders of several strategies no longer fill the connector's order table.
- okx: funding bills with more than 8 decimals are booked.
- data:
fastmm-data fill-checkkeeps fills reported after their order ended. - net: invalid UTF-8 text and malformed close frames are rejected with close code 1007 or 1002.
Install
pip install "fastmm-engine[live]==0.3.0"
docker pull ghcr.io/ziyangliu-666/fastmm:0.3.0The Linux tarball below runs on glibc 2.28 or newer. Install guide, Deploy.
Full Changelog: v0.2.0...v0.3.0
FastMM 0.2.0
FastMM 0.2.0 adds US equities through Nasdaq ITCH and OUCH with kernel-bypass receive, Python
strategies in backtests and live sessions, and a control plane for a running session. Strategy
registration, hook signatures and the journal format change; see Breaking changes.
Highlights:
- Nasdaq ITCH 5.0 / OUCH 5.0 venue with A/B arbitration and GLIMPSE recovery (Added, venues)
- Python strategies: Numba-compiled
@fastmm.hothooks and slow methods, live too (Added, python) fastmm-ctlpulls, resumes, retunes, flattens or kills a running session (Added, ctl)- Run-to-completion threading and coalesced order sends (Added and Changed, engine)
- A SQLite trading record per session, queried with
fastmm-pnlor from Python (Added, store) fastmm reportwrites a run as one self-contained HTML page (Added, backtest)
Breaking changes
- engine: a strategy library exports one registration function that calls
register_strategy<S>(r). - engine:
StrategyRegistry::addis replaced bytry_add. - engine:
on_trade,on_book_ticker,on_option_tickertake(ctx, InstrumentId, const Msg&). - engine:
on_filltakes(ctx, const Fill&)andset_quotesreturnsbool. - engine:
ParamDesc::parseandformatreplacesetandget. - engine: built-in strategies move to the
fastmm::strategieslibrary. - engine:
make_engine_runner,EngineConfig,LiveBackendmoved; the install exports components. - strategies:
basic_mmbps parameters keep four decimals; its golden hashes change. - venues: venues resolve through
VenueRegistry;VenueKindandvenue_factory.hppare gone. - venues: connector keys are validated per venue; a key of the wrong type stops the session.
- live:
[engine] on_killdefaults to"exit"; set"stay"for the old behaviour. - live: an unrequested kill switch ends the session with exit code 6, or 5 if cancel-all failed.
- journal: format version 3 (readers open 1 to 3).
- journal:
fastmm-replayrefuses unclosed or damaged journals unless given--allow-incomplete. - top: status segment version 5;
fastmm-topandfastmm-livemust come from the same build. - backtest: shipped configs charge Binance spot VIP 0 fees, 10 bps a side.
- backtest: each instrument pays its own venue's fees.
- codecs:
moldudp::Receiver::on_packettakes(line, datagram, now_ns, meta). - codecs:
L3Bookis no longer a template and takes anL3BookConfig. - python: the PyPI distributions are
fastmm-engineandfastmm-engine-live; imports unchanged.
Added
- venues: Nasdaq TotalView-ITCH 5.0 venue (
kind = "nasdaq_itch") with GLIMPSE and OUCH 5.0 orders. - net: multicast receive backends
rx_backend = "kernel" | "af_xdp" | "dpdk". - net: AF_XDP loads its own BPF program without libbpf.
- net: DPDK needs
-DFASTMM_WITH_DPDK=ONandspin_mode = "busy". - net: unicast market-data lines on all three backends.
- net:
order_transport = "user_tcp"(experimental): OUCH over user-space TCP,AF_PACKETor XDP. - net:
dpdk_exception_port, a DPDK kernel exception path. - sim:
fastmm-sim-itch, an ITCH/MoldUDP64 publisher with seeded drops, GLIMPSE and OUCH 5.0. - codecs:
fastmm::codecs: FIX 4.4, ITCH 5.0, MoldUDP64, SoupBinTCP, OUCH 4.2/5.0 and CME MDP 3.0. - engine:
[engine] threading = "single"runs reactor, engine and sends on one thread (one venue). - engine:
[engine] timer_slack_ns,lock_memory,net_backend = "io_uring",reject_backoff_ms. - engine:
configs/profiles/production-latency.tomlfor a dedicated host. - engine:
[engine] ack_timeout_mscancels orders with no ack and frees their slots and exposure. - engine: runtime parameter updates:
ParamUpdate,on_paramsand[strategy] max_param_age_ms. - engine:
quoting.hpphelpers,verify_strategy<S>(),on_quotingandevery/oncetimers. - engine:
StrategyHarness<S>for testing strategy hooks. - core:
Ratioand exact literals (100.25_px,5_bps). - core:
Fixed::from_double_checked(),Ratio::from_bps_checked()andchecked_add/sub/mul. - core: Black-76 pricing, greeks and an implied-vol solver.
- core: inverse (coin-margined) contracts booked in their settlement coin.
- risk:
[engine] kill_filelatches amax_losstrip and carries cumulative PnL across restarts. - risk: per-venue kill switch: an unusable venue pulls its quotes and refuses orders; others trade.
- risk:
KillReasonrecords why a kill switch tripped. - live: a latched start exits 6 until
fastmm-live --clear-kill; SIGHUP clears a running session. - live:
fastmm-live --strategyand--param key=value. - live:
fastmm-livelogs what the previous session of the same name left behind before it starts. - ctl:
fastmm-ctlover a per-session Unix socket, scoped to the session, a venue or an instrument. - ctl:
pull,resume,param,limits,flatten,kill,unkill,stopandstatus. - ctl:
fastmm-ctl flattencloses positions in reduce-only IOC slices within--max-slippage-bps. - top:
fastmm-top, a terminal dashboard over/dev/shm/fastmm-<engine>.status, with--json. - top:
fastmm-top --metricsserves a Prometheus endpoint. - top: rejects are counted per
RejectReason. - cli:
--list-strategies --format jsononfastmm-liveandfastmm-backtest. - cli:
fastmm-pnlreads the record:sessions,fills,orders,pnl,positions,recover. - python: Python strategies in backtests: subclass
fastmm.Strategy. - python:
@fastmm.hothooks are compiled by Numba (extrafastmm-engine[hot]). - python:
on_start,on_stopand@fastmm.everyslow methods. - python:
fastmm.run_live()andpython -m fastmm run module:Classrun a Python strategy live. - python: a failing hook or slow method stops a live session with exit code 7.
- python:
fastmm.replay(journal, MyMM)replays a hot strategy from a journal's parameter updates. - python:
fastmm-engine-livewheel (fastmm-engine[live]) with the connectors and static OpenSSL. - python:
fastmm.data_sources()andfastmm.convert_data();fastmm.datais now a package. - python:
fastmm.open_store(path)returns the record as pandas DataFrames. - python:
fastmm.features()andfastmm.evaluate_signal(). - deribit: Deribit connector (
kind = "deribit") for options and futures, plusoptions_mm. - binance: USDⓈ-M perpetual futures connector (
kind = "binance_usdm"); hedge mode is refused. - binance: Spot SBE market data (
md_format = "sbe") decodes depth in 51 ns, JSON in 680 ns. - binance: Ed25519 keys via
private_key_envwithsession.logonon both Binance connectors. - backtest: fill markouts at
[backtest] markout_horizons_s(1, 10, 60 s) and fill-quality stats. - backtest: markouts in the summary,
summary.json,fills.csvandBacktestResult.markouts(). - backtest: per-instrument
maker_bpsandtaker_bpsoverrides. - backtest:
--data binance:<SYMBOL>,<DATE>andtardis:<exchange>,<SYMBOL>,<DATE>: public data. - backtest:
fastmm reportandfastmm.write_report()write a run as one offline HTML page. - data:
python3 -m fastmm.data fetchfetches public data;fastmm-data convertpacks.fmj. - store: a SQLite record per session (
[storage]): fills, orders, positions, daily PnL, kills. - journal:
[engine] journal_sync,journal_max_bytes(rollover) andjournal_retention_days. - journal: a journal write error trips the kill switch and exits 5.
- research:
fastmm::researchfeature and forward-markout extractor withevaluate_signal(). - tools:
tools/pnl_report.py. - tools:
scripts/bench-e2e.sh,bench-2host.sh,host-setup.shandxdp-test.sh. - tools:
scripts/build-pgo.shbuilds with PGO and optionally BOLT. - packaging:
scripts/package-release.shand therelease-dpdkpreset build a portable tarball. - examples:
examples/quickstart/,cpp/tutorial/,external-project/andexternal-venue/.
Changed
- codecs: FIX 4.4 and CME MDP 3.0 are off by default (
FASTMM_CODEC_FIX,FASTMM_CODEC_MDP3). - codecs: MoldUDP64 packets ahead of a gap are buffered (
reorder_packets,gap_timeout_ns). - codecs:
L3Bookorders outside the price window go to an overflow store. - codecs: OUCH 5.0 encode 4.4 µs → 0.1 µs; ITCH bridge 84 ns → 55 ns per message.
- venues: a connector registers itself in
VenueRegistrywith its keys and capabilities. - engine: order sends are coalesced into one system call per drain (wire-to-wire p50 30-35 µs).
- engine:
BM_EngineStep_Sim9.2 µs → 2.9 µs; Binanceorder.placeencode 1440 ns → 523 ns. - engine: a venue's unreported
cum_qtyis booked as a synthetic fill (OmsUpdate::missed_qty). - engine: a cancel ack for a fully filled order ends it as
Filled. - engine:
OmsUpdate::replaced_cl_ord_idreports the id a cancel-replace superseded. - live:
fastmm-liverefuses to start when the session epoch file cannot be written. - live:
fastmm-livetripsOrderIdsExhaustedinstead of reusing client order ids. - risk:
fastmm-liverefuses[risk] max_losswhen instruments settle in more than one currency. - core:
Fixed::from_double()saturates out-of-range values and maps NaN to zero. - backtest: the summary shows
net = spread capture + mid drift - fees + rebates + unexplained. - backtest: unknown config keys are reported with their line.
- backtest:
sharpe_annualizedis NaN for runs under a day. - python:
run_backtesttakesparams=and afastmm.Strategysubclass;request_stop()ends it. - python: wheels cover CPython 3.9 to 3.14.
- bench: CI benchmark budgets allow 10 % (was 25 %).
- build:
scripts/run-sim.shtakes--portand--tls-port.
Removed
- engine:
FASTMM_REGISTER_STRATEGYandStrategyContext::instrument_count(). - engine:
ctx.add_timer(); useeveryandonce. - sim:
sim::make_sim_or_replay_runner.
Fixed
- deribit: fees are booked in
fee_currency. - net: a failed WebSocket send is no longer counted as sent; the REST fallback runs.
- net:
af_xdpon virtio_net receives every line. - bybit: a rate-limit or signature e...