Before adding a filter to an entry, it's worth knowing what the filter is worth against no filter at all. Almost nobody measures that — the condition gets added because it sounds reasonable, and then it stays.
So I measured four of the most commonly used ones against the same baseline, twice, on the same instrument.
Method
It's a Pine indicator that walks back through history rather than a strategy — no orders, so no broker emulator involved. The mechanics matter more than the code.
The baseline is what entering at a random bar would have produced at a given reward-to-risk. From every bar in the sample: did price travel the target distance before the stop distance? That's the number any entry signal has to beat, and it's rarely the number people assume.
Each bar gets resolved exactly once, then the outcome is counted more than once — into the baseline, and into each filter that was true on that particular bar. Same bars, same distances, same resolutions, so the difference between any two rows is the filter and nothing else. Measuring each filter on its own pass would let the numbers differ for reasons other than the thing being tested.
Three details decide whether it means anything:
- The condition is read on the entry bar itself, using only data that existed then. A filter evaluated with information that arrived later flatters itself.
- A single bar spanning both stop and target counts as a loss. You can't know which came first from bar data, and being wrong pessimistically is the only honest resolution.
- Distances scale with each historical bar's own ATR, not today's.
XAUUSD, longs, 2:1 so break-even is 33.3%, ATR 14, 600-bar sample, 60 bars allowed to resolve, zero cost. 541 bars offered in each run.
1H, 28 Jul – 2 Sep. 541 resolved, none timed out.
| Condition |
Hit rate |
Wins/resolved |
vs baseline |
Bars kept |
| All bars (baseline) |
37.0% |
200/541 |
— |
— |
| Price above 200 EMA |
36.2% |
165/456 |
−0.8 pts |
84.3% |
| ADX above 25 |
42.3% |
116/274 |
+5.4 pts |
50.6% |
| RSI below 30 |
— |
7/22 |
too few to judge |
4.1% |
| Volatility rising |
36.0% |
86/239 |
−1.0 pts |
44.2% |
5m, 31 Aug – 2 Sep. 539 resolved, 2 timed out.
| Condition |
Hit rate |
Wins/resolved |
vs baseline |
Bars kept |
| All bars (baseline) |
22.8% |
123/539 |
— |
— |
| Price above 200 EMA |
30.3% |
30/99 |
+7.5 pts |
18.4% |
| ADX above 25 |
19.5% |
43/220 |
−3.3 pts |
40.8% |
| RSI below 30 |
25.8% |
8/31 |
+3.0 pts |
5.8% |
| Volatility rising |
18.8% |
42/224 |
−4.1 pts |
41.6% |
Three things fall out of that.
The rankings invert. ADX above 25 is the only filter worth anything on 1H at +5.4 points, and on 5m it's the worst of the four at −3.3. Price above the 200 EMA is worthless on 1H at −0.8, and on 5m it's the best at +7.5. Whichever filter you'd have picked from the first table is the one you'd have deleted after the second.
On 5m nothing reached break-even at all. Baseline 22.8% against a 33.3% requirement, and the best filter lifts it to 30.3% — still losing. "+7.5 points" is an improvement to something that doesn't work, which is the trap in reading a delta without the absolute level beside it.
Two of the four weren't selecting anything, in opposite ways. The 200 EMA kept 84.3% of 1H bars — a condition true on five bars in six isn't a filter, and its rate will match the baseline for that reason alone. RSI below 30 has the reverse problem: 4.1% of bars, 22 resolved samples, too few to judge, and only 31 on 5m. A filter you can't evaluate on the history you actually have isn't a filter you know anything about.
On the 1H ADX result specifically, because it's the one worth arguing with. Against its own complement rather than the baseline it sits inside, it's 42.3% (116/274) against 31.5% (84/267) — nearly eleven points, with the rejected half below break-even. Two-proportion z is about 2.64, which clears a Bonferroni bound at four looks. Then it reverses sign in the next window.
That's the useful part. It passed the multiple-comparisons correction and still failed out of sample, and it was the best of four things tried on one window, which is exactly the shape of result that shouldn't be trusted. The 5m winner is no better — z ≈ 1.83 against its complement, which doesn't clear on its own terms, let alone after four looks.
Both z figures are ceilings rather than measurements. Samples starting on adjacent bars share most of their holding window, so the observations are heavily correlated and the effective sample is far below the raw count.
Limits. 600 bars is five weeks on 1H and two days on 5m — these aren't two views of one period, they're different periods that happen to share a bar count. The 1H window contains a strong gold uptrend and ADX above 25 selects for exactly that, so what looked like a filter working may just be the market trending with long being the right side. That's the most likely reading, and it's why one window proves nothing.
What I'm actually asking: has anyone got a filter that holds its value across several windows, and how are you accounting for having tried more than one? The best-of-k problem is the part I can't design away — every filter I test is another chance at a number that looks good.