Simulator-only strategies
The 7 strategy names a backtest resolves that a live daemon cannot, each with the registry's own reason — plus the script arm that resolves by path, not by name.
A backtest profile can name more strategies than a live daemon can. The portable roster —
the registry, one page per name under
templates — is the set vike_strategy::strategy_by_name
resolves anywhere. The 7 names below resolve only inside the
backtester: each reads something only the simulator has (a schedule, a cash gate, an attached stop
the fill loop resolves), and the registry records the reason in its own words so that promoting one
is a factual claim somebody can check rather than an opinion.
The failure this table prevents is a SILENT one: a strategy whose input never arrives mounts cleanly, logs nothing unusual and simply never submits. That is the class of live-versus-backtest divergence Vike Trader keeps a ledger of, and it is precisely the class an operator discovers days later.
Simulator-only strategies
| Name | Why it is simulator-bound |
|---|---|
rotation_top_k | simulator-bound: reads the SimBroker symbols/schedule fields directly |
bracket_per_symbol | simulator-bound: measures the attached protective stop the SimBroker fill loop resolves |
gated_weights | simulator-bound: drives the SimBroker cash-gate weight submit argument |
caps_sizers_mask | simulator-bound: drives crate::sizing::PositionSizer via SimBroker's raw=false submit path (a 999.0 sentinel size) |
tick_pair_mse | simulator-bound: measures SimBroker::position_of against the engine's latency shadow |
cheap_catch_updown_fair_value | lives in THIS crate now (crate::cheap_np) and is still listed here, which is not a contradiction: this table's job is to say why a name the backtest registry owns has no PORTABLE row, and promoting this one needs a PARAM_KEYS entry that fails a gate in BOTH spellings — Declared requires it to submit under param_gates' bar/quote feed and it submits only from on_trade_tick, while NotEnumerated requires it in vike_tradehub's AS_MAKER_NAMES. Its previous reason — reaching crate-internal modules — is what the move removed |
sport_copy_follower | lives in the simulator crate: reads a SIGNAL series the replay harness synthesizes (portable in principle, not yet moved) |
The script arm
One more name resolves by name and sits on neither roster: the inline-source script arm. It is listed here because it fails the same question — "can a daemon mount this by NAME?" — for a different reason, which the registry states:
| Name | Where it resolves |
|---|---|
rhai | the SCRIPT path, by NAME: this arm compiles a vike_script::RhaiStrategy from an inline src param and lives in vike-backtest (vike-script sits at the SAME layer rank as this crate, so this crate cannot name it; the src requirement is why it is on no roster). Scripts DO mount live — the daemon takes them by PATH, [strategy] rhai = "\<path>", never through this registry. |
Scripts DO mount live — the daemon takes them by PATH, [strategy] rhai = "<path>", never through
this registry; the scripting tree covers that route.
Where this comes from
vike_strategy::registry::SIMULATOR_ONLY and SCRIPT_ONLY, exported as templates.json at
every release; the backtester's own registry test asserts the first table is exactly the set of
arms it still owns.
Authoring in Rust
The seam a native strategy implements, the reader convention its parameters follow, and the folder that compiles a user strategy into your own binary.
Buy & hold (buy_hold)
The buy_hold portable strategy: what it trades, every parameter key with its TOML type, and whether it mounts live today — rendered from the strategy registry.