Concepts
Track records
How the stat block was measured and how to present it without misleading anyone.
A track record is the measured outcome of every detector-confirmed breakout of one kind, over twenty years of daily bars. It comes back on every setup (track_record.family and, when there is enough data, track_record.ticker), on /families and on /families/{family}/stats. The shape is the Track record object; this page explains how to read it and how it was measured.
{
"scope": "family",
"family": "falling_wedge",
"symbol": null,
"win_rate_pct": 54.0,
"sample_size": 1287,
"wins": 695,
"losses": 592,
"avg_win_pct": 8.1,
"avg_loss_pct": -4.2,
"median_win_pct": 6.3,
"avg_trade_pct": 2.4,
"avg_r": 0.41,
"expected_r": 0.41,
"profit_factor": 1.61,
"avg_hold_bars": 11.2,
"backtest_range": ["2006-09-25", "2026-09-25"],
"measured": "Every detector-confirmed breakout … open trades are excluded.",
"summary": "Falling wedge: 1,287 resolved trades from 2006-09-25 to 2026-09-25; 54% reached the target, average win +8.1%, average loss -4.2%, median win +6.3%."
}The rule
Never present win_rate_pct alone. A 54% win rate with an average loss of -4.2% and 1,287 trades is a real edge; the same 54% with an average loss of -12% would lose money, and the same 54% on 11 trades means nothing. The summary sentence carries all four numbers in one line, and it exists so a script or an agent can quote it whole instead of picking one figure. If you build your own sentence, keep the sample size, the win rate, the average win and the average loss together.
The numbers
| Field | Read it as |
|---|---|
sample_size, wins, losses | Resolved trades only. Open trades are excluded, so the counts never flatter a family with a recent run of entries. |
win_rate_pct | Trades that reached the target, as a percentage of sample_size. |
avg_win_pct, avg_loss_pct, median_win_pct | Percent move from entry to exit, averaged over the winners and the losers. The median win is there because a few large winners can pull the average up. |
avg_trade_pct | The average of every trade, winners and losers together; the expectancy in percent. |
avg_r, expected_r | The same expectancy in units of initial risk (entry to stop). Above zero is positive expectancy. |
profit_factor | Gross gains divided by gross losses. 1.0 is breakeven. |
avg_hold_bars | Sessions from entry to exit, on average. |
backtest_range | First and last trading session in the measurement. |
scope, family, symbol | family covers every ticker; ticker is the same measurement for one symbol and carries its symbol. |
How it was measured
measured states the rule in one paragraph, and it is the same for every family: every detector-confirmed breakout in the nightly backtest over the last twenty years of the served universe, one trade per pattern. Entry is the breakout bar's close. The stop is frozen at entry and fills on a touch, or at the open after an adverse gap; a bar that reaches both target and stop counts as a loss. Bullish converging patterns (pennants, triangles, squeezes, bullish wedges) hold to the measured-move target and then trail the 10-day moving average; bearish breaks exit at the target. Win rate is wins over resolved trades, and open trades are excluded. It is a mechanical record of what the rule did, not a claim about a strategy, which is why avg_loss_pct belongs beside the win rate every time.
Family versus ticker
The family record is large (hundreds to thousands of trades) and stable. The ticker record is the same measurement on one symbol and is often small; it appears on a setup only when there is enough history to say anything, else track_record.ticker is null. When both exist, lead with the family and mention the ticker as colour, and say the sample size of each.
Where to get them
- On every setup, in
track_record, so a script never needs a second call to explain a setup. GET /familiesfor all five families at once, no key needed.GET /families/{family}/statsfor one family.- The
get_family_track_recordMCP tool, which works without a key.