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.

Falling wedge, all tickers
{
  "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

FieldRead it as
sample_size, wins, lossesResolved trades only. Open trades are excluded, so the counts never flatter a family with a recent run of entries.
win_rate_pctTrades that reached the target, as a percentage of sample_size.
avg_win_pct, avg_loss_pct, median_win_pctPercent 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_pctThe average of every trade, winners and losers together; the expectancy in percent.
avg_r, expected_rThe same expectancy in units of initial risk (entry to stop). Above zero is positive expectancy.
profit_factorGross gains divided by gross losses. 1.0 is breakeven.
avg_hold_barsSessions from entry to exit, on average.
backtest_rangeFirst and last trading session in the measurement.
scope, family, symbolfamily 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 /families for all five families at once, no key needed.
  • GET /families/{family}/stats for one family.
  • The get_family_track_record MCP tool, which works without a key.