Concept · The strategy family
A strategy family is a set of strategy rows that descend from one shared intent — one template, fanned out across symbols, intervals, and leverages. Every row in the family carries the same templateId (a TEXT NOT NULL handle on the strategies table), so the question "which rows came from the same idea?" survives even after the template is expanded into individual (symbol, interval, leverage) leaves.
All 210 strategies in the EMA-cross dossier descend from a single fleet spec (one template, run 83). That is a strategy family at its largest scale: one idea — "EMA crossover" — expanded across 3 symbols (BTC/ETH/SOL), several EMA pairs, 5 leverages (1/2/10/50/100×), two sides (long/short), and an optional volume gate.
Inside that big family sit tighter subfamilies that share more than just the signal. The clearest is the 21/50 · SOL · 1h · long subfamily, where the only thing varying is leverage (a position-size multiplier that scales both profit and loss):
| Strategy | Leverage | Trades | Win rate | The relationship |
|---|---|---|---|---|
| id659 | 1× | 436 | 31.9% | the un-leveraged base |
| id523 | 2× | 436 | 31.9% | same 436 trades, scaled risk |
| id524 | 10× | 436 | 31.7% | same signal, far deeper drawdown |
These rows fire the same trades — the crossover signal doesn't know what leverage you picked. Leverage only scales the PnL and the drawdown on those identical trades. id659 (1×) bottoms at −5.06% drawdown; id524 (10×) at −41.8%. Same decisions, very different survival.
A family lets you check consistency across siblings. If a signal has a real edge, the whole subfamily should agree about it — vary the leverage and the significance verdict should not flip, even though the PnL does. id659 and id523 are both edge-significant on the same 436 trades, which is exactly the kind of cross-sibling agreement that makes an edge more believable. This is an anti-selection-bias check: it stops you from cherry-picking the one leverage that happened to print the prettiest number, because the family forces you to look at all of them at once.
Before Phase 125, strategies were symbol-independent templates that fanned out across ENABLED_SYMBOLS at registration time. After Phase 125, each strategy row is one (symbol, interval, leverage) leaf. The family identity — "these N rows came from the same intent" — would have been lost if not captured at row-creation time. templateId preserves it.
templateId is assigned/api/strategies (live spawning): Backend mints one UUID per request via crypto.randomUUID(). Every row produced by the cartesian expansion intervals × leverages × symbols shares that UUID. The frontend never sends or sees a templateId pre-write; the response includes it for any future grouping client-side.ENABLED_SYMBOLS entry) inherited the same UUID. This means a single pre-Phase-125 row that ran on three symbols collapses into three rows in one family.Phase 125 deliberately ships no family UX:
groupBy=family toggle.The leaderboard ships flat (one row per leaf) — by design. The pain of scanning a large flat fleet motivates Phase 128's grouping work.
Phase 128 owns family-rollup UX. The expected affordances:
groupBy=family toggle in the leaderboard collapsing siblings into one banner row.subgroupBy=symbol (or interval, or leverage) for nested rollup.Related concepts
See it in a real result →Put it to the test
Spawn your variant, run it on the same engine, and read the edge-significance verdict — before you risk real money.