Data

Pattern statistics data and MCP server

The pattern statistics of PatternsWizard are free to read: the 178 candlestick and chart patterns found on our data, on each market and timeframe where the test bench found them, as JSON files and through a read-only MCP server for AI assistants.

Data updated November 5, 2026. Historical statistics before fees and slippage. Not investment advice: past results do not predict future ones.

MCP server for AI assistants

Connect Claude, ChatGPT, Cursor or any client of the Model Context Protocol, then ask questions such as “does the bullish engulfing work on crypto?” or “which chart patterns beat chance on forex 4h?”. No key, no account.

Server URL (Streamable HTTP):

https://patternswizard.com/mcp/

Claude Code:

claude mcp add --transport http patternswizard https://patternswizard.com/mcp/

Clients configured with a JSON file:

{
  "mcpServers": {
    "patternswizard": {
      "type": "http",
      "url": "https://patternswizard.com/mcp/"
    }
  }
}

In Claude and ChatGPT, add it as a custom connector with the server URL above.

Tools

  • search_patterns: List tested patterns with their headline result on one market and timeframe. Filter by name, family, direction or verdict, for example: which chart patterns beat chance on forex 4h. Patterns recorded on both breakout sides have no all row and are not listed: read them with get_pattern_stats.
  • get_pattern_stats: Full tested results of one pattern: detection rule, trade rules and every market, timeframe and breakout side measured, with confidence intervals, q-values, verdicts, timing quartiles and the page URL to cite.
  • compare_patterns: Put 2 to 10 patterns side by side on the same market, timeframe and breakout side.
  • get_methodology: How the statistics are computed: principles, the meaning of every field and verdict, and data coverage (assets and date range per market and timeframe).

Raw call, without a client:

curl -s https://patternswizard.com/mcp/ \
  -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_pattern_stats","arguments":{"pattern":"bullish engulfing","market":"crypto","timeframe":"1d"}}}'

JSON files

Files are regenerated with each update of the test bench, and only after the random-walk self-check has passed.

Fields

Shares go from 0 to 1 (0.55 means 55%). Other fractions can be negative or above 1. In a result row, a null value was not measured or does not apply: it is never a zero.

File information

publisher
Who publishes the data.
attribution
How to credit the data when quoting it.
license
License of the data.
license.name / license.url
Its name, and the page that states it.
disclaimer
What the numbers are not: they are historical, before fees and slippage, and not investment advice.
generated_at
Date and time the test bench produced these numbers.
code_version
Version of the test bench code that produced them.
documentation
URL of the page that documents the data.
description
What the data set contains.
mcp
URL of the MCP server.
fields
These definitions.
verdicts
The definition of each verdict.
principles
The principles of the method.
coverage
Price data behind the results, by market then timeframe. There is no all entry.
coverage.symbols
Number of distinct assets on that market and timeframe. A series cut at a trading halt or a price break still counts as one asset.
coverage.first / coverage.last
Date of the first and of the last bar of those assets. Unlike first and last in a result row, these are not occurrence dates: coverage.first comes before the eligibility filters of the principles.
patterns
The patterns found on our data, each with the fields below up to data. A tested pattern that was never found has no entry.

Pattern

id
Identifier of the pattern, also the name of its data file.
name
Name of the pattern.
family
candlestick or chart. Harmonic patterns are in chart.
direction
Direction expected from the pattern: bullish, bearish or neutral. Neutral means no direction is tested: a neutral candlestick pattern has no win10 and no excess10, a neutral chart pattern is measured on each breakout side.
kind
Candlestick patterns only, absent on chart patterns: reversal, continuation or indecision, the type of the pattern. It does not set the direction: some indecision patterns are bullish or bearish.
page
URL of the pattern's page on the site, null when it has no page of its own.
data
URL of the pattern's JSON file.
rule
Detection rule, in words.
entry_rule
Chart patterns only, absent on candlestick patterns: the signal that gives the entry.
stop_rule
Chart patterns only, absent on candlestick patterns: where the stop sits.
trade_rule
Entry and exit rules of the simulated 2:1 trade.
results
Result rows, one for each market, timeframe and breakout side where the pattern was found.

