Details
Every bot’s controls, and the rules for inventing new ones
The builder has no hard-coded knowledge of any strategy. It renders whatever a bot’s decision manifest declares. So when you add a bot, you are also designing its screen — and this page is the vocabulary you design it from.
The test for every control: can a competent person who has never traded answer this question correctly? If the answer needs a unit, a document, or a conversation, the control is wrong.
The six parts of a bot config screen
Every screen in the click-through has exactly these, in this order. Deviating is allowed but has to be argued for in review.
One line, in words, ending in a question mark. “How tight do you want to quote?” Not “Spread configuration”.
Two sentences on what the trade-off actually is. If there is no trade-off, the parameter should not be exposed.
Chosen from the vocabulary below to match the shape of the decision, never a bare number field.
A green line restating the answer as an outcome. “You will offer to buy at 41¢.” Updates live.
An amber line, shown only when the current answer is risky, and always specific: which reason code, how often.
A collapsed drawer showing exactly what this screen writes into the bundle. Always present, never open by default.
Control vocabulary — pick by the shape of the decision
Left column is the kind of parameter. Do not invent a new control type without adding it here.
| The decision is… | Use | Because |
|---|---|---|
| A threshold with a real cost either way | Slider, value echoed in the user’s own currency, plus a backtest line | Sliders make the range visible. The backtest line converts an abstract number into “this would have happened 3 times”. Never a bare number input. |
| A choice between algorithms or postures | Two or three named cards, each with a measured outcome | The user is not qualified to pick between fourteen parameters, but is qualified to say “I care more about getting filled”. Names, not letters. |
| A money ceiling | Fill-in-the-blank sentence plus a capacity bar against the real wallet | 500 means nothing on its own. 500 shown as 4% of the bar means something instantly. |
| A price or a spread | Draggable handles on a ladder, over the live mid | Spreads are spatial. Basis points are not. Never ask for bps. |
| A set of things to watch | Chip input with a live match preview | The preview is the whole point — the user sees what their keywords catch before they commit. |
| On or off | Switch with an explicit “if off” line | A switch with no stated consequence is a coin flip. Say what turning it off costs. |
| Which markets | Searchable table with skipped rows still visible, each carrying its reason | Hiding ineligible markets generates support tickets. Show them greyed with the reason code. |
| Something the user cannot safely change | Read-only row in a “what the template decided” table | Visible builds trust. Editable builds outages. Show it, lock it. |
| Something with no trade-off | Do not expose it at all | If there is a correct value, set it. Every exposed parameter is a way for the user to be wrong. |
The nine demo-wired bots
These have screens today, because they run today. Note how little most of them ask.
What the user gets
- Nothing. This bot has no user-facing configuration at all, by design.
- The only surface is a big red button on Trader Home and a keyboard shortcut.
- A confirm step that requires typing the strategy name — the one place we deliberately add friction.
What stays out of sight
- Cancel ordering and per-venue timeout budgets.
- Whether to flatten (never automatic; always an operator decision).
- Re-arm policy — admin only, in Settings.
What the user gets
- A jurisdiction list as a multi-select of country names, not ISO codes.
- A single read-only line showing the builderCode bound to this account.
- That is it. Everything else is policy, not preference.
What stays out of sight
- The geofence provider and its cache TTL.
- builderCode validation endpoint and retry policy.
- The blocklist itself — users cannot add to it or remove from it.
What the user gets
- One switch: resume automatically when the halt lifts (default on).
- One choice: cancel resting orders on halt, or leave them (default cancel).
What stays out of sight
- Halt detection sources and the debounce window.
- Per-venue halt semantics.
What the user gets
- A slider in seconds, 5–60, labelled “how old can a price be before you stop trusting it”, with a live line: “at 15s this fired 9 times last week”.
What stays out of sight
- Sequence-gap detection, clock-drift tolerance, per-feed thresholds.
What the user gets
- Three named presets — Only liquid markets / Most markets / Anything that moves — each showing how many of the user’s selected markets pass.
- The market table from step 2 re-rendered live, with rows greying out as the preset tightens.
What stays out of sight
- Spread bps thresholds, depth floors, rolling windows.
What the user gets
- A fill-in-the-blank sentence: two amounts and two scopes.
- A capacity bar showing those amounts against the actual wallet balance.
- Three switches for what happens at the ceiling.
What stays out of sight
- Netting rules across correlated outcomes.
- Whether unrealised counts toward the cap (it does).
What the user gets
- One slider, always echoed in pUSD as well as percent.
- A backtest line: “would have stopped 3 times in 90 days”.
- Three switches for what happens when it trips.
What stays out of sight
- Mark-to-market source, intraday reset timing, scope inheritance from parent portfolios.
What the user gets
- A price ladder with two draggable handles over the live mid.
- Three presets (Tight / Balanced / Wide), each with expected fills per day and edge per fill.
- A clip-size slider in pUSD, tied to the exposure cap so the relationship is visible.
What stays out of sight
- Requote triggers, inventory skew, min book depth, cooldown.
What the user gets
- Three named objectives — Get me filled / Balanced / Get me the price — each with the measured fill rate and average slippage from last week.
- Venue switches, each stating the cost of turning it off.
What stays out of sight
- Eleven timing and child-order parameters, all derived from the objective. Exposing them manually flags the strategy for review.
Frozen bots — screens designed, not built
These are specced but not running, so their screens do not appear in the builder yet. A template containing a frozen bot cannot be armed. The designs are here so the screen ships with the bot rather than after it.
What the user gets
- A chip input for words and phrases, with a live preview pane underneath showing the last 20 headlines and whether each one would have matched.
- Source toggles, each with a volume-per-day count.
- A confidence dial with a plain readout: “acts on roughly 4 headlines a week” at the current setting.
What stays out of sight
- Embedding model, similarity threshold, dedupe window, entity-linking rules.
What the user gets
- Source cards the user turns on and off, each showing what it is and how often it updates.
- A single “how strong does the signal have to be” dial with a frequency readout.
- A read-only sparkline of what the signal said over the last 30 days, so the user can sanity-check it before trusting it.
What stays out of sight
- Model weights, feature set, decay half-life, correlation adjustments.
What the user gets
- None during authoring. It appears in Settlement, not in the builder.
- One user-facing choice there: whether to auto-accept the oracle or hold disputed settlements for review.
What stays out of sight
- Oracle sources, divergence tolerance, dispute windows.
Rules, so this does not drift
| No units in labels | If the label needs “(bps)” or “(ms)” to make sense, the control is wrong. Put the unit inside the control and the meaning in the consequence line. | |
| Every number pairs with money or a count | 8% is abstract. “8% — about 400 pUSD” is not. Percentages always carry their absolute. | |
| Every warning names its reason code | So the user recognises it later in the log, and so support can grep for it. | |
| Every disabled control says why | Greyed with no explanation is the most expensive pixel in any product. | |
| Guards never trap | A guard may stop you opening. It must never stop you closing. This is a platform invariant, not a preference, and it is why allow_reduce defaults to true everywhere. | |
| The manifest is the contract | The builder renders the manifest. If a parameter is not in the manifest the user cannot reach it, and if it is in the manifest it must have all six screen parts. No exceptions, no bot-specific special cases in the builder. | |