BotStudio9
Trading Agent
Featured

Cross-Venue Trade Flow Engine - Personal or Commercial

Cross-venue trade flow - 0.25μs, 4.4M/sec. Fee-aware execution across venues, one worker per core, 5 retries, durable journal. Native C++20 for high-frequency screening. Full source, runs offline. Own it or subscribe - try live below.

Latency (measured)
0.23 µs
Throughput (measured)
4.8M/sec
Price
$249

Measured on win32-x64 (ZachsNitro · 13th Gen Intel(R) Core(TM) i5-13420H · 12 threads) · 2026-10-11 · 400,000 iterations · one tick: book update + z-score + edge + risk check · per-task p50 0.2 µs, p95 0.3 µs, p99 0.3 µs

Live on this site's server: 0.11 µs · 13.9M/sec, median of 1 terminal run of bot benchmark (latest 2026-09-28, linux-x64 (botstudio9 server)). A different, smaller machine than the figure above, so expect it to differ.

About this bot

One deal executes in 0.25 microseconds - 4.4M/sec. Not Python. Native C++20.

Built for high-frequency screening and fee-aware execution across venues. The same binary running live in the terminal below is the binary you download.

WHAT IT DOES: Cross-venue trade flow engine. One deal (amortize + evaluate, parse excluded) - 0.25μs mean / 4.4M deals/sec measured, 5,000 iterations (2026-09-25). - Fee-aware routing across venues - Pro tier: one worker per core - 5 retries, durable journal - Fully offline, no API rate limits

WHAT YOU GET: - Full C++20 source - not obfuscated - CMake build: Windows / Linux / macOS - Worker-per-core, retry logic, journal persistence - README + BENCHMARKS + full source - The real engine - not a wrapper

TWO WAYS TO BUY:

BUY ONCE - Own it forever Personal $249 - one person, one deployment, personal trading only Commercial $999 - one org, any staff, up to 3 deployments, client services allowed

SUBSCRIBE - Always updated Personal $79/mo - personal use + all updates + support while active Commercial $149/mo - commercial use + priority support + all updates + fee-model updates

No source resale. No white-label. Set by true-worth calculator.

Try it: Run the trade flow in the TEST IT terminal below - 4.4M/sec on your hardware.

Code preview

