Changelog
What changed, and what it changed for you
Everything below is on the site now and can be checked there. Entries marked
Correction are the ones that moved a number you may already have read — there are
57 of them, and they are the reason this page exists rather than a marketing post.
Subscribe by Atom feed
— every entry below, corrections included, in a format a reader or a script can watch. No account, no
email address; we do not run an email list at all.
Bought once, improved anyway. Access here is a single payment with nothing to renew,
so this page is the only honest way to show that the thing you bought keeps getting better — and, when
we get something wrong, that we say so in public rather than quietly re-rendering it.
Each entry carries the version it shipped as. The version in the footer of every page is
simply how many of these there are, so it cannot move without a change being described here, and a
change cannot be described here without it moving. You are reading v1.137.
28 September 2026
Correction
v1.137
The calendar feed and the monitor widget quoted the alerts’ record on the narrower range
On 3 September we corrected how the alerts’ forward record is given a range: its occurrences are repeats
of a handful of windows, each chosen once, so the honest interval resamples whole windows and is about twice as wide
as one that treats every occurrence as an independent try. /radar and /compare
moved to it. The calendar feed and the monitor widget, the two places
this record travels without a page around it, kept the narrower range (57–71% today, against 50–78%
counted by window). Both now print the wider one, and choose their own sentences from it: whether it can yet tell the
record from the board’s expectation, and whether it rules out a coin flip. A check fails if either goes back.
27 September 2026
Improved
v1.136
Five tables on the evidence page printed as a line of commas
Since 18 August, the tables in section 4 (streaks, twice),
section 5 (the weekend gap), section 6 (yesterday’s high)
and section 7 (the opening range) showed up as one line of text above an empty header
— “4 hours,75%,70%,24 hours,89%,88%” — because the page generator joined their rows with commas.
The numbers were right and are unchanged; they are back in rows now, and a check fails any page with a table that
has text outside its rows. /compare and /reports also stated the weekend gap as “88%” where section 5
now measures 89%; both now describe the comparison instead of typing a figure.
New
v1.135
Once a market has covered its average daily range, is the day done? No
A new section 34 tests ADR exhaustion — the idea that once today’s range
has covered the 14-day average, the move is spent. A day that reaches its ADR goes a further quarter-ADR more often
than not, and against multiples nobody draws, on the same hours of the day, 1.0× is no ceiling and price turns back
through it no more often than through any other level. The figures are in /data/adr.json,
rebuilt weekly, and a check holds every clause to them.
Improved
v1.134
The blog hub typed the share of rules that lose after costs
The closing note on /blog said “roughly 96%” of the time-of-day rules we
backtested lose after costs. The board’s own tally says 95.3% of 4,252 today — the same figure
/about and /strategies print. The note now reads it from the tally, says it
is measured on the history that chose the rules, and the same check that holds those two pages holds this one.
Improved
v1.133
Section 6 cited its correlations to a section that does not hold them
Section 6 said “section 5 of this page’s companion measurement” puts US30
and SPX500 at r = 0.94. Section 5 is the weekend gap; the correlations live in
/data/correlation.json, which is now what the sentence links. That figure, and the
same one in section 19, were typed; both are now read from the file, and a check holds them
to it. The values are unchanged today (0.94 and 0.93), and so is the point: correlated markets agreeing are fewer
observations than their count.
Improved
v1.132
Three sections on the evidence page carried counts from an earlier week
Section 11 said “the three that do not” beat noise by five times were the
loosest bar at the lowest floors; the curve now has four, one of them at a floor of 500 samples, so the sentence
now names them from the curve itself. Section 10 said “seven agreements are not
seven observations” beside a table where the turn of the month leans up in eight markets.
Section 9 opened on the New York close as “+13.1 points out of sample” where
section 8’s own table reads +13.4. All three are now read from the measurements, and checks hold each one.
No conclusion changed: the threshold result, the day-of-month negative and the one-tick reading all stand.
Improved
v1.131
Two sections quoted other sections with figures those sections no longer print
Section 8 opened by citing the era split as “Section 3 … 73 significant
buckets in the early era against 74 in the late one”. The split is measured in
section 2, and its own table reads 70 against 84 — 73 and 74 were the figures from before
each market was scored against its own average hour. Section 15 quoted section 8’s
ordinary-hour result as +0.55 points where section 8 prints +0.54. Both citations are now read from the
measurements they cite, and a check holds each to its source. The conclusion either way — the grid did not
fade, and ordinary-hour direction is weak out of sample — is unchanged. No measurement moved.
Improved
v1.130
Section 12 said its cost rules were measured out of sample. Their cushions are not
Section 12 ended by saying the rules we push “were measured out of sample”.
Every gross edge and cushion in its table is measured on the first 70% of the history — the part the rule was
chosen on — and being net-positive on the 30% held back is a filter we apply, not a result that survived. That is
the claim the board retracted on 3 September, left standing one page over. The section now
says which history its figures come from. No number moved.
Improved
v1.129
Section 29 stated a pooled figure as if it held in every market
Section 29 said the golden cross’s hit rate sits below “each
market’s base rate at all three horizons”. That is true of the pooled figure, and there only by less than
one standard error. Market by market it is below in 8 of 16 at every horizon — half, a coin. The sentence
now prints both, keeps them apart by name, and chooses its wording from ma.json each
week. The verdict, that the crossing picks no better a moment than a coin, is unchanged. No number moved.
Improved
v1.128
Section 24 said the day boundary does no work. At midnight the pin bar reads above our own bar
Section 24 cuts the trading day at 22:00 UTC and checks that choice by re-cutting at
midnight. It said flatly “the boundary is not doing the work”, beside midnight figures it never judged: re-cut at
midnight, the pin bar’s shape is worth +0.58 points, which is above the +0.54 that
section 8 finds in ordinary hours — the bar this same section uses to judge its own
ladder — and 0.63 points away from the 22:00 figure. The verdict holds on both cuts: no market clears the
significance bar at midnight either, the gap is positive in 11 of 19 markets, and its ladder does not climb. So the
sentence now says the boundary moves the number and not the verdict, and it is chosen from
candle.json each week. Also fixed: a percentile on the page was printed with a
wrong ordinal (“93th”). No number changed.
Improved
v1.127
Section 16 typed the two findings it opens with, and pointed them at the wrong section
Section 16 opens by citing two of our measurements — a big hour is
followed by a big hour, and taking every flagged window would have lost at every holding period — and it
typed both figures and linked them to section 15, the clock test, which is neither. The figures now come from
the files that own them (cluster.json and hold.json,
both rebuilt weekly) and link there, and each clause picks its own wording from the numbers. No number
moved: both were still true.
Improved
v1.126
/compare said we hold nothing finer than five minutes. We publish a 1-minute grid
The "what we are worse at" list on /compare still said we hold
five-minute data on four pairs and nothing finer, three weeks after the 1-minute grid for 28
currency pairs went public on /api. It now says what that grid answers and
what it does not, read from the files' own verdicts: which minutes a pair moves in holds up out
of sample in every pair, and which way a minute leans in none. The FAQ's
answer on one-minute trading is still "no", and now cites that measurement instead of arguing
only from the hourly data. Metals, indices and crypto still have nothing finer than the hour.
Correction
v1.125
Four sections still quoted section 21 as saying our nineteen markets count as seventeen
Run 248 corrected section 21 when its re-run found no inflation it could tell from
none. Four other sections cite it, and all four still quoted its first answer: section 22 said “nineteen markets are
worth about seventeen”, section 27 that section 21 “priced that”, section 30 that it “measured and
found they are not” independent, and section 31 said the same — beside a note about
“the index pair in the table above” when that table no longer holds an index pair. Every citation now says
what section 21 currently finds, and adds what it does not measure: it counts flags on the hour-of-week grid, and the
markets’ hourly returns still correlate as high as 0.94, so agreement on another test is still worth reading with
care. Section 21’s own correlation figures are now read from the file that holds them. The build fails if any
citation disagrees with the interval.
Improved
v1.124
Section 27 called the rollover gap an order of magnitude bigger than any other hour. It is about three and a half times
Section 27 asks whether our definition of an up hour is an artefact of where the bar is
cut, and finds the gap between one bar’s close and the next bar’s open is largest at the 21:00 UTC rollover. The
page said that gap was “an order of magnitude larger than its neighbours”; in the median market it is 3.6×
the next-largest hour, and it was the same when the section was written. The same paragraph said silver’s share of
movement between bars was larger than any other market’s “by a factor of about four” (it is 3.4×), and
assumed without checking that the market with the most movement between bars is also the one losing most flags and one our
quality test distrusts. Today all three are silver, so the sentence was true; it is now built from the file, including the
branches for when they are not, and the build fails if the page and the file disagree. The section’s argument is
unchanged. No number changed.
Improved
v1.123
Section 19 said the US closing hour gets stronger in all three indices when the day is re-cut. In the Dow it does not
Section 19 finds that the last hour of the US cash session holds the day’s high
more often than chance in the three US indices, and that this does not depend on where the day is cut. The sentence was
written when all three strengthened under the 22:00 UTC cut; after later rebuilds the Dow goes from z 2.82 to 2.79 instead,
and it has never cleared our bar of 3, while the heading called all three a clean positive. The finding stands in NAS100
and SPX500. Those clauses, and four others in the section, are now chosen by the numbers in the file, and the build fails
if they disagree. And two of the build’s own checks on earlier corrections here — the one that stops a page describing significance as distance from 50%, and the one that stops a page claiming the missing months are being fetched — had been written with a lost backslash and could not fire; both can now. No number changed.
Improved
v1.122
Section 3 said the non-currency markets sit at or below their usual fix hour. Two sit slightly above it
Section 3 argues that month-end rebalancing is real because it shows up in the
currency pairs and not in gold, silver or the equity indices. That argument stands — none of those four comes near
the bar — but the sentence said all four “sit at or below their ordinary fix hour”, and GER40 reads
110% and silver 105%: inside noise, and above. The sentence was typed when the section was first written; it and the
three clauses beside it (every currency pair leaning up, which way the direction hits point, which market moves most)
are now chosen by the numbers in the table, and the build fails if they disagree. No number changed.
Correction
v1.121
Section 21 still said our markets overlap enough to count as seventeen. Its own re-run says nineteen
Section 21 asks whether nineteen correlated markets are nineteen experiments. When it
was first run the answer was a small inflation of about a tenth, and the page, /reports and
/api were written in those words — “the correction is real”, “read nineteen as
about seventeen”. The test was re-run on 20 September and now reads 0.996×, interval 0.891–1.116:
no inflation we can distinguish from none, and nineteen markets worth about nineteen. The numbers on the page had
updated; the sentences around them had not. They are now chosen by the interval, and the build fails if they disagree
with it. Section 1’s headline is unaffected either way.
Improved
v1.120
Three places said the missing months were being fetched. Nothing has been fetching them since 13 September
/coverage, the /api description of quality.json and the note
inside that file all said, in the present tense, that the whole calendar months missing from our archive were being
asked for again. A repair did start on 12 September; it stalled on the feed’s throttle the next day after a
handful of months, and by 26 September the feed was refusing every request we made. They now say so, and that filling
the months from Dukascopy’s own archive — which our weekly update has used since — would rebuild history
and move numbers, so it will arrive as a Correction. No number changed; the build now fails if any of the three claims
a repair is under way.
Correction
v1.119
Four pages still explained the significance dot as distance from 50%, after we stopped measuring it that way
Since 15 August every window has been scored against its own market’s average hour, not a coin
flip — the US indices close up more often than not across every hour, and against 50% they looked bullish
everywhere. The arithmetic moved; four explanations of it did not. The guide gave the old formula
as the definition of the brass dot, and its worked example said a bucket must sit a stated distance “from
50%” — computed at a looser bar than the dot itself uses, so the example and the dot could disagree about
the same hour. The FAQ said the same twice, section 3 described its era
measure as distance from 50% while computing it from each market’s own average, and all nineteen market
articles called their strongest hour “far enough from a coin flip”. All now describe what is computed, the
guide’s example uses the market’s own average and the same bar as the dot, and the build fails if a served
page describes significance against 50% again. No verdict anywhere changed.
Correction
v1.118
The screener’s note on its own accuracy quoted a noise count from before we changed how we score
/scan works out live how many hits a grid with no structure would return, and its method
note said that figure lands a little above our 4,000-draw simulation: 15.3 against 13.6 at the default
settings. Both numbers dated from before 15 August, when every market began to be scored against its own average
hour rather than a flat 50%. Today they are 6.8 against 5.96 — still above, so the conservatism the note
claims is real, but the figures were more than twice the truth. Both are now computed from the data and checked on
every build, as is the warning below the results (the Sunday reopen is 3.9% of the buckets searched and supplies 6 of
the 20 strongest readings, which had not moved), and the build fails if the live count ever drops below the
simulated one while the note still says it sits above.
26 September 2026
Correction
v1.117
Weekend gaps are charged the spread of the hour they open in: 73% clearing it becomes 55%
Section 5 (does the weekend gap fill?) said only 73% of weekend gaps are
larger than the round trip needed to trade them. That figure charged every gap a flat 3× the weekday
spread — the typed multiple we retired from the dashboard and the screener earlier today, because the Sunday
reopen’s spread collapses across its hours rather than sitting at one level. Each gap is now charged the round
trip of the reopen hour it actually opened in, measured from bid and ask quotes in the ten currency pairs the minute
archive holds; gold and silver, which it does not cover, keep the 3× and the page says so. Most gaps open in the
first reopen hour, the dearest one, so the share clearing its cost falls to 55%. The section’s verdict
does not change — a gap fills no more often than an ordinary move of the same size — it just costs more to
find that out. The old figure is printed beside the new one.
Correction
v1.116
Section 32 stated a share to the decimal that two overlapping intervals cannot support
Section 32 (pivot points) says how much of the naive control’s gap
disappears once a borrowed day’s range is matched to yesterday’s. That share went from 64.6% to 49.9% in
this week’s rebuild while neither gap left its own interval: it is a ratio of two noisy numbers, and the two
arms’ intervals overlap. The page now says so and asks for it to be read as “some of it”. The note
calling the naive control volatility clustering was also printed unconditionally; it now depends on the share
being above zero, and says the opposite if it ever is not. No number moved, and the section’s verdict —
pivot levels do nothing a level slid off them does not — is unchanged.
Correction
v1.115
The alerts’ forward record was re-scored backwards this week, and the sample grew, so nothing flagged it
The forward record of the windows we push went from 83 occurrences to 165 in one
calendar week. One week of new occurrences accounts for a small part of that. The rest is the past being re-scored:
the strategy board was rebuilt on the repaired archive, the set of windows the rail pushes went from 12 to 15, and
the record replays whatever set is current back to the day alerts went live — so it now includes occurrences of
three windows nobody was ever sent, among them the largest single window in the record. Over the period the
previous version had already published, 83 occurrences became 142, and 63.9% became 62.7%. The record also
gained the weeks two markets on the rail had been missing during the September feed outage. We watched for a
record being restated only by its sample falling, the way it did on 3 September, and this one rose. Each
version now carries what it says about the period before it, and a mismatch is listed as a restatement whichever
way it went; the card says this one grew. The same card also said the board's expectation sat inside the record's
range "along with a good deal worse"; at 56.7–71.2% against 58.5% that is 1.8 points, so the sentence is now
worked out from the range. Resampled by window, the record now rules out a coin by 0.4 of a point at its nearer
edge, and one rule dropped moves the headline between 56.9% and 69%.
Improved
v1.114
The history stopped going stale: we buy the data now instead of asking for it
Twelve of our nineteen markets had been standing up to 23.8 days behind, and every page
quoting them said so. The cause was not a broken download. Dukascopy's free endpoint had been refusing us
since early September, and the weekly job's three retry passes — five and ten minutes apart —
ran in full on 26 September and still came back with 0 bars across all nineteen markets: a retry
policy cannot outlast a block that is on us rather than on a symbol. The same vendor sells the same data
through a paid archive that does not throttle, and the weekly job takes that route now. All nineteen
markets came current in 26 seconds. ⚠ Every update is checked before it is written: the days we
already hold are fetched again by the new route and compared bar for bar against the old one, and nothing
is appended if the two disagree. Measured over 10,545 overlapping hours, they match to the last digit on
95.7% of hours, and 0.417% would be counted up rather than down — almost all of it the
23:00 UTC hour, where Dukascopy's own hourly and minute candles do not quite agree about the day's last
close.
Correction
v1.113
A Sunday window is charged what that hour actually cost, and the two markets that never close are charged no reopen at all
Every Sunday bucket on the dashboard and the screener was priced at three
times the weekday spread — one number, typed into three files and never measured. Sunday publishes three hours and
the spread collapses across them: measured on bid and ask minute candles, against each pair's own ordinary hour,
21:00 UTC costs 5.15× a weekday, 22:00 2.82× and 23:00 1.60×. The old figure was below the measurement at the
reopen in 10 of 10 pairs and nearly double it two hours later, also in 10 of 10. The rule also fired on every
market — and BTC/USD and ETH/USD publish all 24 Sunday hours because they never closed, so 48 buckets were charged
triple and told they were the Sunday reopen. Five windows change verdict: BTC Sunday 12:00, 20:00 and 22:00 and
ETH Sunday 22:00 now clear their cost, and USD/JPY Sunday 22:00 no longer does. Where the minute archive does not
reach — the metals, the indices and UK100 — the old multiple stands, and the page now says it is an assumption
rather than a measurement. What we measured.
22 September 2026
Correction
v1.112
The Sunday-open myth page now says the lean is mostly the spread, and derives its numbers
Should you wait for Tokyo? explained the Sunday reopen by cost alone.
Its figures were also typed by hand: USD/CHF closing higher 62.8% of Sunday hours (the grid now says 62.7%),
against "49.8% elsewhere" (that 49.8% is Monday, the control the test actually uses), and EUR/USD quoting
"roughly 1.5–3 pips" there. On bid and ask minute candles EUR/USD's reopen starts at 4.5 pips. Every figure on
that page is now read from the grid and from the spread measurement in section 33,
and the page adds what that section found: in the first hour USD/CHF's bid closes up 62.6% of weeks, its ask
34.0%, and the mid 48.6%, which is inside our bar. The advice still stands, but for a different reason. Waiting
for Tokyo mostly skips a lean that the narrowing spread creates on its own, not a real edge.
Improved
v1.111
A Sunday reopen window on the dashboard now says how much of its lean is the spread
Open a Sunday window at 21:00 or 22:00 UTC in one of the ten FX pairs we hold minute data on, and the
reading used to explain it by cost alone: the spread is wide, so this looks better than it is. It
now also gives that pair's own bid, ask and mid for the first hour of the week. In EUR/USD the bid closes
up 60.3% of the time and the ask 43.6%. The mid is at 52.7%, which does not clear our bar. So the lean
itself is mostly the weekend spread narrowing, not only the cost of trading it. The same window no longer
calls itself the New York close on 35% of days. That label is for a weekday hour, and there is no
New York close on a Sunday. No number moved.
New
v1.110
Our strongest Sunday readings are mostly the spread closing
The Sunday reopen carries some of the most extreme readings in our grid, and in the ten FX pairs we
hold minute data on, every flagged Sunday window leans up. Our hourly feed records only the bid.
The reopen has the widest spread of the week, and it narrows through the first hour, which lifts the bid
even if the price does not move. So we ran the same bid-and-ask test as the New York close, in reverse.
In the reopen hour the bid rises past our bar in 10 of 10 pairs and the ask falls past it
in 9. Two hours later, once the spread has settled, the two agree again. The mid leans up in only a few
pairs. Section 33 has the figures. No number on the dashboard changed. What
changed is what those Sunday readings can be taken to mean.
Improved
v1.109
Every data file now names the archive it was actually built from
Each file under /data carries a source field, and until today all 136
said hourly bars from Dukascopy, 2003 onwards — including the 1-minute grid, the 5-minute grid,
the measured spread and the uptime record, none of which come from hourly bars. Someone checking our
minute grid against the hourly feed could not have reproduced one row. Those 35 files now name
1-minute bid-and-ask candles, 5-minute bid bars from 2015, or our own uptime probe. No number changed.
New
v1.108
The browser panel gained a minute view, and it refuses to say which way a minute closes
The extension's popup and its draggable panel have a fifth view: inside this hour, minute by
minute, for the FX pairs where we publish a minute grid. Every bar is how far
the pair usually ends up from its open in that minute, drawn against its own ordinary minute
rather than against the tallest bar on screen, so a quiet hour looks quiet. Minutes that typically move
less than the spread they cost are drawn hollow, at a measured spread rather than an assumed one,
and the view counts them for the whole day as well as for the hour in front of you. It prints no
minute's up-rate anywhere, because the file's own measurement says that number predicts nothing, and
it states that verdict in the file's words instead of ours. Markets with no minute grid are told so,
and a dropped connection is not allowed to look like the same thing.
21 September 2026
New
v1.107
The New York close test we said we could not run: the bid falls, the ask rises
Section 9 found every market we hold closing down in the New York
close hour by about one pip, read that as settlement spread rather than direction, and said the reading
could not be checked because our hourly feed is bid-only. The minute archive carries the ask for
ten FX pairs, so now it can. In that hour the bid falls past our bar in all ten and the ask
rises past it in all ten; three hours earlier, where nothing settles, the two agree to within a
few points. Two quotes of one price moving apart is the spread widening, and the mid between them keeps no
common direction. Section 9, section 12 and two articles now say this instead of the admission; the
two metals have no minute archive, so for them it stays an inference. No published number moved.
New
v1.106
The 1-minute grid is public data, and it says what it cannot do
/data/cube_slot1m/{id}.json gives every minute of the UTC day for
28 FX pairs: how often the pair closed up, down, or exactly on its open, with the 95% interval,
how far it typically moved against its own median minute, and the measured ask-bid spread. It is built
from 220 million minute bars and it ships its own verdict, per pair. The direction figures
predict nothing and the file says so: minutes chosen for leaning on the first half of the archive
beat the minutes nobody chose by −0.01 points on the second, in all 28 pairs. What does
survive that test is which minutes are biggest (all 28) and, in 12 of them, how often a minute
closes exactly on its open — which a binary option refunds, and which runs from under 2% of
minutes to over 25%. Pooled across weekdays deliberately: one weekday and one minute happens once a
week, giving ±2.8 points, wider than the gap between a coin and a binary breakeven.
New
v1.105
We said the real spread could not be recovered. It can, and it is widest exactly where our edge lives
Every cost figure here divides by one assumed spread per market, applied flat to every hour of
twenty-three years, and section 12 was built around the admission that our
hourly feed is bid-only, so “we cannot tell you what the spread was at 20:00 UTC on a Friday in
2011”. The minute archive we fetched this month carries the ask side, so for the ten FX pairs
it covers we now can. Section 33 publishes it. The assumed table turns out to be
conservative in ordinary hours — we have been over-charging the hours most people trade —
and too low in the thin band, which costs about twice a pair's own ordinary hours in every pair with
no exception. No published number has moved yet, and the reason it matters is that the thin band is
where section 8 finds nearly all of the out-of-sample edge that survives: costed
at the spread their own windows actually carried, most of the windows we push stop paying. The control is
the argument — at a single flat measured figure per pair they all still pay, so this is about where in
the week the cost sits and not about our table being wrong — and the era arm is the part we expected
to kill it: twenty years of spread compression more than halved the midday figure and never reached the
ends of the trading week.
17 September 2026
Correction
v1.104
The 5-minute slot file named the wrong New York close, and now says whether its slots hold up
/data/cube_slot5m/{id}.json warned that the slots from 21:55 UTC lean down
because of the daily settlement. That is the New York close in winter. In summer the close is an hour
earlier, and its last bar — 20:55 UTC — is the strongest lean in the whole grid, in every
pair, with no warning on it. Every slot now carries a thin flag for 20:00–02:25
UTC, and each file carries an era holdout: slots chosen on the first half of the archive, scored on
the second. Outside the thin band the chosen slots fall back to within a few points of a coin and below
the share a binary option paying 80% needs; split by weekday they are no more common than noise and
mostly fall back to a coin. No count moved; the file had described its strongest slot as ordinary.
New
v1.103
The 5-minute slot grid is public data — pooled across weekdays, and it says why
For EUR/USD, GBP/USD, USD/JPY and USD/CHF, /api now serves
/data/cube_slot5m/{id}.json: for each 5-minute slot of the UTC day, how many
bars closed up, down or flat, with the 95% interval and the pair's own base rate to read it against.
It was asked for as weekday × slot and is deliberately not published that way: one weekday ×
one slot holds about 400 bars in this archive and its interval is ±5 points — EUR/USD
Monday 02:45 UTC reads 61% up in 2021 and 26% up in 2022 without the market changing — which is
wider than any lean the grid contains. Pooled, a slot holds about 2,000 bars and ±2.2 points. Each
file carries its own coverage share (the archive holds about two weekdays in three) and names the
settlement slots at 21:55–00:00 UTC that lean down for a reason that is not direction.
14 September 2026
Correction
v1.102
Our 5-minute archive holds two weekdays in three, and we were describing it by its span
The opening-range test in section 7 of the evidence page and the Pro
“inside the hour” card are measured on a 5-minute archive we described as
“2015 to 2026”, which reads as a full history and is not one. The same download
defect we published on Saturday for the hourly archive applies here, and it costs more: minute data
arrives one day per file, so every refused request lost a whole day. Counted:
4,195 of the 12,056 weekdays in that span are not in our archive — we hold 65.2% of
them, from 48.4% of USD/CHF's to 82.2% of USD/JPY's. The hourly archive, a separate download of the
same ticks, shows trading on almost all of the missing days, so they are files we never received
rather than days the market was shut. They are not spread evenly: we hold 52.9% of the
weekdays before 2020 and 74.6% from 2020 on, so those sessions are weighted toward the recent half
of the span — which is the part worth knowing, and is now stated on both surfaces from
a published file. No number moved: the sessions counted
were always the sessions we hold; we had not said how many that leaves out.
12 September 2026
Correction
v1.101
Our archive is missing 812 months, and that is our fault, not the markets'
We said UK100's history was “too thin to clear our own bar”, and explained the
short years on the coverage page as partial years in the feed. Most of it was
neither. Our data source throttles requests, and until today the tool that built our 23-year archive
read a refused request as an empty month and carried on: 812 whole calendar months are missing
across 16 of our 19 markets — 133 of UK100's 181, 161 of EUR/GBP's 275, 130 of USD/CHF's
281. When we asked for a sample of them again, every one came back complete. So in those markets
every sample size here is smaller than it should be, and UK100's “unpublishable” is a
statement about what we hold rather than about the FTSE. No number has moved yet. We are
fetching the missing months again; the source throttles that too, so it is slow, and when it lands
counts, flags and verdicts in those markets will move and be listed here as a correction. Until then
the coverage page and the note under the dashboard's market picker say
how much each market is missing, and quality.json lists it by year.
Correction
v1.100
The coverage page disagreed with its own table about ETH/USD
Under the coverage table, the paragraph explaining the “flag is
noise” column said that in silver about 1 flag in 115 is expected to be chance and in
ETH/USD about 1 in 2. The table directly above it says 1 in 112 and 1 in 4. The
table was right: it is recomputed from our data files on every rebuild, and the paragraph had been
typed in August and never looked at again. ETH/USD's figure was out by a factor of two, and it is
the market the sentence was using as the warning. The paragraph now reads its figures from the
same rows as the table, as do the market it names as having no publishable window, the partial
years it points at, and a count that had been printing “there are 1 such markets”.
The dashboard, which says this on the window you are looking at, always read the live figure.
Improved
v1.99
Three tables that a phone was wrapping three words to a line
The privacy page's list of what we store was three columns of
sentences squeezed into a phone's width, eleven to thirteen characters a line.
The data page's “what we promise about these files” table did the same
at about twenty. Both are now one card per row on a phone, each value under its own label.
The coverage table already was — but its column headings still drew as
a card of their own at the top, eight labels squeezed across it with “Verdict” cut off
the edge. That card is gone. No number moved.
Improved
v1.98
Creating an account no longer tells you that you mistyped a password
The account page opened on Sign in for everybody. Our sign-in
provider deliberately will not say whether an email has an account (so nobody can use the form to
find out who our customers are), which meant a newcomer who filled in the form they were shown was
told “Wrong email or password” — as though they had an account and had
mistyped it. The friendlier “no account with that email, create one” message could
never appear.
A browser that has never signed in here now opens on Create account; one that has
opens on Sign in. A refused sign-in says it may be a wrong password or no account yet, with
the other tab one tap away, and an email that already has an account flips the form to Sign in
with what you typed kept. The privacy page now lists the small flags kept
in your browser, which it had not.
Correction
v1.97
We said our price history came from MetaTrader. It comes from Dukascopy.
The homepage's “How it's built” section had said, since launch, that we pull candles
“straight from the MetaTrader engine — the same data your broker charts show, not a
third-party feed”. Both halves were false. The archive is 23 years of hourly bars from
Dukascopy, which is a third party, and has been all along: it is named on
the data page, in the coverage table, and in the
source and attribution fields stamped into all 78 files we publish. The
homepage was the one surface contradicting our own provenance. The FAQ's answer to
“where does the data come from?” said only “institutional bank-feed price
history”, which is not an answer either; it names the source now, in the visible copy and in
the structured data a search engine may quote.
No number moved. What changed is that the strongest version of the claim is also the true
one: you can fetch the same bars from the same place and redo our arithmetic. The homepage also
said the dashboard is “updated as new candles close” — it is rebuilt weekly, and
now says so with a link to the date of the last run.
Correction
v1.96
On a phone, the screener was hiding the sample size
Below 640px the screener dropped n=1,186 · z=3.4 from every row, and the
dashboard's “one hour, every market” card did the same with solid / could be luck
· n. A phone got the percentage on its own.
That is the one thing this site promises never to do. The guide's third
step is “look at n before you believe the percentage”;
the first question we tell readers to ask any provider is whether every
percentage carries a sample size; /about calls a figure without its n the
industry's trick. All of it was true on a desktop and false on the device most people read us on.
Both surfaces now wrap the sample size onto a second line instead of dropping it.
Also on a phone: /coverage's eight-column table put its last two
columns — the smallest lean we could detect in that market, and the verdict — off the
right-hand edge, and /api squeezed its description column to about 130px, which
wrapped into a three-word ribbon and made the page 29,000 pixels long. Both become one card per row
at phone width.
Improved
v1.95
Somebody looked at every page on a phone
Sixty-two pages, screen by screen, at a real 390px viewport. Besides the three corrections
above, it found: the sign-in page announcing “0.0% — more often down, across 0
samples” in its largest type whenever the market was shut (the dashboard has refused to do
that since last month; /account had a second copy of the same code and never
got the guard); the three screenshots on the 60-second guide showing a
closed market and a navigation bar the site replaced a week ago, on the page whose job is to
teach you to read a lean; and the dotted underline under a defined term drawing itself through the
line beneath it, so the dashboard's reading had a rule struck through “Avg +1.08 pips”.
None of it broke anything a machine could see: the pages fit, nothing overlapped, no console
error, every rectangle exactly the size it meant to be. That is the argument for looking.
Correction
v1.94
On a phone, six of the screener’s ten controls were cut off mid-word
The owner opened the screener on his own phone and asked why there were dots. At 390px the
filter panel gave each control 104 pixels, so “Strength of its lean” read
“Strength of it”, the significance bar read “|z| ≥ 3 (our ow”, and
the timezone picker could not finish a city name. On the dashboard the symbol picker was worse:
five markets had their evidence grade — the “no structure shown” mark this
site spent three releases putting on every surface that names a market — cut off the
right-hand edge of the one control whose job is to carry it.
Both panels now let the number of columns follow what the controls actually need, and the
watchlist star drops below the symbol picker on a phone rather than taking 49 pixels the longest
option needed. Nothing a reader is shown changed except that they can now read all of it.
⚠ Why nothing caught it. Clipping is the one layout failure that breaks
nothing: the page still fits the phone, no two boxes overlap, no console error is thrown, no text
is squashed. Four checks measure rendered pixels here and all four were green, because every
rectangle was exactly the size it meant to be. A dropdown is worse again — it reports no
overflow at all, so the page itself cannot tell you it is hiding a word. There is a new check that
measures the text against the box on all 62 pages, and it reads every option in a menu
rather than the one on show: on the screener the default fitted and every other choice did not.
7 September 2026
New
v1.92
Do yesterday’s pivot points do anything?
The floor-trader pivot is on nearly every chart in retail trading — every
broker platform ships the indicator and many draw it by default — and “today’s key
levels” is a report this category sells by name. Section 32 tests
it on 19 markets and 73,119 trading days. Note first that it is sold two incompatible ways at once:
the level holds, so fade it; or it breaks and runs. Those are complements of one
statistic, so at most one can be true and the folklore asserts both.
The pivot is reached on most sessions, so the setup selects almost nothing —
the same defect as the opening range, the initial balance and the Asian range. Against a control
that borrows another day’s pivot set, what survives is a fraction of a percentage point, the
folklore’s own importance ladder does not grade, and sliding the whole set off the pivots
changes nothing. There is no pivot surface on this site and there will not be one.
⚠ Two of the three controls had to be rebuilt, and that is the reusable part. A
pivot set encodes not just where the levels sit but how wide they are, because every
one is scaled by yesterday’s range — and yesterday’s range predicts today’s.
So a naively borrowed set arrives mis-scaled, and the control credits pivots with volatility
clustering: matching the donor day’s own range removes most of the apparent effect. And the
obvious “a level the same distance from the same open” control is degenerate
— it lands at 0.997× the real distance on the same side, which is the real level. It was
one break measured twice.
New
v1.91
We asked which half of our own grid is doing the work
Every number on this site is a weekday × hour bucket. Our cube builder has cut
the week that way since the first file and nobody had ever argued for the weekday half of it —
which is not free, because splitting each hour five ways multiplies the search space by five.
Section 31 scores every publishable window twice and symmetrically:
against the rest of its own hour, and against the rest of its own weekday.
Both halves are real, and they are not the same size. Each beats a structureless
null, so the unit stands — but the hour axis carries several times what the weekday axis
does, and the weekday-specific windows sit overwhelmingly in the thin band we already warn
about. Of the windows we currently flag, a minority are distinguishable from their own hour at all.
So a reader shown “Thursday 13:00 leans up” is, most of the time, being shown
something true about 13:00. We still display the weekday, because the window you trade has
one; the section is there so you do not read it as the explanation.
⚠ The instrument changed the answer, in the direction that flattered us. The
first cut scored each window against a pool that contained it, which deflates the test by
about 11% on the weekday arm and 2% on the hour arm — the bias sitting squarely on the arm
the conclusion wanted to find weak. Left out of its own comparison, the weekday count rose from 28
to 43 and the ordinary-hour count from 1 to 7. The published figures are the unbiased ones, and the
page explains why.
New
v1.90
A simple view, by default
This site was built to convince a sceptic, and every surface answered why should I believe
this? before what do I do? A first visit to the dashboard now shows the same numbers with less
around them: this hour, when the market moves, which way it leans and how sure we are —
and one tap, Show the evidence, opens every interval, test and caveat we publish. The choice is
remembered. The fold says how many notes it is hiding, because a fold that hid its own existence would
be the one dishonest thing on the page.
Also: a three-step tour on your first visit (skippable, once), plain words on the hour's
verdict — solid lean or could be luck — and six new tap-to-explain terms that say what a
label means for you rather than what it is. Nothing moved. Not one number.
6 September 2026
New
v1.89
We tested the oscillator every platform ships by default, against the fall that produces it
RSI is the fifth thing retail trading teaches most, after the round number, the
candlestick, the Fibonacci ratio and the moving average — and it is the one that arrives
with its numbers already chosen: fourteen periods, buy under thirty, sell over seventy.
Section 30 is the first oscillator on that page.
The control is the whole test, because RSI is a conjunction and only one term of it is
the indicator. “RSI below 30” is, by construction, “price has been falling
for a fortnight” — an ordinary momentum fact with nothing to do with any oscillator.
So every oversold day is compared against a day that fell just as far and was never called
oversold. Measured that way, the whole of the apparent bounce is the fall: the two kinds of
day cannot be told apart, and the interval says so.
The best moment is the ladder. The folklore is explicit that a tighter threshold is a
stronger buy, and the raw numbers grade exactly that way — until the same rungs are run
through the control, where the grading disappears. A tighter threshold is simply a bigger fall.
We also publish what we could not have seen, that the crossing adds nothing over already
being in the zone, and that asking “is price below its close a fortnight ago?” with
no oscillator anywhere in it does about as much work. There is no oscillator surface on this
site, and requests for one are answered by that section.
New
v1.88
Every signal window in your own calendar, with no notification permission
Our alerts have always needed a push subscription — a permission prompt, a service
worker, and a phone that keeps both alive. signals.ics is the same
windows delivered through the one channel every phone already has. Subscribe once
(webcal://perfectindicators.com/signals.ics) and every window on the
free board arrives as a recurring weekly hour, converted into your own clock by your own
calendar rather than by us.
Each entry carries what the window is: how it was chosen — picked on the first
70% of the history and still net-positive on the 30% held back — what these windows have
actually done since the alerts went live, with the range that record still cannot exclude, and
a plain DRIFT ONLY line when a window is net-positive without differing from its own
market’s average hour. It is free, it needs no account, and it is linked from
/radar and /strategies.
It went live earlier today and this is the first mention of it here, which is the point
of the entry: a channel a reader cannot learn about is not a channel.
Correction
v1.87
Four share cards were still making a claim we retracted three weeks ago
On 19 August we stopped attaching a significance verdict to any claim whose window comes
round once a year. Testing “sell in May” or the Santa rally on 23 years
means a sample of about 23 — not the tens of thousands of hourly bars inside them —
and stamping a verdict on it was the one thing this site says nobody should do. Every page was
corrected that day.
The share cards were not. Those are the pictures that travel when a link is
posted into a timeline or a group chat, they are built by hand, and the 21 for our tested claims
had not been rebuilt since 15 August. So for eighteen days the Santa-rally card and the
sell-in-May card both went on reading “direction: 3 of 19 markets differ beyond
chance”, and the two summer cards claimed the opposite result on the same untestable
unit. All four now say the unit is not testable, exactly as the pages have since August.
Three more had simply drifted with the data: Friday afternoon 8 of 19 markets
differing became 7, Monday morning was quieter in 16 markets rather than 15, and the
Wednesday rollover was bigger in 7 of 18 rather than 6. All 52 cards have been rebuilt, and
the record they ship now covers the tested claims and the research articles as well as the
markets — the build refuses to pass if any card’s verdict has drifted from the
measurement behind it, or if a card for an annual claim ever carries a significance count
again.
Correction
v1.86
Four of our share cards led with a window our own bar rejects
When somebody posts a link to one of our market articles, the picture that travels with
it is a card we generate — and it is the one place our numbers arrive with no page around
them and no link to open. Four of them (US30, NAS100, SPX500 and GER40) led with a big
percentage for a window at |z| 2.3–2.8, below the |z| ≥ 3 bar every other
surface here applies, in four markets where not one window tested clears
it. The generator’s own comment said a card must not quote a bucket the product would not
itself flag; only the sample-size half of that rule had ever been written into the code.
Those four cards now say “not one window in this market clears our significance
bar”, with the lean that market would need before we could see anything at all, and no
number. A card for a market whose hour-of-week structure we cannot demonstrate now says so.
The cards had also not been rebuilt since 15 August, through four data refreshes.
US30’s named Wed 22:00, 44.7% of 320 candles; the data had since moved its strongest
window to Mon 18:00, 56.4% of 532 — a different weekday, 11.7 points away. It was the
only one of nineteen that moved, and it was one of the four below the bar. The cards now ship a
record of what each one says, and the build refuses to pass if that record has drifted from the
data.
New
v1.85
We tested the golden cross, and the 200-day average is not why the trend filter works
The moving average is the most widely drawn object in retail trading, and the
golden cross — the 50-day rising through the 200-day — is the only technical
event that gets its own headlines. Section 29 tests both halves of
the folklore against controls, on 18 markets and 23 years.
The event finds nothing: crossings win about as often as each market’s own
unconditional forward move, and they beat their own random-date control in no more markets than
noise produces. On its own grid of every (fast, slow) pair, 50/200 ranks 89th of 108
— the famous numbers are not a peak in their own family. And the days after a cross are
worth less than the ordinary days of the same stretch, so the timing instruction adds
nothing to simply being on that side of the line.
The trend filter is the one arm that is not nothing — a small tilt, the same
sign in 13 of 18 markets. Two controls say the average is not producing it: the tilt grows with
any long trailing window rather than peaking at 200, and asking whether price is simply above its
own close 200 days ago, with no average anywhere in it, is worth at least as much. We also
publish what the test could not have seen: crossings are rare, and a modest edge would be
invisible on this much history. There is no moving-average surface on this site, and requests for
one are answered by that section.
Correction
v1.84
Our forward record was restated once, and we had not said so
The alerts’ forward record is the one number here a vendor
cannot tune, and its whole claim to outrank a backtest rests on one property: its sample can
only grow. On 3 September ours fell from 186 occurrences to 60 over
the same period, and the headline moved from 66.1% to 68.3% — upward.
The cause was a real fix. Until then the record replayed every scheduled row on the
strategy board instead of the rail's own filter; when we corrected that board's out-of-sample
selection at source most rows stopped qualifying, and the record had been counting windows
nobody is ever sent. The correction was right. It was still a track record restated on a
narrower rule set with a better number — the single most criticised thing a signals vendor
does — and the card went on reading “since alerts went live … have come
round 60 times”, which reads as an unbroken accumulation.
Every version of that file we have ever published now ships inside it as
vintages, derived from our own git history rather than typed, and the card states
the restatement with what it moved from and to. It also states something we had not: which side
of the line a window falls on — pushed, or the control beside it — is decided on a
slice of history that contains this record, so the split is not fully forward either. The
bound is the honest part and it is published: the record supplies 1.6% of the sample that
selected it.
5 September 2026
Correction
v1.83
We measured what one of our own flags actually reads, and dropped a word from the sales page
/about has carried a headline figure since launch: 55–65%,
labelled “what real, durable edges look like”. It was typed from an early
validation report and nothing had ever compared it against the grid we ship. It is measured now,
as section 28, and the answer splits in two.
The range is right and the label was not. The median window this site flags reads
56.9% in the direction it leans, and
150 of 185 flagged windows fall
inside the advertised band — so the range describes what we flag. But durable is a claim
about persistence, and section 8 is the out-of-sample version of the
same question: windows chosen before 2020 and scored only after it are worth a fraction of a
point in ordinary hours. The word has been removed and the range now says what it is.
⚠ And the top of that band is not where a reader would assume. Every window in the
whole grid reading past 65% sits in the thin band — the New York close, the rollover or the
Sunday reopen — the hours this site already tells you not to over-trust. The strongest window in
an ordinary trading hour, across 19 markets and 23 years, reads under 60%. The control for
that is in the section: a thin-band bucket is smaller, so it cannot be flagged unless it leans
harder, and each flag is scored against the smallest lean its own sample size could have flagged
at all.
Correction
v1.82
We had tested the lookback dial at its friendliest setting, and our own file had gone stale
Products in this category ship a lookback dial — draw the pattern over the last 5, 10
or 15 years — and /compare answers that with a measurement of what a dial
would do to our grid. Two things were wrong with it. The dial in the nearest competitor's product
runs from one month to five years, and our shortest rung was five years: we had tested
somebody else's feature at the setting most favourable to it. And the file behind the row was built
on 16 August against a grid calling 182 windows significant, while the live grid calls
185 — so the page was quoting a three-week-old vintage of our own numbers.
Both fixed. The rungs now go down to one year, and the answer is stronger: below ten years
the dial cannot put a single window past our own 300-candle sample floor, and with the floor
dropped — which is what the category ships, since none of it prints a sample size — between a fifth
and a half of what it would show is not supported by the full history.
And it is not recency. The control is an equally long block of years from earlier in
the same history, sharing not one year with the recent one. It shows about as many windows, with as
large a share unsupported. The dial sells a recent market and delivers a short sample. The
measurement is now rebuilt every week and reconciled against the live grid, so it cannot go quietly
stale again.
New
v1.81
A floating monitor for partner pages
A sixth embeddable widget, built to sit over another site the way a live monitor does:
one market, this hour, a headline state, one plain sentence, and four rows. How far the hour
moves against this market's own ordinary hour leads — that is the half of this product that
survives a holdout. Which way it leans comes second, drawn from a centre line with its evidence
grade beside it. Then the next window on the free board in both clocks, and the alerts'
own forward record with its interval printed before the percentage, because sixty occurrences
cannot yet separate it from the board's expectation.
Nothing on it says buy or sell. Build one at /widgets.
New
v1.80
We tested our own definition of an “up” hour, and a quarter of our flags did not survive it
Every number on this site rests on one choice we had never argued for: an hour counts as
up when its close is above its own open. There is an equally defensible alternative —
the one a return is actually defined as — where an hour is up when its close beats the
previous hour's close. On a tick-derived feed those are not the same question, because a bar
rarely opens exactly where the last one closed.
Rebuilt the whole grid the other way, on identical bars: 121 of 167 flagged windows
survive. The control is the whole test, because flags would churn anyway — close-to-close adds a
tick-sized quantity to every move, which flips the sign of every bar that moved less than a tick. So
we deal each market's own gaps onto different bars, keeping the same amount of noise and
destroying only where in the week it lands: 144 survive. About 23 of our flags turn on the
gaps' actual placement, below every one of 100 draws.
⚠ The obvious explanation is wrong, and the right one is duller. The inter-bar gap is
an order of magnitude larger at 21:00 UTC than at any other hour — the daily rollover, on a bid-only
feed, so it is the spread widening rather than a move. But the flags that die are under-
represented there, not over-: those windows carry the biggest effects and shrug off a small
perturbation. What predicts a market's losses is how much of its price path falls between its bars at
all — and the market where that share is largest, at 22%, is silver, the one market this site
already tells you not to trust.
We are not rebuilding the grid, and the reason favours us for something we did not
plan: because the rollover artefact lands between bars, our convention never sees it and the
alternative would import it wholesale. The cost is stated instead — a median 3.5% of movement happens
on the boundaries and is in no bucket at all, so our numbers describe an hour entered at its open and
left at its close. New section 27, rebuilt weekly.
New
v1.79
The Asian range breakout, against a borrowed day’s range
Mark the high and low of the Asian session; when London breaks one side, go with it. After
round numbers and Fibonacci this is the most-taught day-trading setup in retail FX, and the nearest
competitor sells it as a report. We tested it on 58,831 sessions across 12 markets.
It fires on nineteen sessions in twenty, so before anything else it selects nothing —
the same thing we found about the opening range and
the initial balance.
Given a break, the session closes beyond the level about 54% of the time, which looks like an
edge. The control is the whole answer: we keep this day's London session bar for bar and hand
it a different day's Asian range, drawn from within 60 trading days so the volatility regime
survives and only the link between the two sessions dies. The borrowed level does slightly
better. Once price has crossed a level it is already on that side with the rest of the session to
drift; being the Asian high adds nothing on top of that.
⚠ The best moment is the folklore's own refinement. A tight Asian range is supposed to
break better, and it does — until the same terciles are run on the control, which grades at least as
hard. A narrow range simply sits closer to the open, is broken earlier, and has more session left to
run. New section 26, rebuilt weekly. There is no Asian-range surface
anywhere on this site.
Improved
v1.78
A sentence on the evidence page was one hundredth of a point from stopping the site
Section 10 is our answer to the chart this whole category is built
on — the calendar walked day by day — and it is a negative: the trading day of the month produces
nothing. It said so as a count: "not one slot in 285 clears the bar". The strongest slot
anywhere is GBP/JPY at |z| = 2.99 against a bar of 3.00.
A count is the one statistic noise can flip while the finding underneath it does not move. One
ordinary weekly rebuild would have put a 1 in that section's own table while the sentence
beneath it still said none — and our build check, which was watching for exactly that, would have
refused to deploy the site until somebody wrote a correction by hand.
It would not have been a correction. We now publish the shuffled-label null as a
distribution rather than only as an average: those same shuffles clear the bar at least once in
45.5% of runs, 2 or fewer times in 95% of them, and never more than 4 in 200. A reading
of one is the null behaving. So the sentence derives itself from the count against that null, the
check now tests the finding rather than the number, and a count that genuinely does exceed what
the shuffles produce still stops everything — which is the only case that was ever owed to you.
Nothing about the answer changed: 0 of 285 slots, against 0.6 expected. What changed is that
the page can no longer contradict its own table, and an unattended Saturday deploy can no longer be
halted by a hundredth of a point.
New
v1.77
Fibonacci retracements, against ratios nobody draws
The most widely drawn tool in retail charting, tested the only way that settles it: against
the same legs, the same bars and the same forward window, measured at fractions nobody draws —
41.5%, 57.0%, 64.5%. Every property of the geometry survives that control. The single thing that dies
is the ratio's fame.
Not one of the five famous depths behaves differently from its undrawn neighbours, over
1,642 legs across 14 markets. A second arm needs no level definition at all — where retracements
actually stop, in equal one-point bins — and finds the same nothing.
⚠ It also states what it could not have seen: a large effect is ruled out, an effect
worth a few pips is not, and no amount of history we hold would settle that, because the legs are the
unit and there are only 1,642 of them. New section 25. There is no
Fibonacci surface on this site, and this is the reason.
4 September 2026
New
v1.76
The engulfing candle, against the two-day sequence it is made of
The candlestick pattern is the most recognisable object in retail technical analysis, and the
first two names anyone learns are the engulfing candle — a down day, then an up day whose
body swallows it — and the pin bar, a candle with a long rejecting wick. Both are sold as
reversals. Section 24 tests them on 23 years of bars across every market
we hold, and neither adds anything.
The control is the whole test, and it is one nobody selling these patterns publishes. A
bullish engulfing day is three things at once: yesterday closed down, today closed up, and
today's body covers yesterday's. Only the third is the candlestick. So the comparison here is against
every day that is the first two and not the third — the same two-day sequence, the same size,
no geometry — and requiring the shape on top of the sequence changes the result by well under half
a point, in fewer than half the markets.
Start with the plainest thing there is and the level stops looking like a finding. Over
71,795 days, simply following whatever today did — no pattern, no name — comes back at
48.62%, below each market's own base rate in 15 of 19. The engulfing candle comes back at
48.44%. The pattern is indistinguishable from the ordinary day underneath it, and the ordinary
day loses.
The internal control is the folklore's own dial: a bigger engulfing body and a longer wick
are supposed to be stronger signals. Run at three strengths each, neither grades. Not one of the
nineteen markets clears our significance bar on either pattern, and held from the pattern day's close
to the next day's close the median market loses about a round trip. The full table, the midnight
boundary arm and the file behind it are on the evidence page; the data is
at /data/candle.json. There is no candlestick feature here, and this is why.
3 September 2026
Correction
v1.75
The range under the alerts' own record was counting the wrong thing
/radar publishes what the alert windows have actually done since they
went live — the one number about a signals product that cannot be tuned. Under it sat a 95% range,
and that range was computed as though every occurrence were an independent try.
They are not independent tries. They are 60 occurrences of just 12 windows, each of
which we chose once, and a single window — EUR/GBP at 20:00 — supplies 18 of the 60. Another
Friday of a rule we already had tells you a lot about that rule and nothing new about the rail.
Resampling whole windows instead, which is the unit we actually picked, the range goes from
55.8–78.7% to 42.6–85.7%. The old one ruled out a coin flip. The honest one does not.
The hit rate itself has not moved and neither has anything about the alerts. What moved is
the range beside it, in the direction that makes the number weaker — which is the only direction a
vendor never publishes.
The half worth checking is the calibration. A wider range could easily be an artefact of the
method, so the same resampling is run over copies whose outcomes have been shuffled across every
occurrence: same hits, same windows, only the link between a window and its results destroyed. It
comes back at the ordinary width. And the set of windows we deliberately do not push, spread
across 21 rules rather than 12, widens by a fifth where ours nearly doubles. The widening is the
concentration, not the arithmetic. It is on the Radar page, free to read, and
the data is at /data/alertrecord.json.
New
v1.74
The coil, the squeeze, NR7: the most widely taught volatility setup, against three controls
"Volatility contracts, then it expands" is the setup retail trading teaches most after
support and resistance. Section 23 tests it on 23 years of hourly bars
across every market we hold, and it does not survive.
The number the claim is sold on is real: the day after the narrowest day in seven is about
one and a half times that day, in all nineteen markets. It is also arithmetic — a narrow-range
day is defined as the smallest of its last seven, so whatever follows it is bigger almost
whatever the market does. Measured against an ordinary day for that market at that time, the
day after comes back below normal, above it in only a handful of markets.
The internal control is the part worth reading. The folklore is explicit that a tighter coil
means a bigger spring, so the same test runs at three tightnesses — and it grades cleanly the
wrong way: the narrowest day in twenty is followed by the smallest day of the three, in no
market above its own normal. A tighter coil buys a quieter tomorrow.
And the way it is actually traded — buy the break of the narrow day's high — finds nothing.
A narrow range puts its breakout level close to the next day's open, and a near level is crossed
early and then has all session to drift beyond it, so measured naively it looks like an edge. Against
a synthetic level the same distance from the same open, no market beats it at our significance bar.
The full table, both day boundaries and the file behind it are on
the evidence page; the data is at
/data/coil.json. There is no narrow-range feature here, and this is why.
Correction
v1.73
One line on /reports read "9 of undefined", and the guard against it could not fire
/reports summarises section 12 of the evidence page — what cost the
edge dies at. It read: "the median alertable rule clears its assumed spread by 1.29×, and 9 of
undefined stop paying at 1.5× the assumption." The correct figure is 9 of 12, which
is what /evidence has said correctly all along — so two of our own pages
disagreed in public, and one of them was printing a JavaScript artefact rather than a number.
The accessor asked a count for its length. That is an ordinary mistake, and it should have
stopped the build: this shelf has had a guard against exactly it since the day it was written, and a
previous entry on this page promised you it did — that a verdict the builder cannot resolve
"stops the build rather than reaching you as the word undefined".
The guard could not fire. Its pattern contained four invisible control characters where
the word-boundary marks were meant, so it matched nothing at all — while printing a clean build over
the hole. It looked correct in the editor, in the diff and in every search. A guard that cannot fire
is worse than no guard, because it occupies the slot a real one would.
Both are fixed, and the repair is deliberately not the narrow one. The test for a hole now
lives in a single file that checks itself every time it is loaded, and a new gate check reads the
rendered text of all 84 pages — not the source — and refuses to ship any page showing you
something JavaScript printed by accident, whichever generator wrote it. It also fails if a control
character reaches any source file here, which is the mechanism that disarmed the first guard.
New
v1.72
Round numbers: the folklore has the sign backwards, and it is not worth trading
After support and resistance itself, "price respects the big figure" is the most widely taught
idea in retail FX — and like yesterday's high, it is sold two incompatible ways at once: the level
holds, or it breaks and runs. Section 22 tests it against a control this
question happens to make easy: the same price lattice, phase-shifted onto prices nobody calls
round. Same spacing, same bars, same distances — only roundness dies.
Hours that trade through a round number finish past it more often than hours crossing
an ordinary level the same distance from the same open. That is the opposite of what is taught, it
grades with how round the level is — the big figure, then the half figure, then nothing at all by the
time you reach the ten-pip levels people also draw — and it survives being matched on distance.
It also clears a round trip in no market we hold. So there is no round-number feature
on this site, and now there is a page saying why. The numbers are in
/data/round.json.
Improved
v1.71
What our alerts have actually done is free to read now
The alerts publish a forward record: every occurrence of every window the rail pushes since
the day it went live, scored on raw bars, with its confidence interval and with the windows we
deliberately do not push scored beside it as a control. It is the one figure a vendor cannot
tune in advance, and it is the reason to trust or distrust the feature.
It was inside the Pro card. So was the cost curve that ends in "at two and a half times
your spread, none of these pays". A reader who had not paid got both of them blurred — we were
charging people to see the evidence about the thing they were deciding whether to buy, and both are
computed from public files anyone can download anyway.
Both now sit in their own card on /radar, outside the
paywall. The alerts themselves are still Pro, and your own delivery receipts stay private to your
account. /compare gained a ninth question — does it publish what happened
after it went live? — because it is the question we were failing.
Correction
v1.70
The strategy board’s method panel was counting its own rules by hand
The board explains why a rule can be profitable for the wrong reason:
US30 closes up in more than half of all its hours, so a long rule in any hour starts ahead, and
that is DRIFT ONLY rather than a fact about the clock. The paragraph made the point with three
live figures — US30's own up-rate, and how many US30 and GER40 rules sit on the board — and all three
were typed in by hand.
The board is rebuilt whenever the backtest runs, and one of them had drifted: the page said
21 GER40 rules where the board holds 22. /radar quotes the same two
counts from the same file and had them right, so two of our own pages were printing different numbers
for one measurement on the same day.
All three figures are read from the board now. The claim around them — that no index
rule on the board clears the schedule test — is checked separately, because no number can carry it:
the build fails if an index rule ever does clear it, and equally if the page stops saying so while it
is still true.
Correction
v1.69
Two of our own pages disagreed about how quiet August is
Section 14 asks whether the timetable this site publishes is the
same in August as in November. The shape holds — which is what lets us publish one pooled timetable
for the whole year — and the level moves a little. That level was written into the page as
"about four percent" when the section shipped. It was right then. The measurement is rebuilt
every Saturday, and by today August was running 5.7% below an average month, so
/reports — which computes the same figure from the same file — was printing
5.7 while /evidence printed four.
Both numbers now come off the measurement, along with the quarterly spread (the quarters run
from 5.2 points below a market's own typical hour to 6.6 above, where the page said "roughly seven
points either side") and the count of markets that run busier in August rather than quieter.
A third surface had the sharpest version of it: the FAQ printed the
checked figure — August at 0.943× a typical hour — and then paraphrased it as "roughly four percent"
two words later, so a verified number sat beside a wrong restatement of itself. Both halves of that
sentence are checked now. The build fails if section 14 stops agreeing with its measurement, if the
pages quoting it stop agreeing with each other, or if the shape stops holding while a page still
says it does.
Correction
v1.68
Our answer to “does yesterday’s high matter?” was counting one market too many
Section 6 tests the report this category sells by name: price takes
out yesterday's high, and the break is treated as information. It does not survive a matched control,
and the sentence qualifying that finding said "16 of 19 markets point the same way". The
measurement says 15 — that count was typed into the page when the section was written, while
every figure beside it came off the file, and one market crossed sign in a weekly rebuild without
anything noticing. The same sentence quoted a 0.6-point gap as the median market's, when 0.6 is
the figure pooled across all 68,685 breaks and the median market's is 0.9. Both are read from
the measurement now, along with two ranges in section 7.
Nothing about either finding changed: the famous level still holds slightly less often than an
ordinary level the same distance away, which is the opposite of what it is sold for. The build now
fails if any of the four reports on that page — the weekend gap, yesterday's high, the opening range,
the day of the month — stops saying what its measurement says, in either direction.
That check reports one number worth stating plainly: our
day-of-month result is "not one slot in 285 clears the bar", and the
strongest slot in the archive now sits at 2.99 against a bar of 3.00. If it crosses, the
build stops until we say so here.
Correction
v1.67
Three market articles were about to say no strategy runs on them, and several do
Each of the nineteen per-market articles ends by saying how many rules from
the board run on that market. That count was reading the board's
out-of-sample column, which — until we rebuilt how rules are selected
— every published row satisfied by construction. The two counts were the same number, so nothing
looked wrong. Now that the column means something, the next rebuild would have had three articles
stating "no published rule runs on this market" for EUR/JPY, GBP/JPY and silver, where 6, 8 and
1 rules do. Caught before it reached the pages.
What was already wrong on the site is the counts themselves, which were built against
the previous board and never refreshed after it changed. They move in both directions: EUR/USD reads
25 where it read 10, US30 28 where it read 27, and gold 1 where it read 16.
Each article now also states, separately, how many of its rules stayed profitable on the held-back
last 30% — a much smaller number, and for some markets none.
The figure those articles quote from our longest-standing holdout
was typed rather than read: it said +0.55 points where the measurement now says +0.57.
It is read from the file now, and the build fails if any article's count stops matching the board.
Correction
v1.66
The alerts’ own record was counting windows we never send
Radar publishes what has actually happened in the windows we push — the one
number a signals vendor cannot tune. Last week we fixed how the strategy board
selects rules, which made the out-of-sample column start meaning something and made most rows fail
it. Five surfaces were updated to only push rules that pass. This one was not. It went on replaying
every scheduled window — 33 of them, against the 12 the alerts actually send — beneath a sentence
calling them "the windows that qualify to be pushed".
The number moved. The record now reads 41 of 60 — 68.3% (55.8%–78.7%) where it read
123 of 186 — 66.1%. It is higher and it rests on a third of the occurrences, so the range around it is
wider, not narrower: this is still far too little to judge us by, which is what the card says first.
And the windows we drop are now published beside it as a control: the 21 scheduled windows
we do not send came out 58.5% (49.7%–66.9%). ⚠ Those two ranges overlap, so the 9.8-point
gap is not yet evidence that our filter earns its place — it is the thing that becomes checkable as both
sides fill up. The filter itself now has a single owner in the code, and the build fails if the record
ever replays a different set from the one the sender uses.
Improved
v1.65
Nineteen markets are not nineteen experiments
The headline on our evidence page is a sum — 185 significant
windows against about 6 from noise, added up across nineteen markets — and the permutation behind it
is drawn one market at a time. That is only a fair experiment if the markets are independent, and
the file we publish ourselves says they are not: US30 and SPX500
move together at 0.94.
So we measured it. Two nulls differing in exactly one thing: a shuffle of the clock labels
shared by every market, so correlated markets keep correlated findings, against one each,
which is what adding nineteen nulls together assumes. Sharing it widens the spread of the total by
1.11× (95% interval 1.00–1.23) — so our nineteen markets are worth about seventeen
independent ones, and the interval's lower edge touches 1.00, meaning we cannot rule out that the
effect is nothing at all.
The headline is unaffected and now has one more thing standing behind it. What changes
is a sentence: where this site said nineteen markets agree, read about seventeen. New section 21 on
the evidence page, and the build now refuses if that measurement falls
out of step with the live grid.
Correction
v1.64
The strategy board picked its rules with the data it then tested them on
Every rule on the board used to be chosen by searching the whole
history and only then scored on its last 30% — so a rule arrived at the out-of-sample column having been
chosen with that column's help. The board then ranked on that column before publishing the top
150, which is why all 150 published rows held out of sample: that was the selection rule restated, not a
result.
Measured properly, selecting on the first 70% alone, 27.8% of chosen rules stay positive on
the tail against 67.5% the old way — and about 50% is what a tail carrying no information at all
would give. The honest figure was not merely smaller than the published one, it was worse than
chance.
What changed. Candidates are now selected, costed and ranked on the first 70% of each
market's history; every headline figure on a row is measured on that era; and the last 30% selects
nothing. It is scored afterwards and printed win or lose. The board is rebuilt from that rule, so
the published rules and their order have changed, and it now reports that only about a quarter of
them stayed positive on the held-back tail. The rest are still listed, failing it in public.
⚠ Two other numbers moved with it: the funnel counts fewer rules tested (a rule must now clear
the 300-trade floor inside the selection era alone), and the CSV's in_sample_net column is
replaced by full_history_net, since every other column is already the selection era.
Improved
v1.63
Nineteen market pages could not reach the research
The per-symbol articles are how most people arrive here, and none of the nineteen linked to any of
the twelve research pieces. Neither did the twenty-one tested myths. Forty entry pages, and the
deepest work on the site was reachable from none of them.
Each market page now ends with the tests that actually measured that market — and only
those. ⚠ That restriction is the point: several of our tests exclude markets outright. The opening-range
test ran on four majors; the day-of-month test excludes crypto and seven others. Offering one of those
on a page it skipped would undo the reason the exclusions are published at all.
⚠ The narrowest test comes first. A measurement that covered two markets and included yours says
far more about your market than one that covered nineteen — so EUR/USD leads with the opening range and
BTC/USD with the crypto weekend, rather than both showing whichever article happened to be written
first.
It sits beside the two blocks that were already there — the markets that keep the same clock as
yours, and the folklore that lands on your market specifically. All three are computed from the same
files the page itself is built from, so none of them can drift from what the page says.
Improved
v1.62
Twelve articles that never mentioned each other
Twelve research articles had been published here and eight of them linked to no other. Each was
written as a self-contained answer to one claim, so if you arrived at
the opening range from a search, there was no way
to reach the other eleven except the menu.
Each one now ends with the rest of its family — the reports this category sells by name, the
pieces on when a market actually moves, or the ones on how we decide what counts — plus two from
elsewhere so nobody is boxed into one corner of the work.
⚠ It is generated from the list of articles rather than written into them, because an article
cannot link to its siblings while it is being written: they do not exist yet. That is presumably why it
never happened by hand. And an article missing from the family table stops the build — a new piece
quietly failing to join the others is exactly the kind of omission nobody would ever notice.
New
v1.61
Does a hot streak mean anything? It does not decay, which settles it
The most natural question to ask of a grid like ours: that window has been winning lately — is it
hot? The new article answers it across
2,221 windows, and explains why there is no streak feature on this site.
There is something there: mean z = 0.277 after a winning week, worth about 0.9 of a
percentage point. The finding is not the size — it is that the effect does not decay. At two
weeks' lag it is 0.26; at four, 0.247.
⚠ Memory has to fade. Something as strong a month later as a week later is not a window
remembering anything — it is drift, a slow bias the bucket carries the whole time, which last week
and this week both reflect. A product built on “this window is hot right now” would be
selling a property the data says it has permanently.
⚠ The control is what makes it a measurement: shuffle the weeks and the same estimator returns
−0.038. And almost all of what remains is in the metals — remove silver and the
site-wide mean falls to 0.214. Silver is the one market whose early data we tell you not to trust
and the one whose effects we measure as genuinely decaying. In the indices and in crypto there is
nothing at all.
New
v1.60
What spread kills a seasonal edge? Every rule's break-even, published
Every backtest in this business subtracts a trading cost, picks a number and moves on. Ours does too —
one typical round trip per market, applied to every hour of 23 years. What nobody publishes is the
sensitivity: how wrong that assumption has to be before the result disappears.
The new article publishes every alerted
rule's break-even spread — the cost at which its net is exactly zero — and the margin that
leaves. The median is 1.22× the spread we assume. 18 of 21 stop paying at 1.5× the
assumption and 20 of 21 at double it. The thinnest is 1.02×: a rounding error from the
line.
⚠ It is not a thin-band story, which was the comfortable explanation. The thin band runs
a median cushion of 1.24× and ordinary hours 1.22× — the whole board runs on the same
narrow margin.
The comparison at the top of it is the one that explains this entire site. Across every liquid
weekday × hour window in the FX majors, the hour's movement beats a round trip in
471 of 471 of them. The directional edge beats the same round trip in 4. Same
windows, same cost, same archive — and that is why we lead with when a market moves and treat which way
it closes as the weaker half.
⚠ A sensitivity, never a correction: our feed is bid-only, so the real spread at 20:00 UTC in
2011 cannot be recovered. We are not claiming to know what you would have paid — we are showing how
much the answer depends on a number we had to assume, so you can apply your own broker's.
Correction
v1.59
Anti-framing covered the pages with buttons and left the pages with the research
Anyone could put this site's research inside a frame on their own page and present it as their work.
The rule that stops that was applied to eight pages — the ones with buttons and sign-in — and to none
of the ones with the content. /evidence, every research article, every tested
myth, the reports index and the homepage were all framable by anyone.
Our own configuration said what it was supposed to do: the widgets are meant to be framed by
strangers; every other page is not. It was implemented as a hand-kept list of eight, and the site
has grown to more than thirty.
⚠ The risk on a content page is not somebody stealing a click — it is somebody taking the
attribution. The embeddable widgets exist precisely so this material can
be put on other people's pages, with our name attached. Every page but those refuses to be framed now,
and the widgets still work exactly as before.
⚠ It stays an explicit list rather than a blanket rule, because the header involved cannot be
switched back off for an exception — a blanket would have silently broken every embed on every site
that uses one. A check now fails the build when a page exists that the list does not cover, and also
when the widgets are protected by mistake.
2 September 2026
Correction
v1.58
The widgets could not read half the data they depend on
The embeddable widgets are meant to run on other people's pages — so every file they fetch is a
cross-origin request. Cross-origin access was granted file by file, and the list had fallen behind the
files. Checked against the live site: the cubes, symbols.json and
strategies.json were readable; markets.json,
range.json and cost.json were not.
Those are not spare files. markets.json carries the evidence grades
every widget prints, and range.json the movement figures behind the gauge and
hours size modes added five days ago — which means that feature was inert on every embedder's
page while working perfectly on ours.
⚠ The grades failed safe: each widget carries a baked fallback list for exactly this
reason, so nobody was ever shown a missing caveat. But safe is not correct — the fallback is frozen at
build time, so when BTC's grade changed on 29 August, no embed would have learned about it.
Every published file is readable cross-origin now, by one rule rather than a list. ⚠ A list of
something that should be universal is a list that goes stale silently, which is what happened.
Correction
v1.57
An embed showed the edge and not the cost that eats it
The compact now embed prints a big up-rate and, beside it, avg — the
average signed move for that hour. That is the number that actually decides whether a window is worth
anything, and it was shown alone.
Our own CSV export tells you in as many words to compare that figure against the spread before
believing it. The dashboard makes the comparison for you in seven places. The embed — the one surface
where nobody is going to open the evidence page — made it nowhere.
It now reads avg +0.33 vs 3.0 spread — under the round trip. Silver is
the case that makes the point: this hour shows 54.7% up on 1,049 samples with z = 3.4
and the word significant — and an average edge nine times smaller than the cost of taking it.
Every one of those numbers was already true and already on the widget; the one that settles it was not.
⚠ The spread is read from the file that owns the per-symbol cost table, never copied into
the widget — a second copy of that table once published index figures 100× wrong. And if the file cannot
be reached the line falls back to what it said before: less complete, never more reassuring.
Improved
v1.56
The front door did not mention the research
Every page on this site carried a top row offering Evidence · Reports · Blog — except the
homepage, which offered none of them. So a reader who arrived at an article was shown the evidence
page, the tested-claims shelf and the research blog, and a reader who arrived at the front page —
where search results and every shared link point — was not.
That is the one thing this product has that the alternatives do not, hidden on the single page
everyone sees first. There were simply two navigation rows, one hand-written and one generated, and
neither was ever going to notice the other. They match now.
⚠ Fixing it broke something first, which is worth recording: dropping Strategies out of
the row left the strategy board unreachable from the homepage entirely
— on the page where somebody decides whether to pay for it. It is linked from the pricing block now,
which described the board twice without ever offering a way to look at it, and the free preview is
public so you can read ten real rows before buying anything.
Correction
v1.55
A grade we were asserting in words had already changed
BTC/USD crossed our direction bar on 29 August — three flagged windows against 0.44
expected — and its evidence grade changed from no structure shown to demonstrated.
Everything that reads the grades followed correctly: the symbol picker, all five embeddable
widgets and their offline fallback lists.
Two sentences did not, because they asserted the grade in words rather than reading it.
Section 18 and the
crypto weekend article both said “both markets
are already graded no structure shown”, which stopped being true four days before either was last
rebuilt. Both compute it now and say whichever of the three states holds.
⚠ A grade is a claim that moves every refresh, and unlike a percentage it has no checked span to
live in — which is exactly why it went unnoticed. The published figures on those pages were all correct;
only the English was wrong.
And the reason it went unnoticed for four days is worth more than the fix. Our own research watch
had reported it — markets-demonstrated: 12 → 13 — and nobody opened the
digest. The same watch reported the last refresh as quiet while this project's most-quoted figure moved
from 187 significant buckets to 185, because that number was not published anywhere a
monitor could read it. It is now, and it is watched.
New
v1.54
Should you only trade when the market is busy? No — and the opposite of the intuition
“Wait for volatility, don't trade a dead market” is the most repeated filter in this business.
We can test it directly, because we publish the windows we think are worth watching. The new article does.
It points the wrong way. A flagged window is right 55.9% of the time after a big hour and
57.9% after a quiet one — 2 points worse for waiting — and 14 of 14 markets with flags
lean the same direction. ⚠ The control is what makes that mean something: run the identical split on the
windows we do not flag, 1.36 million hours of them, and the gap is 0.24 points. Nothing.
⚠ Nearly all of it sits in the thin band — the Sunday reopen and the hours from 20:00 UTC.
There the gap is 3.2 points; in ordinary hours it is 0.5. So the busy-market filter is not a
filter, it is the thin-band warning restated. And neither state pays: 0.80× and 0.70× of a round trip.
The part worth knowing is the pairing. Point the same split at how far the market moves and it
reverses — after a big hour the next one runs 1.47× its usual size, in all 19 markets, worth a
round trip in 17. The two halves of this product answer to opposite regimes: direction is marginally
better when quiet, size is decisively better when busy. “Wait for volatility” borrows a true fact
about movement to justify a claim about direction.
Correction
v1.53
The bucket in our own cautionary tale never stopped regressing
/about and the FAQ both tell the same story about why our numbers
are milder than the ones this industry advertises: EUR/USD Thursday 01:00 read 80.4% up on
56 samples in an early file, and re-measured over a decade “settled at 67.7%” on 446.
It did not settle. On the full 23-year archive that window reads 52.4% on 1,184
samples — a coin flip. The story stopped one step short of its own point, and the step it skipped is the
only one you can check: open that window and the
dashboard counts 620 higher against 564 lower.
⚠ It mattered more than a stale figure usually does, because that example is what justifies our
55–65% range — and the bucket it rests on had fallen below the band it was illustrating. The
sequence is complete on both pages now, and the live figure is a checked number, so it tracks the
archive from here instead of aging into another correction.
⚠ The two historical figures stay as prose on purpose: they describe samples that no longer exist
and cannot be recomputed. A checked number is for a figure the data still owns. And the FAQ's structured
data — the version a search engine may quote — was rewritten to say the bucket is close to a coin flip
rather than to name a number it cannot keep current.
Correction
v1.52
Two pages nothing was watching, and one number that was never right
Yesterday's correction to the reports shelf came from reading a list nobody reads — the inventory of
numbers in our copy that no check watches. Two more real ones were in it, on pages that were in neither
the list the generator rewrites nor the list the gate compares.
/compare valued ordinary-hour direction at +0.55 points out of sample.
The measurement says +0.56, and that figure has had a checked key all along — the page simply typed
the number outside the span, so nothing rewrote it and nothing compared it.
/scan said “NAS100 and SPX500 close up 52.3% of every hour they
trade”. NAS100 is 52.32%; SPX500 is 52.22%. ⚠ That one was never right rather than
having drifted: one number was standing in for two markets, which is a denominator problem wearing a
rounding problem's clothes. Each index states its own figure now, and both are checked.
Both pages have joined the nine the generator writes and the gate compares — 40 checked
numbers, up from 37. And one claim we re-measured turned out to be exactly right and was left alone:
the Sunday reopen is 3.9% of our buckets and supplies 6 of the 20 strongest readings on the
site.
Correction
v1.51
The reports shelf was quoting numbers the measurements had moved past
/reports is a roll-up, and its stated rule is that every number comes from the page
that owns the claim, because a verdict stated in two places drifts. Its own twenty one-line verdicts were
the exception: hand-typed prose, rebuilt every week beside measurements that move every week.
Ten of the twenty had drifted. The headline permutation result read 182 significant
buckets where the file says 187; the day-of-month test read 0 of 260 where it is
0 of 285; the specification curve 22 of 25 where it is 21; the equivalent significance
bar 3.06 where it is 3.05; the size holdout's busy-band figure 0.847 where it is
0.859; and five more. None of them changed a verdict — every “holds” still holds and every
“does not” still does not — but a page that exists to stop numbers drifting was drifting.
Every verdict that quotes a figure is now computed from the same measurement file the evidence
page is built from, so it cannot be stale and cannot be retyped. One that quotes nothing stays prose,
because there is nothing in it to go wrong. And a verdict the builder cannot resolve now stops the
build rather than reaching you as the word “undefined”.
⚠ Worth saying plainly: none of this was found by a check. It was found by grepping our own pages
for numbers nothing watches, after making the same mistake in a draft the day before.
New
v1.50
The chart this whole category is built on, tested
Open any seasonality screener and the first thing it draws is the calendar walked day by day — the
average path of the month, with the turn of month and option expiry marked. It is the signature chart of
this business, and we do not have that axis: our aggregates are month × weekday × hour, with no
day-of-month dimension at all. So
we measured it from the raw daily series.
0 of 285 slots across 11 markets clear our bar, against 0.7 from a null that
shuffles the trading days inside each calendar month — destroying day-of-month structure while
keeping every month's own return, length, volatility and trend. The strongest slot anywhere reaches
z = 2.99. Turn of the month leans up in 8 of 11 markets with none significant; the
third Friday in 2 of 11, tested against the other Fridays of the same months so the claim is
not carrying whatever Friday itself does.
⚠ Unlike our annual claims, this unit is genuinely testable — the median slot rests on
242 months, not 23 — which is what makes the null result mean something rather than only reflecting
a small sample.
We published it because it is the strongest argument for the unit we did choose, and only
because it could have gone the other way: the same code, same markets, same bar, pointed at hour of the
week finds 187 significant buckets against 5.9 expected. An instrument that finds something
everywhere you point it is not an instrument.
Correction
v1.49
Radar was naming the wrong day for a quarter of its windows
Yesterday's homepage fix pointed at a worse one. /radar — the page Pro is bought
for — converted each window's hour into your clock and left the weekday in UTC, then
labelled the pair “your time”. At UTC+8 the board's top row, USD/CHF Fri 20:00 UTC,
read “Fri 04:00 your time” when it is Saturday 04:00.
Measured on the board as shipped: 31 of the 121 rows that card can draw — 26% — name
the wrong day at UTC+8. It was in seven places on that page: the plain-language readout, the hour
list, the dial centre, the market-closed banner, the next-windows card, and the strategy marker on the
ring, which quoted the board's UTC label with no clock on it at all.
⚠ The countdowns beside all of them were correct — they are computed in UTC. A wrong label
next to a right clock is the most convincing way to be wrong, and it is invisible on the machine it is
written on: at UTC+0 every version of this code agrees.
All seven now convert once, through one helper that carries the weekday. And the push notification
was already right — it has always resolved the actual instant against the device's own clock,
which is why this never reached a phone.
The new check asserts the shape rather than any wording: a surface that claims your clock
must carry the weekday through the same conversion. It found two more instances the moment it ran,
in the dial centre, which this correction had missed.
Correction
v1.48
The homepage was telling you the wrong hour for the next window
The live tape on the front page advertises the next window from the strategy board with a countdown
beside it. The countdown was always right. The label was not: it printed the weekday and hour
bare, and every rule on that board is UTC. Measured in a UTC+8 browser it read
“EUR/USD Thu 15:00 SHORT” for a window that opens at 23:00 Thursday where that
reader is sitting — eight hours out, on the page most people see first.
It now prints both clocks: Thu 15:00 UTC (Thu 23:00 UTC+8), converted the way every other
surface converts, carrying the weekday as well as the hour — crossing midnight moves both, and
converting only the hour is what once had our question page answering for the wrong day.
⚠ A wrong label beside a correct clock is the most convincing way to be wrong, which is why
this outranked anything else this week. The same defect was fixed on the strategy board in August and on
the screener's links before that; this was its third home.
The block also called that row a “high-conviction window”. It is selected using
the board's out-of-sample column, which we retracted as a filter that was
applied rather than evidence that survived — and we corrected the strategy board, the alerts and the
radar for exactly that, and missed the homepage. It says “next window on the board” now:
what it is, not how good it is.
New
v1.47
The hours strip can show the timetable, not just the lean
The 24-hour strip you can embed drew up-rate by hour — which way the market closed. The same 24
cells on the movement axis are the timetable: which hours this market is actually awake in, as a
multiple of its own ordinary hour. That is the half of our data that survives being tested on years it
was not chosen from (0.925 rank correlation), where direction manages +0.55 points. Add
mode=size, or tick the chip in the generator.
EUR/USD comes back as a shape anyone can read at a glance: 0.5× through the Asian
hours, 1.7× at 14:00 UTC. Gold reaches 2.0×. The direction furniture is dropped
rather than reworded — no evidence grade, no significance dot, no up/down colours — because all three are
statements about which way a market closed, and printing them beside a movement figure qualifies the
wrong claim.
⚠ Two things it had to be told. The pooled hour curve is Monday to Friday in every market,
including the two that trade seven days, so BTC's strip says so on its own label — its weekend is a
different shape, and averaging the two would draw a third that describes neither. And the magnitude ramp
runs darker at the quiet end than the direction ramp does, so the ink in each cell now follows the cell:
left alone, every quiet hour would have been a number nobody could read.
New
v1.46
The gauge can point at how far the hour moves, and the New York close gets its own page
Two things. The gauge widget — the one most people embed — has always pointed its needle at
direction, which is the axis our own holdout scores weakest: picked before 2020 and scored after
it, an ordinary hour's lean is worth +0.55 points. Add mode=size (a chip
in the generator) and the needle becomes how far this hour usually moves,
against that market's own ordinary hour — the axis that holds at 0.925 on the same split. The dial
is logarithmic, so twice as busy and half as busy sit the same distance from its centre, and in that mode
it drops the “no structure shown” caveat rather than rewording it: that grade is about
direction, and printing it beside a movement figure qualifies the wrong claim.
And a new article on the largest
effect this archive contains. 12 of the 12 markets that trade the whole clock close lower in the
New York close hour, with z as extreme as -18.5 — numbers an order of magnitude beyond anything
else here. They are worth about one pip, and 11 of the 12 lean by less than a single round
trip. An effect in every instrument, in the same direction, at one named minute, landing on a round
number, is what settlement looks like rather than a trade.
⚠ Measuring the new gauge mode caught a real defect before it shipped: its sentence wraps further
than the direction one, so the height we advertise would have clipped it by 5px on somebody
else's page. All four gauge shapes are measured against their own advertised height now.
Correction
v1.45
The movement timetable now covers the crypto weekend — and that moved every BTC and ETH multiple
Every "typically moves N" and every "× its own typical hour" on this site comes from one
file, and that file was 120 numbers long: weekday × hour, Monday first, weekends excluded.
Correct for the seventeen markets that close; wrong for the two that do not. It is 168 cells
for BTC/USD and ETH/USD now, with all 48 weekend hours filled.
⚠ This moved published numbers, which is why it is a correction. A market's "own typical
hour" is the median of its own cells, and the weekend hours we had been ignoring are smaller than the
weekday ones — so that denominator fell from 64.25 to 60.2 points in BTC and 48 to 45 in
ETH, and every multiple quoted against it rose by about 6.7%. BTC's biggest window read
1.62× its typical hour and now reads 1.73×. If you wrote one of those multiples down last
week, that is why it has changed.
⚠ Not one weekday cell moved. All 18,240 of them are identical to the day before: this
is a wider week, not a re-measured one. The hours-ahead strip, the biggest-windows list, the screener's
size ranking and filters, the cross-market card and the browser extension all answer for Saturday and
Sunday now. The pooled hour-of-day curve stays Monday to Friday in every market — including
these two, because the finding is that their weekend is a different
timetable, and averaging two timetables produces a third that describes neither.
New
v1.44
Does Bitcoin move on the weekend? The quarter of the week we were not publishing
Crypto trades Saturday and Sunday, and every movement figure on this site comes out of a file
that is 120 numbers long — weekday × hour, weekends excluded. Right for seventeen markets,
wrong for two. The new article publishes what is
in those hours before we publish anything built on them.
A weekend BTC hour moves 0.85× a weekday one and is still worth 2.75× a round
trip, so on size it is an ordinary trading period. But the timetable does not carry across it:
the hour-of-day shape correlates 0.617 weekday-against-weekend, where the same market split
weekday-against-weekday returns 0.906 and the FX markets — which have no weekend to get wrong —
return 0.99. It has not flattened, it has moved: BTC's biggest hour goes 14:00 UTC to 00:00.
⚠ Two stories in the data are not being told, because their controls kill them: the
weekend does not predict Monday once the control is shape-matched (+4.2 points ± 2.98), and
"institutions killed the crypto weekend" is true in BTC and false in ETH. And the timetable file has
deliberately not been reshaped yet — widening it moves the denominator every published crypto
multiple is quoted against, and that is a correction, not a side effect.
28 August 2026
New
v1.43
The best time to trade forex, answered properly
Every page on this subject gives the same answer — the London–New York overlap — and the answer
is right for a reason most of them state wrongly. The new
article separates the two halves: that window moves 2.41× a typical hour, which is a fact
about how far price travels and what it costs you to trade, and it leans directionally in 1 of 12
markets — fewer than any other session on the board.
It carries all 24 hours sized against each market's own ordinary hour, every market's busiest
window with its spread beside it, and the two holdouts that decide which half to trust: the timetable
picked before 2020 still ranks the hours after it at 0.925, while direction picked the same way
is worth +0.55 points — less than a round trip.
⚠ The session column is read from our own measurement rather than drawn as a fixed band, so
it shows the five UTC hours that are split — London is 07:00 on 59% of days and 16:00 on the
other 41%, because the four cities do not change their clocks together.
27 August 2026
New
v1.42
Eight questions to ask any product of this kind, including this one
We started writing a comparison table and stopped. The competitive research is real — this
category's prices and catalogue sizes are published — but those are marketing pages, and "they
never show a sample size" is a claim about a product we have not logged into: unfalsifiable by
you and uncorrectable by them. This site does not publish numbers it cannot check, and doing it about
somebody else would be worse rather than better.
So /compare is the useful version: the eight questions that
decide whether a trading statistic means anything — sample size, the control it was measured against,
whether the lookback is a dial, whether the failures are published, whether corrections are, whether
you can download the data, whether it admits where it does not work, and whether costs are charged
before the edge is shown. Our answer to each, and a link so you can check it rather than take it.
It ends with what we are worse at, which is the part that
makes the rest worth reading: a smaller catalogue, nineteen markets rather than thousands, nothing
finer than five minutes, and direction being the weak half of our own product.
New
v1.41
A green first hour tells you the first hour was green
Two more reports this industry sells by name, tested together because they are the same
question twice: opening candle continuation — if the first hour is green, how often does the
session close green? — and the initial balance, the first hour's high and low.
Across 68,567 sessions in 17 markets, continuation beats its control by 0.02
percentage points and not one market reaches even a weak significance bar. It is the
flattest result we have published. The control is what makes it readable: each day's first hour is
re-paired with a different day's session, which keeps the number of green first hours and the
number of green sessions exactly and destroys only the link between them.
The initial balance has the same defect the opening range does — it is broken on 99.7%
of sessions, so it selects nothing. What does survive is a two-point tilt toward a one-sided session,
which is real and smaller than every spread on our board. Section 20, or
the article.
New
v1.40
Every claim we have tested, finally in one place
There are 44 of them, and until now they were spread across three pages in three
different shapes — folklore on /myths, method in nineteen sections of
/evidence, and the long-form reports in the blog. You had to already know
which one we had filed a question under.
/reports is the shelf: search it, filter it by whether the claim held
up or did not, by movement or direction, and every row carries the two things that decide whether a
percentage means anything — how much data it stands on and what it was measured against.
15 of the 44 do not survive their control, and those are the ones worth reading first.
New
v1.39
Where the day's high and low form — and why the usual answer is an artefact
Every platform in this category sells this report. We ran it on 72,877 trading days across
19 markets and the first answer was wrong, which turned out to be the interesting part.
Cut the day at midnight and the day's high lands in the opening hour more than any
other, in 15 of 19 markets. Run the same measurement with every bar left in its own hour but its
direction randomised, and the opening hour wins in 17 — the famous finding is weaker than
chance. Then move the day boundary to 22:00 UTC, and not one market keeps its answer; six of
them relocate into the London–New York overlap, which is the real result hiding underneath.
What survives is worth knowing. 19:00 UTC — 3pm in New York, the closing auction — holds
the day's high in all three US indices well beyond what direction alone implies, and it gets
stronger under the shifted boundary. And the largest single block of everything significant is a
negative: the 21:00–23:00 rollover makes fewer highs and lows than its own size implies. Read it
in section 19 or as
an article.
New
v1.38
Every page and the extension now tell you which version you are on
A footer line on every page carries the version and links here. The number is not a label
somebody types: it is how many entries this page has, so it cannot move without the change
being described to you, and a change cannot be described here without it moving. Each entry above
carries the version it shipped as, so a number in a footer traces to a specific change.
It matters most for the browser extension, which you install from a
zip rather than from a store — nothing updates it and nothing tells you a newer build exists. It now
shows its own version and says so when the site is ahead of it. /status shows
the version, the build it came from and what shipped last.
Correction
v1.37
The dashboard told Bitcoin holders the market was closed, every weekend
The hours-ahead strip sizes the next eight hours by how far a market usually moves. Those
figures come from a file that stops at Friday, which is right for seventeen markets and wrong for
two: BTC and ETH trade all seven days, and BTC carries 8,134 Saturday hours and
8,877 Sunday hours in the very data the page was already reading. The strip treated "no
figure" as "closed" and announced that Bitcoin was shut for the next eight hours.
It now asks the data which of the two it is looking at, and says trading, but we publish
no weekend figure yet — because that is the true statement. We measured the crypto weekend
before publishing figures for it, and the result is section 18: the
weekend moves 0.85× a weekday hour, still worth a round trip — but the timetable does not
carry across it (hour-shape 0.60 against a same-market control of 0.90), and the biggest hour
moves from 14:00 UTC to midnight. A weekend timetable would be a second timetable, not an
extension of the first.
New
v1.36
The browser extension is a draggable panel now, not just a popup
A popup closes the moment you click your chart, which is exactly when you wanted the number.
The extension can now pin a panel onto the page you are looking at —
drag it by its top bar, and it remembers where you put it. Four views on both the popup and the
panel: this hour on a dial against that market's own average hour, the 24-hour strip, the
whole week grid, and the next eight hours sized by how far the market usually travels. Clicking any
cell opens that exact window on the dashboard.
It asks for no permission to read the sites you visit: the panel is drawn only on the tab
you clicked the icon from.
Correction
v1.35
All nineteen market articles were still claiming a holdout we had withdrawn
On 20 August we withdrew the strategy board's out-of-sample column: rules are filtered on the
full history and then scored on its tail, so the column is the filter that chose the row rather
than a test it passed. /strategies, the alerts, /radar,
/about and the pricing block were all corrected.
The nineteen per-symbol blog articles were not. Each one ended with
"307 finished net positive, and only 214 survived the held-out final third of the history" —
the withdrawn claim, in the pages most likely to be found from a search. Those three figures were
also typed, and two rebuilds stale: the board today tests 5,090 rules and
311 finish net positive. They are now read from the board's own file, and the paragraph says
plainly that a rule chosen and scored on the same history has been filtered, not
validated, and points at section 8, which is the one genuinely
clean holdout we run.
New
v1.34
The three reports this category sells by name, each with the control nobody prints
The blog had one article per market. It now also has one per question —
do weekend gaps fill,
does yesterday's high or low matter, and
does the opening range set the day.
Each one is a claim that gets sold with a real number attached, and each one dissolves
against a matched control: weekend gaps fill 88% of the time within a day and an ordinary
midweek move of the same size fills 88% too; a break of yesterday's extreme holds 50.4% of the time
against 50.9% for an arbitrary level the same distance away; the opening range is broken on
essentially 100% of sessions, so it selects nothing at all. Every market's own table is on
the page, including the cases that disagree with our own pooled figure. The findings themselves are
not new — they are sections 5, 6 and 7 of the evidence page — but a section
anchor is not something a person can land on, and these are.
25 August 2026
New
v1.33
We tested whether UTC is the right clock, and published the answer
Every number here lives in a weekday × hour bucket measured in UTC — and the desks
that make the moves keep their own clocks, which change twice a year. If an effect belongs to a
trading floor rather than to UTC, our grid would be smearing it across two hours for most of the
year and understating everything. Nobody had ever checked.
The whole grid was rebuilt from the same bars on four clocks. No wall clock finds more
than UTC — 184 windows clear our bar in UTC against 167 in New York and 159 in London — so we
are not hiding an effect a floor's clock would reveal. But the total conceals the interesting
half: around the daily settlement the New York and London clocks are genuinely sharper,
holding 78% of all the strength in three hours where UTC holds 65%. Sydney is the control,
because it changes its clocks in the opposite season — it does no better than a clock with
randomly chosen dates, which is how we know the sharpening belongs to the northern desks and not
to any clock that moves. The working, the caveats and what would change our mind are in
section 15 of the evidence page. Nothing on the site moved: this is a
test of a choice we had already made, and it came back in favour of the choice.
23 August 2026
Correction
v1.32
The pricing page was still selling a result we had withdrawn
On 20 August we withdrew the strategy board's out-of-sample column: rules are
filtered on the full history and then scored on its tail, so the column is the filter that
chose the row rather than a test it passed. /strategies says so, and the
alerts, /radar and /about were all corrected at the time.
The pricing block on the homepage was not. It listed
"the full strategy board — all 150 rules, filters, out-of-sample column" as something a Pro
subscription buys, six runs after the column stopped meaning what it says. That bullet now
describes what the board actually gives you: all 150 rules, each labelled SCHEDULE or DRIFT
ONLY, with the spread it stops paying at. Nothing about the board itself changed — only what
we claim for it where people pay. A new check reads the price and the plan ids from one place and
refuses to let a withdrawn claim back onto that block.
Correction
v1.31
The 5-minute view was mixing your hour with the one next to it
The Inside the hour card on the dashboard reads a separate archive keyed on the
broker's clock, which observes daylight saving. Yours may not — most of the world does not
shift with Athens — so the same local hour sits in a different slot of that archive in summer than
in winter. The card worked out which slot your hour belonged to once, then added up twelve
months of it. For roughly half the year the five-minute periods it was adding were the hour
next door to the one every bar is labelled with.
It now works the slot out month by month, which keeps the whole sample and makes
every bar the hour it says it is. The numbers move: across the four markets this card covers,
all 462 weekday-hours were affected, 311 now highlight a different five-minute
window, and one window's own figure moved 16.5 points. ⚠ March and October remain
approximate — the clock changes mid-month and the archive has no key finer than the month.
Improved
v1.30
The status page can now tell a refresh that failed from one that vanished
The weekly job wrote its log in one go, at the end. That is fine when it finishes and
useless when it does not: a run stopped by a reboot, a scheduler timeout or anything else wrote
nothing at all, so /status went on describing the previous run as
though it were the latest. The log is written line by line now, as the work happens, so a run
that dies leaves everything it managed to do — and the page says "this run never finished"
rather than quietly showing you an older one. ⚠ Note that finished and succeeded are
different things and the page keeps them apart: a run that stops itself because our checks failed
has finished properly, and is reported as aborted.
Correction
v1.29
The status page was naming the wrong refresh, and would have for ever
/status answers two questions: is the data current, and did the weekly
job that refreshes it work? The second one was reading the job's log with a pattern that only
matched the log's older format. The format changed months ago — every run now writes a
header line and then everything it did — so the page fell through to the last entry in the old
style and reported the most recent refresh as having started on 15 August. It would have
kept saying that indefinitely: adding ten more runs did not move it. The four verdicts beside it
(deployed, committed, aborted, nothing new) were being computed across every run since
rather than the latest one. The list of recent log lines underneath was genuinely current, which
is why this looked healthy. Fixed, and a new check now fails the build if the run the page names
is not the newest run in the log.
Correction
v1.28
The retracted out-of-sample claim was still on two pages, and in the video script
On 20 August this site withdrew the strategy board's out-of-sample column: rules were
filtered on the full history and then scored on its last 30%, so the column is the filter
that chose the row, not a test it passed. Four surfaces were corrected then. Three were missed, and
they were found today. /strategies still said 96% of rules "do not survive
contact with a spread and a held-out sample", and /about still said the
board tests rules "against held-out data" — both within a dozen lines of the sentences that
had been corrected. Worse, the funnel percentage on both pages was computed from the retracted
column, and the check that watches those numbers had been keeping it arithmetically current.
Survival is now stated on the axis that was never in question — cost: of
5,090 rules tested, 311 clear a realistic spread charged on every trade, so
93.9% never clear it at all. The honest holdout figure, which selects on the first 70% only,
is on /strategies and is 29.6% against the 50% a tail carrying no
information would give. The third surface was the launch video's narration, which had never been
read by any check because it spells its numbers out in words.
Correction
v1.27
The weekly refresh could not finish, and had not run since 15 August
The job that rebuilds this site every Saturday gates itself on a set of consistency checks
and deploys nothing if they fail — which is the right shape, and today it fired for real. Four
changes made on 19 and 20 August had left the job unable to complete: it rebuilt three measurement
files and then required a page it never rebuilt to quote them, it stamped provenance onto the data
six generators too early, and it rewrote about a hundred files without rebuilding the sitemap whose
dates are read from those files. None of it had ever executed, because the last successful refresh
was 15 August and the job was paused on the 20th. The step order is fixed, nine generators
were added to it, and the data on this site is current again. Nothing published was wrong as a
result — the job's own gate is what stopped it, exactly as intended.
19 August 2026
Correction
v1.26
A number on two pages was wrong in both directions
The guide and the FAQ both said: "of 400 liquid weekday×hour buckets, only 50 (12.5%) move
more on average than a 1.0-pip spread", and used it to argue that cost eats most edges. Re-measured
on the current data, that sentence is wrong whichever way you read it. The hour's move beats a
round trip in 471 of 471 liquid buckets — hours are far bigger than the spread. What almost
never beats it is the directional edge, the lean applied to that move: 0.8% of
buckets.
The argument those pages were making was right; the statistic was measuring
something else. Both now carry the two figures separately, along with the copy inside the FAQ's
structured data, which is the version a search engine may quote. All three are now computed from
the shipped files and checked on every build.
Correction
v1.25
The strongest hour on this site is worth one tick
A new out-of-sample test — windows chosen using only pre-2020 candles, then scored only on
2020 onward — found that the single largest block of surviving edge sat at 20:00 UTC, an
hour this site flagged in no way at all while warning about 21:00 and 22:00 beside it. It turns out
to be the New York close: 16:00 in New York is 20:00 UTC in summer and 21:00 UTC in winter,
so the event was smeared across two buckets and neither was named. Resolved through New York's own
clock, all twelve markets that trade the whole clock close down in that hour, the strongest
at 33.4% up.
And it is worth almost nothing. The median bar in that hour is about one
pip — exactly −1.00 in five of the twelve markets — and in eleven of twelve the lean is
smaller than the round trip needed to collect it. An effect that appears in every instrument,
in the same direction, at one named minute, and lands on the same round number, reads as a tick of
settlement spread rather than anyone's view on a currency. The dashboard now names the hour
on both buckets and says what it is worth; section 9 of the evidence page
shows the working. If you had read the 20:00 windows as an opportunity, this is the correction.
New
v1.24
Chosen on one era, scored on another
Everything on this site had been measured on the whole archive, which is exactly what a
sceptic should not accept. There is now a holdout: every window selected using only candles
from before 2020, by the same bar the site publishes, then scored using only candles from
2020 on. Selection survives it — windows that cleared the bar beat the ones that did not, in both
the thin hours and the ordinary ones — but in ordinary hours what survives is half a point of
up-rate, which does not pay a round trip. The control cell, 278,011 candles that should carry
no edge at all, reads −0.01. The dashboard quotes the result for whichever window you are looking
at. Section 8.
New
v1.23
Trading sessions are where the calendar puts them
The session card carried a fixed table of UTC hours, which is how every product in this
category draws Sydney, Tokyo, London and New York — and it is wrong for months of every year,
because the four cities keep their own daylight-saving calendars and do not switch together.
Session membership is now resolved day by day: London is 08:00–15:00 UTC every day, plus 07:00
on 59% of them and 16:00 on 41%, and the card says so. The old fixed band was enough to move
three of forty-eight market-sessions across the significance bar — gold's London figure had been
printed as significant when the calendar does not support it.
16 August 2026
Correction
v1.22
The data page again tells you when the next refresh lands
The release calendar added to /api earlier today never worked: the script
that computes the next refresh date carried a broken quote and threw before it ran, so the line sat
on its placeholder text. It now reads the real instant — the next Saturday 06:00 UTC — and a
new check loads every page in a browser and fails the build on any console error, which is how this
was found at all.
Correction
v1.21
Corrections now reach the installed app
If you added this site to your home screen, it cached its data files and served them
first — which is right for the cubes, whose numbers move by rounding errors, and wrong for the
findings. When one of those was corrected earlier today, an installed app would have shown the
retracted figures for one more visit. Everything under /data that is not
a cube is now fetched fresh, with the cache only as a fallback for when you are offline. The app
also tells you when it is running superseded code and offers a reload, instead of quietly staying
on the version you installed.
New
v1.20
Does the window survive being moved by an hour?
Pick a weekday and an hour and the dashboard now shows the two hours either side of it.
A market does not know where our bucket boundaries are, so an effect with a real mechanism — a
session opening, a fix, the rollover — usually bleeds into the hour beside it. One that stops dead
at both edges is more often the cut than the market. The number that makes this judgeable is
published with it: 30% of the significant windows on this grid stand alone, against
76% on a permuted grid with no hour-of-week structure at all — so agreement is the normal
case here, and isolation is a real warning rather than a hunch.
New
v1.19
The screener can now ask how big the hour is
The old cost filter asked whether an hour's average drift beats the spread — an
expectancy test, and a fair one. It cannot answer the question most people think they are ticking:
is this hour big enough that the spread is not most of it? An hour that swings 30 pips
either way with no net drift fails the first test and passes the second. There is now a filter for
each, and the rows carry the typical move and what share of it the spread takes. The uncomfortable
part: among the four majors, 54% of the windows that clear our own |z| ≥ 3 bar move less than
four spreads, against 25% of all windows — statistical strength on this grid is mildly biased
towards the quiet hours, which is the rollover result stated in money.
Correction
v1.18
We got our own trading-cost figures wrong, by 100x on the indices
The first version of the cumulative-day chart, published earlier today, compared each
market’s drift against a spread table that had been typed from memory rather than read from
the one the strategy board and the screener use. Metals and crypto were wrong; the five stock
indices were wrong by a factor of one hundred. The published conclusion — that the index
Mondays were worth "a fifth of one round trip or less" — was the reverse of the truth: US30 Monday
is about 19× the spread, NAS100 33×, SPX500 15×. The count of market-weekdays
clearing both bars goes from 1 to 4. Every research script now reads the pip size and the
spread from the files that own them (scripts/lib/units.js), and a new
assertion fails the build if any file defines its own copy.
Improved
v1.17
The day chart now asks the harder question
Beating zero is a low bar for a market that drifts upward anyway — a stock index ends most
weekdays higher than it started, and that says nothing about the weekday. Every day-total is now
also tested against that market’s own other weekdays, which is the same rule the rest of
the site follows for significance. Of the four day-drifts that survive their trading cost, only
NAS100 and SPX500 Monday also stand apart from their own week — on 7 years of data, in two
indices that move together, which is one observation and not two.
Correction
v1.16
The cumulative day chart now shows what it costs
"The average day, added up" is the chart every seasonality product draws, and ours drew it
with no uncertainty around it and no reference to trading costs — a line rising 2.5 pips across a
day reads as an edge. Measured from raw hourly bars rather than the aggregate, the same curve now
carries its 95% range, a shaded strip showing what one round trip costs at the same
scale, and the count of individual years that finished up. Of 95 market-weekdays, four have
a whole-day drift that clears both |t| ≥ 3 and the cost of the spread — and only two of
those also differ from their own market’s other weekdays, which is the harder test.
15 August 2026
New
v1.15
Non-farm payrolls, measured
The first Friday of every month at 08:30 New York is the one scheduled event 23 years of
hourly bars can locate without an economic calendar. It moves 18 of the 18 markets we can
test — a median of 160% of an ordinary Friday's same hour, EUR/USD nearly double — and
not one of them shows a direction. The dashboard flags the day; it will never tell you
which way to lean, because the data does not.
New
v1.14
Every page prints properly
The whole site is dark-themed, which used to print as pale grey on white paper. Now it
prints black on white with the links spelled out, tables that repeat their headers across pages,
and a line at the top of every sheet saying where the numbers came from and what they are not.
Correction
v1.13
Alerts got much quieter, and much better
A window now has to clear two bars to reach your phone: it survived the backtest out
of sample, and its hour genuinely differs from that market's own average hour. That takes
the alert list from 126 windows to 22 — about 38 pushes a week instead of 154. The 33 US30 and 21
GER40 windows that used to alert were the index drifting upward, not a schedule.
New
v1.12
The strategy board says why each rule works
Every row is now marked SCHEDULE or DRIFT ONLY. Both are real backtest
results; only the first means the hour itself behaves differently. 39 of 150 rows qualify — and
0 of 28 US30 rules, 0 of 21 GER40. There is a filter for the ones that do.
New
v1.11
Compare two markets on one chart
Pick a second market on the up-rate chart and it draws alongside, with the correlation of
their daily shapes. EUR/USD and GBP/USD come back at +0.85 — holding both is close to one
position at twice the size, which is the thing the number is there to tell you.
Correction
v1.10
The data was eleven days stale, and now says so
The weekly download had been half-failing for a fortnight while its log recorded success —
15 of 19 markets were 11 days behind. Fixed, and made visible: every market's history end date is
on the dashboard, and anything more than nine days old announces itself at the top of the page.
Improved
v1.9
Loads about twenty times lighter
The dashboard used to download all nineteen markets before drawing anything — 384KB before
the first number. It now paints on the one market you are looking at and fetches the rest behind
that. It also works offline, and tells you when it is reading from your device's copy.
Improved
v1.8
Every chart has a table behind it
A Table button on both heatmaps gives the same numbers as text — up-rate, range,
sample, z, and a plain yes or no on significance. Heatmap cells now take keyboard focus and
announce themselves to a screen reader, which they did not before.
Improved
v1.7
Links you can send
Every view now has an address: symbol, timezone and the exact window live in the URL, so a
link reopens what you were looking at. Copy summary puts the numbers on your clipboard with
the sample size, the range and the caveat attached — because a screenshot of "60.7%" travels
without any of them.
14 August 2026
Correction
v1.6
Measured against each market, not a coin flip
Significance used to be measured against a flat 50%. NAS100 and SPX500 close higher in
52.3% of every hour they trade, so their windows all looked bullish for a reason that had
nothing to do with the clock. Every figure is now scored against that market's own average hour.
Nothing moved in FX; in the equity indices six windows that were marked significant no longer
are, which is the correct answer.
Correction
v1.5
Ask the data was answering for the wrong day
Asking about "Tuesday at 06:00" from UTC+8 was returning Tuesday 22:00 UTC when the right
answer is Monday 22:00. Anyone outside UTC was getting a neighbouring window. Fixed, and the
answers now carry their range, their baseline and the year-by-year spread.
New
v1.4
A screener that prices its own false positives
/scan searches every weekday × hour window and prints, beside the
result, how many hits a market with no schedule at all would have produced at your settings.
Take the bar off entirely and it returns 2,221 windows against 2,221 expected from noise — which
is what a screener with no discipline is.
New
v1.3
Every number now carries its range
A percentage from a finite sample is an estimate, so it is quoted with a 95% interval.
UK100 Wednesday 10:00 reads 56.4% and its range is 49.2–63.3% against a 51.0% baseline: it looks
like an edge and is not one. The main chart's shaded band is that interval.
New
v1.2
Year by year, for any window
Pick a weekday and hour and the filter shows one bar per calendar year, so you can see
whether a 60% window was built evenly or by a handful of years. EUR/USD Sunday 21:00 holds in 22
of 24 years; EUR/USD Friday 15:00 splits 12–12, and says so.
New
v1.1
The evidence, and the free data
/evidence publishes the three tests that could have sunk this
product — including the seven markets our own grid fails and the Dow at p = 1.00.
/api documents the aggregates behind every figure: static JSON, no key, no
quota, free to download whether you buy or not.
Under the hood
Not everything belongs on this page. The same weeks added a set of assertions that run
before anything is published — one definition of significance across every surface, the two data cubes
reconciling on all 3,192 windows, the spread tables agreeing, freshness, and a check that the numbers
quoted in our own sales copy still match the strategy board. A second harness boots the dashboard
against the shipped data so a broken page cannot deploy itself on a Saturday morning. None of that is
visible, and all of it is why the entries above can be specific.
The complete record — every angle examined, including the ones we rejected and why —
lives in research/market-watch/COMPONENTS.md in the repository.
Open the dashboard →