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

Improved v1.93

One menu, on every page

Until today this site showed six different menus depending on which page you were on — the dashboard offered one set, the homepage another, the alerts page a third. A visitor never saw the same site twice. There is now one navigation everywhere: a short row on a wide screen, and on a phone a menu button on the left that opens a drawer listing every page, grouped into Use, Learn and More. Same list on every page, so you learn it once.

The menu is written in exactly one place; the build refuses if any page's copy of it drifts, or if a page exists that the drawer cannot reach.

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 →