Result row

market
Market: all (the markets that have this timeframe, pooled), crypto, forex, stocks, etf, indices or commodities.
tf
Timeframe of the bars: 1h, 4h, 1d or 1w.
side
Breakout side: up or down on patterns recorded on both sides, which have no all row; all on every other pattern.
n
Number of occurrences detected, after the eligibility filters of the principles.
symbols
Number of distinct assets with at least one occurrence. A series cut at a trading halt or a price break still counts as one asset.
first
Date of the first occurrence.
last
Date of the last occurrence.
win10
Share of occurrences (0 to 1) where price moved in the expected direction 10 bars after the signal bar's close. The expected direction is the pattern's own or, on a row split by breakout side, that side, neutral patterns included.
baseWin10
Same share for random bars of the same assets: what chance alone gives.
excess10
Excess return after 10 bars, the main test. Null with no expected direction (neutral candlestick patterns).
excess10.mean
Average excess return after 10 bars, as a fraction (0.01 is +1%): expected direction times (return minus the average return of the other assets of the same market over the same 10 bars).
excess10.low / excess10.high
95% confidence interval of excess10.mean (block bootstrap: fixed blocks of 13 weeks, 52 weeks on 1w). Null when the occurrences fall in fewer than 5 blocks.
excess10.q
Benjamini-Hochberg q-value (false discovery rate 5%), corrected across every row with at least 30 occurrences and an interval: each pattern, market, timeframe and breakout side. Null on the other rows.
excess10.stable
True when the mean excess return has the same sign on the earlier and the later half of the occurrences, split at their median date.
trade
Result of the simulated 2:1 reward-to-risk trade.
trade.n
Number of simulated 2:1 reward-to-risk trades closed: target hit, stop hit, or closed after 100 bars. Not counted: trades still open at the end of the data, and trades never opened because the stop sat on the wrong side of the entry or less than 0.01% from it, or because the target would have sat at or below zero (shorts with a stop at least 50% above the entry). On a candlestick pattern, an occurrence whose entry order was not hit is not a trade either (see trade.triggered).
trade.winRate
Share of trades that hit the target (twice the risk) before the stop.
trade.expectancyR
Average trade result in R (1 R = the risk of the trade).
trade.baseWinRate / trade.baseExpectancyR
Same trade (same entry, stop and target distances) replayed on 4 random dates of the same asset, in the same trend regime and volatility band when enough dates exist.
trade.hits / trade.stops
Number of trades that hit the target, and number that hit the stop. Trades closed after 100 bars count in neither.
trade.triggered
Candlestick patterns: number of occurrences where the entry order was hit.
trade.timeoutRate
Share of trades closed after 100 bars without hitting the stop or the target.
trade.triggeredRate / trade.invalidatedRate
Candlestick patterns: share of occurrences where the entry order was hit, or where the stop side was hit first.
timing
Quartiles [25%, median, 75%] of the durations and sizes below, in bars unless stated. A measure with no value on the row is null. The measures of closed trades (bars_to_target, bars_to_stop, bars_in_trade, mfe_r, stopped_after_1r) are absent when the row has no closed trade.
timing.bars_to_target
Bars from entry to exit, trades that hit the target.
timing.bars_to_stop
Bars from entry to exit, trades that hit the stop.
timing.bars_in_trade
Bars from entry to exit, all closed trades.
timing.mfe_r
Best move in the trade's favor before its exit, in R, all closed trades.
timing.stopped_after_1r
Single number, not quartiles: share of stopped trades that had first reached +1 R.
timing.bars_to_entry
Candlestick patterns: bars from the signal bar to the entry, occurrences whose entry order was hit.
timing.range_pct
Candlestick patterns: high-to-low range of the pattern, as a fraction of the signal bar's close.
timing.range_atr
Candlestick patterns: the same range in ATR.
timing.duration
Chart patterns: bars from the start of the pattern to the breakout.
timing.height_pct
Chart patterns: height of the pattern divided by the entry price, as a fraction (0.187 is 18.7%).
timing.breakout_delay
Chart patterns: bars from the confirmation of the pattern to the breakout.
timing.bars_to_pattern_target
Chart patterns: bars from the breakout to the pattern's classical target (see breakoutStats.targetHitRate), occurrences that hit it before the stop within 100 bars.
breakoutStats
Breakout measures computed by this bench, on definitions from the classical literature. All null on candlestick patterns. They are descriptive; the false-start rate comes with its random baseline.
breakoutStats.falseStartRate
Chart patterns with a breakout: share of occurrences whose stop was hit before price moved half the pattern's height (H) in the breakout direction, within twice the pattern's length (2 L, at least 5 bars). Paths the data end before 2 L are left out.
breakoutStats.baseFalseStartRate
Same measure on the matched random baseline: the same entry, stop and length, as a share of price, on the same asset at random dates of the same market regime and volatility.
breakoutStats.throwbackRate
Share of breakouts where price moved away, with at least one whole bar beyond the breakout level, then came back within 0.25 ATR of that level within the pattern's length L (throwback after an upward breakout, pullback after a downward one). Not comparable with versions before bench v1 (exact touch within 20 bars).
breakoutStats.targetHitRate
Share of breakouts that reached the pattern's classical target before the stop within 100 bars. The target depends on the pattern: on most chart patterns, the pattern's height projected from the breakout (the pole on flags and pennants); on harmonic patterns, a 0.618 retracement of AD or of CD measured from D (point B on three drives); on a few others, their own rule, such as the line through points 1 and 4 on Wolfe waves, half the pole on a high and tight flag, or the first leg added to point C on a measured move.
confirmRate
Share of formations that were confirmed, all breakout sides together: on a row split by side, the same number as on the opposite side. Null on candlestick patterns and on chart patterns that record no formation.
oneEveryBars
Frequency: eligible bars divided by occurrences (one occurrence every N bars).
verdict
Verdict on the excess return (see verdicts).
verdictTrade
Verdict on the trade versus its random baseline.

