⚠ INTERNAL — Operator UX mock · Design preview of V2 development path · demo-wired ≠ production-live · back to dev guide
Strategies/Templates/Bot controls
Polygon · pUSD 10
📓 Developer Guide 📋 Reason Codes 📈 Shadow Mode
JD John Doe · Admin
OperatorReady-made rule sets you can copy and change, instead of starting from a blank page.When: When you need a fast-start for a new market type.
Details
What this page is forBrowse pre-built strategy templates ready to clone and customize.
When to use itWhen you need a fast-start for a new market type.
Strategies · Templates · developer reference

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.

1The question

One line, in words, ending in a question mark. “How tight do you want to quote?” Not “Spread configuration”.

2The why

Two sentences on what the trade-off actually is. If there is no trade-off, the parameter should not be exposed.

3The control

Chosen from the vocabulary below to match the shape of the decision, never a bare number field.

4The consequence

A green line restating the answer as an outcome. “You will offer to buy at 41¢.” Updates live.

5The warning

An amber line, shown only when the current answer is risky, and always specific: which reason code, how often.

6The escape hatch

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…UseBecause
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.

risk.killswitch demo Stops everything, now.
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.
Can emit: RISK_KILLSWITCH_TRIPPED
risk.compliancegate demo Refuses anything without a valid builderCode or from a blocked place.
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.
Can emit: RISK_GEOFENCE_BLOCK DISC_BUILDERCODE_UNSET
risk.markethaltguard demo Refuses to trade a market the venue has paused.
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.
Can emit: RISK_MARKET_HALTED
risk.stalebookguard demo Refuses to trade on a price that has stopped updating.
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.
Can emit: RISK_BOOK_STALE_15S INTEL_STALE_BOOK INTEL_FEED_GAP INTEL_TIMESYNC_DRIFT
risk.marketqualityguard demo Refuses markets that are too thin or too wide to be worth quoting.
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.
Can emit: RISK_SPREAD_WIDE INTEL_DEPTH_THIN
risk.exposureguard demo The most you can have riding at once.
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).
Can emit: RISK_EXPOSURE_CAP_HIT
risk.drawdownguard demo When to stop for the day.
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.
Can emit: RISK_DRAWDOWN_TRIGGERED
strat.maker_tight demo Quotes both sides and earns the spread.
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.
Can emit: STRAT_MAKER_QUOTE_INSIDE
exec.smartrouter demo Decides how to get the trade done.
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.
Can emit: EXEC_ROUTE_CTFV2_ACCEPTED

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.

disc.headline_scanner frozen Watches the news for words that move a market.
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.
Can emit: INTEL_NEWS_BURST DISC_MARKET_NEW
intel.macro_sentiment frozen Reads macro data and says which way it leans.
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.
Can emit: INTEL_CORRELATION_BREAK INTEL_SIGNAL_LATE INTEL_BRIER_DEGRADE
disc.outcome_resolver frozen Works out what a market actually settled at.
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.
Can emit: INTEL_ORACLE_DIVERGENCE INTEL_ORACLE_SETTLE_PENDING DISC_RESOLVED_LATE

Rules, so this does not drift

No units in labelsIf 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 count8% is abstract. “8% — about 400 pUSD” is not. Percentages always carry their absolute.
Every warning names its reason codeSo the user recognises it later in the log, and so support can grep for it.
Every disabled control says whyGreyed with no explanation is the most expensive pixel in any product.
Guards never trapA 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 contractThe 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.
← Templates The click-through → All bots Reason codes →
Polytraders Operator UX Mock · INTERNAL · demo-wired ≠ production-live · how this works · words we use · the plan · reason codes · shadow-mode pipeline
⚙ Page Configuration
Current page settings
Loading configuration…