Data and slices
The toolbar picker that lists every runnable series in the store — bars, then ticks — discloses what is recorded but cannot be replayed, and never lets a failed scan wear an empty store's clothes; and the Data tool that browses the whole inventory.
A Studio run needs a slice: one venue, one or more symbols, a kind, a range. Two surfaces produce
one. The picker in the toolbar (crates/vike-studio/src/picker.rs's SlicePicker) is the
authority on what is runnable; the Data tool (crates/vike-studio/src/data_browser.rs's
DataBrowserPane) browses everything the store holds, and a click there feeds the picker.
What the picker lists
SlicePicker::refresh enumerates the store through HistStore::list_series — the trait, so a
remote RPC store lists exactly like the local one — and the three filters it applies live once in
crates/vike-studio-core/src/run.rs. Two families are pickable, in this order:
- Bars — every
kind=bar(venue, symbol, interval)(bar_series), picked as aSliceKind::Barsslice and replayed through the strategy engine; shown asbinance · BTCUSDT · 1m. - Ticks — every
(venue, symbol)with a recorded series inREPLAYABLE_TICK_KINDS, which isquote,tradeandbook(tick_series), picked as aSliceKind::Ticksslice and replayed through tick replay. One row per pair: the replay scans all three lanes for a symbol and merges them, so a symbol recorded as quotes and trades must not appear twice. Shown aspolymarket · TKN · ticks.
The picker's header records that before the tick family existed, tick series were listed nowhere and the Studio had no tick path at all.
A third family is disclosed without being pickable: instruments the store holds only as
kind=depth (depth_only_series). They render greyed under the pickable rows and as a
⚠ depth-only chip in the toolbar, with DEPTH_NOT_REPLAYABLE on hover — placed on the surface
because the person who needs it is staring at a picker that does not list an instrument they know
they recorded:
Recorded, but not replayable.
kind=depthis the CONFLATING L2 lane — periodic full snapshots with every intermediate book state discarded — and a backtest over teleporting depth reports fills it could never have got, so the tick replay reads the lossless quote/trade/book lanes only. Record one of those for this instrument to make it runnable.
tick_series's doc gives the two independent reasons the arm is refused even though it would
compile: the replay has no depth lane to read, and folding depth into the book lane would hand a
strategy conflated snapshots under the name of a lossless book. The depth and book layouts in
the store kinds are the store's own statement of that difference.
Range and extra symbols
The picker loads the whole series range — TsRange::all(); the header names a date-range
sub-picker as a follow-up. A tick pick can carry extra symbols: the + symbols (a, b) box beside
the combo folds a comma-separated list into one tick slice, deduplicated, so a cross-instrument
tick strategy gets all its series in a single run. The box is inert for a bar row, deliberately:
multi-symbol bar runs need aligned bar counts, which a free-text box cannot promise, and
load_slice_bars rejects a misaligned set with a readable error rather than letting the engine's
own assert panic a worker thread.
A tick slice over a remote store runs remotely
With a RemoteHistStore, a tick slice on the Local backend is refused before dispatch: "tick
slices over a remote store run remotely: switch Backend to Remote — a local run would have to pull
the raw tick tape over the wire." crates/vike-studio/src/remote.rs's remote_store_tick_refusal
is the rule, and it never refuses a local store, a bar slice (its load_bars read is a small served
verb, not the tape), or the Remote backend itself. See Remote runs.
A failed scan is not an empty store
The picker's header carries the hazard in its own words: an enumeration that failed and a store
that is genuinely empty are different facts, and this picker renders them differently. It used to
unwrap_or_default() both lists, so a store that could not be read drew the same empty combo — and
the same "no data in store" text — as one holding nothing, and the operator read "backfill some
history" off a surface whose real problem was that the datahub had gone away.
So the combo has four states, not two: series scan failed (plus a ⚠ scan failed chip whose
hover carries SERIES_SCAN_ADVICE — fix the store, and for a remote datahub, is the server up? —
then ⟳ Refresh), no data in store when nothing at all is recorded, nothing replayable when the
store holds only depth, and select data…. The empty results panel asks the same question in the
same order.
Refresh is a one-shot walk, on open and on ⟳ Refresh, never per frame. One thing it cannot do: the store root is resolved once at startup, so changing the environment variable and clicking Refresh does nothing — the Data pane's comment says so where the old hint used to suggest it.
The Data tool
The Data tab renders the same venue → symbol → series catalog the Data Manager's Stored tab
renders — vike_data_manager::stored_catalog_ui, the de-duplicated extraction — so what you see
here is the catalog: Symbol | Kind | Coverage | Rows | Size |
Updated, one rollup header per venue, sortable columns. DataBrowserPane::refresh walks the full
inventory, every kind and not just bars, through HistStore::inventory, a manifest-only read with
no data scan that the remote store serves over RPC. The grid's natural width is about 690 px
against a 340 px panel, so it scrolls horizontally rather than squeezing its fixed cells into a
broken clip.
Click a bar-series row and the shell selects it as the run slice through
SlicePicker::select_by_key. A tick-series row, which carries no interval, yields nothing here —
there is no DataSlice for it through this route yet; pick ticks from the combo. An inventory scan
that fails renders "Inventory scan failed" with the reason, never the "no data yet" hint; an empty
store says to backfill history — the Data Manager's Backfill,
or vike-backfill — then Refresh.
The editor
A code editor bound to the strategy source, compiled on every change through the same path Run uses, with the verdict as a chip, an inline banner naming the line, and an amber dot while the buffer has drifted from its last save.
The indicators pane
Browse the indicator registry by category, set an indicator's parameters on sliders, and preview it over the picked slice's bars — a synchronous compute the pane asks the shell for, because the pane itself never touches the store.