MCP server responses

timeframe
Timeframe of the response, same values as tf.
total
Number of patterns that match.
returned
Number of patterns in this response.
query
The pattern as it was asked for.
result
One result row flattened to its key numbers, null when nothing was measured for the request.
result.market / result.tf / result.side / result.n / result.symbols / result.win10 / result.baseWin10 / result.verdict / result.verdictTrade
Same as the fields of the same name in a result row.
result.excess10 / result.excess10_low / result.excess10_high / result.excess10_q
excess10.mean, excess10.low, excess10.high and excess10.q.
result.trade_n / result.trade_winRate / result.trade_expectancyR / result.trade_baseWinRate / result.trade_baseExpectancyR
trade.n, trade.winRate, trade.expectancyR, trade.baseWinRate and trade.baseExpectancyR.
note
Explanation when a request found nothing.
measured
The market and timeframe pairs measured for the pattern, when the request matched none.
error
Why a pattern could not be returned.
candidates
The patterns an ambiguous name matches.

Verdicts

insufficient_data
Fewer than 30 occurrences, or too few independent periods for a test (verdict), or fewer than 30 closed trades (verdictTrade, see trade.n). Numbers are shown but not interpreted.
edge_confirmed
q < 0.05, positive, the same sign in both halves of history, and still positive after estimated costs. For the trade, q, sign and stability apply to its difference with the random baseline, and the cost check to its own result. All published numbers stay before costs: only this verdict deducts them.
edge_negative
q < 0.05, negative, and the same sign in both halves of history: the pattern does worse than chance. No cost check applies.
weak_evidence
p < 0.05, in either direction, but fails at least one of these: the multiple-testing correction, the stability check (excess return and trade alike) or, for a positive result, the estimated costs.
no_edge
No measurable difference from chance.
no_test
The measure does not apply (no expected direction).

A summary of the method is on the home page, and the principles are in /data/methodology.json.

License and citation

The data is © PatternsWizard, all rights reserved. You are welcome to read it, query it through the MCP server and quote individual numbers with a link to the pattern page they come from, or to the data file when the pattern has no page, credited as “PatternsWizard (https://patternswizard.com/), pattern statistics”. To republish the data set or reuse it in a product, contact us.