first 100 lines of src/arb.cpp - c++20 - 51 files - 5,915 lines in the archive
src/arb.cppc++20
1#include "bs9/arb.hpp"
2
3#include <algorithm>
4#include <cmath>
5
6namespace bs9 {
7namespace {
8
9constexpr double kBps = 10'000.0;
10
11} // namespace
12
13double ArbEngine::net_edge_bps(const ArbConfig& cfg, Venue buy, double ask,
14 Venue sell, double bid) const {
15 if (ask <= 0.0 || bid <= 0.0) return 0.0;
16
17 const VenueFees& buy_fees = cfg.fees[static_cast<std::size_t>(buy)];
18 const VenueFees& sell_fees = cfg.fees[static_cast<std::size_t>(sell)];
19
20 // Cost of acquiring one unit, and proceeds from selling it.
21 const double cost = ask * (1.0 + buy_fees.taker);
22 const double proceeds = bid * (1.0 - sell_fees.taker);
23
24 const double transfer =
25 cost * (buy_fees.withdrawal_bps + sell_fees.withdrawal_bps) / kBps;
26
27 return ((proceeds - cost - transfer) / cost) * kBps;
28}
29
30std::optional<ArbSignal> ArbEngine::on_tick(const Tick& tick) {
31 const nanos t0 = now_ns();
32 ++ticks_;
33
34 const SymbolId id = books_.intern(tick.symbol);
35 if (!books_.apply(id, tick.venue, tick.quote)) return std::nullopt;
36
37 auto signal = evaluate(id, t0);
38
39 latency_.record(now_ns() - t0);
40
41 if (signal) {
42 ++signals_;
43 if (handler_) handler_(*signal);
44 }
45 return signal;
46}
47
48std::optional<ArbSignal> ArbEngine::evaluate(SymbolId id, nanos ingest_ts) {
49 if (!books_.has_both_sides(id)) return std::nullopt;
50
51 ArbSignal best;
52 double best_edge = cfg_.min_edge_bps;
53 bool found = false;
54
55 for (std::size_t b = 0; b < kVenueCount; ++b) {
56 for (std::size_t s = 0; s < kVenueCount; ++s) {
57 if (b == s) continue;
58
59 const auto buy_venue = static_cast<Venue>(b);
60 const auto sell_venue = static_cast<Venue>(s);
61 const Quote& buy_q = books_.quote(id, buy_venue);
62 const Quote& sell_q = books_.quote(id, sell_venue);
63
64 if (cfg_.max_quote_age_ns != 0) {
65 const nanos oldest = std::min(buy_q.local_ts, sell_q.local_ts);
66 if (oldest != 0 && ingest_ts > oldest &&
67 ingest_ts - oldest > cfg_.max_quote_age_ns) {
68 continue;
69 }
70 }
71
72 const double edge =
73 net_edge_bps(cfg_, buy_venue, buy_q.ask_px, sell_venue, sell_q.bid_px);
74 if (edge <= best_edge) continue;
75
76 // Size to the thinner side of the trade.
77 const double qty =
78 std::min({buy_q.ask_qty, sell_q.bid_qty, cfg_.max_qty});
79 if (qty <= 0.0) continue;
80
81 best_edge = edge;
82 found = true;
83
84 best.symbol = books_.name_of(id);
85 best.buy_venue = buy_venue;
86 best.sell_venue = sell_venue;
87 best.buy_px = buy_q.ask_px;
88 best.sell_px = sell_q.bid_px;
89 best.qty = qty;
90 best.gross_edge_bps =
91 ((sell_q.bid_px - buy_q.ask_px) / buy_q.ask_px) * kBps;
92 best.net_edge_bps = edge;
93 best.expected_pnl = (edge / kBps) * buy_q.ask_px * qty;
94 }
95 }
96
97 if (!found) return std::nullopt;
98
99 best.decided_at = now_ns();
100 best.decision_latency_ns = best.decided_at - ingest_ts;

This is the real file from the archive you receive, with your listing's metadata already substituted.

What is in the archive

  • .gitignore
  • CMakeLists.txt
  • NOTICE
  • README.md
  • THIRD_PARTY_LICENSES.md
  • bench/latency_bench.cpp
  • config/fees.json
  • config/model.json
  • config/risk.json
  • config/update.pub
  • data/sample_session.csv
  • data/sample_ticks.csv
  • docker/Dockerfile
  • include/bs9/arb.hpp
  • include/bs9/book.hpp
  • include/bs9/build_identity.hpp.in
  • include/bs9/clock.hpp
  • include/bs9/coloc.hpp
  • include/bs9/ed25519.hpp
  • include/bs9/exec.hpp
  • include/bs9/feed.hpp
  • include/bs9/json.hpp
  • include/bs9/ml_signal.hpp
  • include/bs9/risk.hpp
  • include/bs9/session.hpp
  • include/bs9/spsc_ring.hpp
  • include/bs9/types.hpp
  • include/bs9/update.hpp
  • python/signal_model.py
  • scripts/deploy.sh
  • src/arb.cpp
  • src/book.cpp
  • src/coloc/coloc.cpp
  • src/ed25519.cpp
  • src/exec/exec.cpp
  • src/feed_replay.cpp
  • src/feed_uws.cpp
  • src/json.cpp
  • src/main.cpp
  • src/ml/ml_signal.cpp
  • src/risk/risk.cpp
  • src/update.cpp
  • tests/test_arb.cpp
  • tests/test_enterprise.cpp
  • tiers/basic/main.cpp
  • tiers/enterprise/README.md
  • tiers/enterprise/main.cpp
  • tiers/pro/main.cpp
  • tiers/starter/main.cpp
  • wasm/trading-agent.cpp
  • wasm/wasm_json.hpp
  • LICENSE.txt
  • bs9-manifest.json

Licence options

Every licence ships the same source. What differs is how far you may deploy it and whether you may put your own brand on it.

Personal is for one person on one deployment, not for business use. Commercial costs more because it covers your whole organisation on up to 3 deployments, including services you sell to your own clients: the same code, with the rights a business needs.

This listing is $249 — Standard build tier. The price decides what is in the archive; the licence marked below decides what you may do with it, and is the one that ships in your LICENSE.txt.

LicencePriceDeploymentsWhite-labelIncluded
Personal - Single deployment
This listing
$249 one-time1No
  • 1 person, 1 deployment
  • Personal, non-commercial use
  • No client resale
  • No white-label
Commercial - Team use
$999 one-time3No
  • Up to 3 deployments
  • Any number of users in one organisation
  • Commercial use, including services you sell
  • No source resale or sublicensing
  • No white-label
Agency Bundle - 5 Client Pack
$5,000 one-time
(all bots · contact sales)
Email to buy
5No
  • Up to 5 client deployments
  • Per-client keys
  • Agency use allowed
  • Email support
  • No white-label
Agency Unlimited ($7500 one-time)
$7,500 one-time
(all bots · contact sales)
Email to buy
UnlimitedNo
  • Unlimited deployments
  • Unlimited keys
  • Agency use allowed
  • Priority support
  • All future updates
  • No white-label
Enterprise / White-label (Custom)
CustomRequest a quoteUnlimitedYes
  • Everything in Agency Unlimited
  • Full white-label with your logo
  • Custom domain
  • Source code option
  • Dedicated support
  • Custom SLA

Personal and Commercial are sold here. Agency and Enterprise cover every bot in the catalogue and are arranged by email: use the button on that row and we reply with a payment link. Questions first? Contact us.

Enterprise is quoted rather than listed. The licence that ships in your archive's LICENSE.txt is the one marked above. Licence prices are what each grant is worth; checkout charges this listing's price, once.

Questions before you buy

+Can I try it before I buy?
Yes. The live terminal on this page runs the same engine the download ships, on our server. Paste your own numbers into it; nothing you type is kept.
+Does it run on Mac or Linux?
The download includes a ready-to-run program for Windows, Linux, macOS.
+Can my team use it?
Personal is 1 person, 1 deployment, not for business use. Commercial covers one organisation: any number of its staff, up to 3 deployments, commercial use including services you sell. Need more deployments or client use? The Agency licences in the table above are arranged by email.
+Can I use my own fees and risk limits?
Yes. Fees, risk limits and signal thresholds are JSON files in config/. A missing file falls back to the defaults and says so; an invalid one stops the program rather than trading on defaults.
+Are updates included?
You buy this version with its full source, and it keeps working without us. Personal and Commercial do not include future updates; Agency Unlimited does.
+What if it does not work?
Before you download, you can have a full refund within 14 days for any reason. After download, you are refunded if the archive does not build from its own README, a feature named on the listing is missing or broken, or the licence does not match - a fix is offered first. Full terms: refund policy.
Read from the source

What's inside

Trading agent: 149KB of source (3,489 lines of logic, 26 files), plus the shared agent core. Everything below is counted from that code — nothing on this list comes from the listing text.

12 commands you can run
  • bot --benchtime the decision path on this machine
  • bot --benchmarkthe standard measurement (200 passes, sample file)
  • bot --capsreport colocation capabilities
  • bot --feesfee schedule [config/fees.json]
  • bot --livelive feeds (needs -DBS9_WITH_UWS=ON)
  • bot --max-skew-msskip crosses with quotes this far apart [1000]
  • bot --modelz-score thresholds [config/model.json]
  • bot --pinpin the decision thread to a core
  • bot --quietsummary only
  • bot --replayreplay a tick file (--file is the same)
  • bot --riskrisk limits [config/risk.json]
  • bot --self-testcheck every module, exits 0 or 1
Tests
181 checks across 2 suite(s), all passing (run 2026-10-04)
Output
readable text · JSON
Speed
Measured: 0.23 µs mean / 4.8M/sec — win32-x64, 2026-10-11, 400,000 iterations, one tick: book update + z-score + edge + risk check. The live test below runs on this site's server, which has fewer cores than the build machine, so its timings are lower than this.
What you get

What's inside the zip

The download is the real program and its full source, yours to keep. The terminal further down this page is a separate, read-only demo copy of the same engine: it keeps nothing and cannot write files.

trading-agent/
  (the START files are one folder up, beside App/; everything below is in App/)
  START_HERE.bat / start_here.command / start_here.sh   opens the workspace in your browser
  workspace/                   the workspace page, with the engine and a terminal inside it
  START_TERMINAL.bat / .command / .sh   the program itself, in a terminal window
  COMMANDS.txt                 every command, with examples
  README.md                    build, run, test, licence notes
  bin/bot.exe (or bot-macos / bot-linux)   the program, ready to run
  src/, include/ ...             the full C++ source you own
  LICENSE.txt                  what your licence allows

How it works

  1. 1Download the zip

    Unzip it anywhere. No installer, no account.

  2. 2Double-click START_HERE

    Or run the commands below from a terminal in that folder.

  3. 3Read the output

    It replays the sample session through the z-score gate, the risk layer and the fill simulator, and prints every trade, every refusal and the session PnL.

All commands

Click one to put it in the live terminal below, or to copy it for the download. The full list, with every option, is COMMANDS.txt in the zip and bot --help.

  • The full pipeline on the synthetic sample session
  • Summary only
  • The standard measurement: the same one the published figure comes from
  • Time the decision path per tick on this machine
  • Check risk, execution, the z-score and colocation
  • Every flag

Live output

Captured from a real run of bot --replay data/sample_session.csv on linux-x64 (testit demo engine, same source as the download), 2026-09-28. Unedited.

  • traded : 2
  • risk blocks : 2 (edge-too-thin 2)
  • net pnl : 132.57
  • decision : p50 <= 200 ns, p99 <= 400 ns over 2000 ticks (bucket upper bounds)
Full output
$ bot --replay data/sample_session.csv
fees        : config/fees.json
model       : config/model.json (entry |z| 3.5, exit 0.525, warm-up 30)
risk        : config/risk.json
feed        : data/sample_session.csv

SKIP  BTC-USDT  z=-11.18  gross 27.68bps  net -42.32bps  risk edge-too-thin: net edge -42.32 bps is below the 1.00 bps floor
SKIP  ETH-USDT  z=12.11  gross 34.60bps  net -35.40bps  risk edge-too-thin: net edge -35.40 bps is below the 1.00 bps floor
TRADE BTC-USDT  z=-13.88  buy binance @ 64836.79  sell coinbase @ 65569.68  qty 0.3450  net 42.40bps  fees 158.10  pnl 94.75  (within limits)
TRADE ETH-USDT  z=13.81  buy coinbase @ 3153.76  sell binance @ 3183.43  qty 5.0000  net 23.64bps  fees 110.53  pnl 37.82  (clamped from 18.93 to 5.00)

ticks       : 2000
stretched   : 4 (|z| at or beyond 3.50)
traded      : 2
risk blocks : 2 (edge-too-thin 2)
fees paid   : 268.63
net pnl     : 132.57
decision    : p50 <= 200 ns, p99 <= 400 ns over 2000 ticks (bucket upper bounds)

What the price buys

  • ✓ The full C++ source - you own your copy
  • ✓ A single ready-to-run program, no dependencies
  • ✓ Pay once and keep it
  • ✓ Runs offline, on your machine; your numbers never leave it
Personal
$249

One person, one deployment, personal use. The same program and source.

Commercial
$999

One organisation, any number of its staff, up to 3 deployments, commercial use - including services you sell. No source resale, no white-label.

Both licences ship the identical archive; the difference is what you may do with it.

New · one-click workspace

Unzip, double-click START_HERE, and it opens in your browser.

START_HERE opens workspace.html from your own disk: no install, no server, no network. The engine runs inside the page (the same C++ code as the program, compiled to WebAssembly) with its results, charts and a terminal on one screen.

The Cross-Venue workspace as it opens: an empty paste box, and each panel waiting for a replay
As it opens: blank. No trades, no P&L, nothing replayed until you load a session.
The same workspace after loading the synthetic sample session: 2,000 ticks, 2 trades, 2 risk blocks and the cumulative P&L
No live market data - example shown after loading replay (the synthetic sample session that ships with the program), all figures computed locally.
  • Measured 0.23 µs for one tick: book update + z-score + edge + risk check (4.8M/sec): the native program, 13th Gen Intel(R) Core(TM) i5-13420H · 12 threads, 2026-10-11. Your browser runs the same code more slowly, and the workspace shows its own time next to it.
  • Blank until you run it, then only real numbers. It opens empty. Every figure after that is computed by the engine while you watch, or is a dated measurement. No live market data, no pre-loaded trades, no invented live counters.
  • Nothing to set up. No Python, no pip packages, no admin rights, no account. It opens a web page; it does not install software or open a port.
  • Terminal inside the page. Type bot --replay data/sample_session.csv and the engine prints what the program prints, and fills the panels. The full program is in the same folder: START_TERMINAL runs it in a terminal window.
  • One-time licence available.

On screen: Replay a session · Session · Trades and refusals · Cumulative P&L, USDT · Risk blocks by reason · Terminal

Real engine · server-side

TEST IT - LIVE RUN

Runs the Cross-venue arbitrage engine (Enterprise) this listing ships - compiled C++, on our server, right now. What you see is its real output and real timing. This server has fewer cores than the machine the listed figures were measured on, so expect lower numbers here. data/sample_session.csv is synthetic (labelled in its header): a noisy Binance/Coinbase basis with four injected dislocations. The live feed is not available here. Nothing you run is stored.

All commands →
bs9@botstudio9:~/cross-venue-trade-flow-engine-personal

Pick a command below or type one, then press Enter. One command per run; this is a read-only demo copy of the engine, and nothing you type is kept.

$
Commands to try - click to load, or copy
  • Check risk, execution, the z-score and colocation
  • The standard measurement: the same one the published figure comes from
  • The full pipeline on the synthetic sample session