openport 0.3.1
Built from 516518c.
Install
- Homebrew (Apple silicon):
brew tap 38st/openport https://github.com/38st/openport, thenbrew install openport.brew services start openportruns it on 127.0.0.1 with its data under Homebrew'svar/openport;brew info openportsays where to find the token link. - Docker (amd64 and arm64):
docker run --rm -p 127.0.0.1:8080:8080 -v openport:/var/lib/openport ghcr.io/38st/openport:0.3.1, then open the link it prints, which carries its write token.docker-compose.ymlin the repository does the same with a restart policy and a health check. - Linux archives (amd64 and arm64): need OpenSSL 3, zlib and zstd (
apt install libssl3t64 zlib1g libzstd1on Ubuntu 24.04). Unpack one and runbin/openportd. - macOS archive (Apple silicon): needs nothing installed. Unpack it with
tar -xzfand runbin/openportd. Unpacked in Finder, macOS may refuse to run it as from an unidentified developer;xattr -dr com.apple.quarantineon the folder allows it.
Then open http://127.0.0.1:8080. openportd --help lists every option. SHA256SUMS covers every archive.
What's new since 0.3.0
Backtests
- Run a playbook over many days and see whether it passes the evaluation plan. Each day runs a fresh account on recorded days, imported days or seeded scenario days. Reports give pass rate, expectancy, win rate, the distributions of daily P&L and drawdown, the worst days, and each day's kept journal, which
openportd --verify-runchecks. - The same inputs and seed give byte-identical reports. Run it from the Backtest page,
openportd --backtest,/api/backtestsor the Python client. Results are simulated trading, not predictions.
Past days from your data provider
openportd --import-day databento|thetadata --date YYYY-MM-DDfetches one trading day's option chain from the provider's historical API, with your own key, and writes a recording that Replay plays. The data stays on your machine. Neither importer has been run live with a key yet; both follow the providers' documented APIs and are tested against saved responses.
Harder fills, if you want them
- Optional latency and size impact. Latency fills an order against the first quote at or after its market time plus the delay. Size impact charges extra ticks beyond the displayed size. A Conservative preset uses 1,000 ms, one slippage tick and one impact tick per block. Both are off by default, and accounts with them off are exactly as before.
Notifications
- Alerts to Discord, Telegram, ntfy or any webhook for live accounts: fills and rejections, equity near the floor, rule trips, assignments and exercises, staged playbook orders and a stalled feed. Delivery never blocks the engine, and secrets never reach flags, logs or the API. Replays, backtests and the demo never notify.
The demo market as a feed
openportd --provider demoplays the built-in simulated days back to back as the server's own feed, with no data provider and no network access. Each day plays on the next trading date, and a restart resumes after the accounts' last market day. Its default journal is separate from your live one. The README explains how to run a public, watch-only instance; one runs at https://openport-production.up.railway.app.- The terminal shows one "Watch only" notice when the server needs a write token and the browser has none.
- Sandboxes for visitors. With
--sandboxes Non a demo server, a visitor can take their own practice account and trade it, and can't see or touch anyone else's account or the server's settings. Each sandbox has a random token stored only as a hash; creation and orders are rate-limited per client (--client-ip-headernames the real-address header behind a proxy); an unused sandbox is removed with its files after 24 hours. The option is refused with any provider butdemo.
Install
- A Homebrew tap in this repository, a
docker-compose.yml, and opt-in update notices: when turned on under Status > Updates, the browser checks GitHub's latest release at most once a day and shows a notice when it's newer.
Fixed
- Closing prints and settlements could read freed memory while recording closes for several positions. The demo feed's two-day settlement test found it under AddressSanitizer.
- Tests that waited on the clock now wait on the events themselves, so a heavily loaded machine no longer fails them.