Markets › FX · EURUSD spot (broker data), daily

Inside Bar Trading Strategy Backtest: EURUSD Daily, 22 Years

The best-known price action setup, the daily inside bar breakout, on every EURUSD day from 2004 to 2026: win rate, two targets, a trend filter, costs and a comparison with the same trades on random days.

EURUSD · daily bars (17:00 New York) · inside bar breakout of the mother bar · Protocol v1.0 plus the 8 Oct 2026 rules

Buried · No proven edge

The pause was real. The breakout meant nothing.

BornFrozen 21 Oct 2026 (ib_spec.md), before any bar was computed
Died21 Oct 2026

Variants tried: 3 · Passed every gate: 0 · Inside bars found: 795 · Holdout opened: yes (already used)

Short answer: not on EURUSD daily charts in our test. Buying or selling the next-day break of the mother bar after a daily inside bar, with the stop at the other side, lost money before costs from 2004 to 2026 (-0.034 R a trade at 1R over 401 trades) and did worse than the same trades on random days; with a 50-day trend filter it came out around zero (+0.011 R a trade).How much costs took here, compared across all 54 of our tests →

00The verdict in three lines

  • We tested the inside bar trading strategy on EURUSD daily bars from 2004 to 2026: after a day whose high and low stay inside the previous day's (the mother bar), buy a break above the mother bar or sell a break below it the next day, stop at the other side, target 1R or 2R. 1.5 pips a round trip.
  • The breakout lost before costs. 795 inside bars (13.5% of days) gave 401 trades at 1R: 48.4% winners, -0.034 R a trade before costs, worse than the same trades placed on random days.
  • A trend filter only brought it to zero: +0.011 R a trade after costs over 225 trades, no better than chance. All three versions buried.

01What is the inside bar trading strategy?

An inside bar is a candle whose high is below the previous candle's high and whose low is above its low: a pause inside the range of the mother bar. Price action traders read it as compression before expansion and trade the breakout of the mother bar, usually on daily charts, most often in forex. Write-ups agree on the core and differ on filters; we fixed this common reading before running anything:

  • The inside bar candlestick pattern: a daily bar (17:00 to 17:00 New York, the forex day) strictly inside the previous one. Equal highs or lows do not count.
  • Inside bar breakout entry: for the next day only, a buy stop 1 pip above the mother bar's high and a sell stop 1 pip below its low; the first one hit is the trade, the other is cancelled; if neither is hit that day, both are cancelled.
  • Stop: 1 pip beyond the other side of the mother bar. That distance is 1R, a median 113 pips on EURUSD.
  • Three versions: IB-1R (target 1R), IB-2R (target 2R), IB-2R-T (target 2R, only in the direction of the 50-day moving average, as many educators advise). A trade still open after 20 trading days closes at that day's close (our addition, so that no trade lasts months). One trade at a time.

02How we tested it

EURUSD, the 1-minute bid history of an IC Markets MetaTrader 4 demo server, January 2004 to 28 September 2026, built into daily bars on the forex day (the server's midnight, 17:00 New York; days with fewer than 600 minutes, such as holidays, are not bars). Stops and targets are checked minute by minute; if both fall in one minute, the stop is taken. Costs: 1.5 pips a round trip, shown also at 1.0 and 2.5; an overnight-swap stress of 0.5 pip a night is shown too. Periods: 2004 to 2012, 2013 to 2019, and a holdout from 2020 already used by our earlier EURUSD tests. Control: every trade moved to another day at the same time, same direction and stop distance, 500 times. Engine check: hand-worked days and an independent re-implementation that matched every trade of the three versions; it passed on its first run (ib_selftest_result.txt). The file's clock was checked (no week to correct).

03Does the inside bar strategy work?

Net R after 1.5 pips a round trip. R is the distance from the entry to the stop.

VariantRuleTradesWin rate (95% range)Gross per tradeCost per tradeNet per tradeNet totalNet pipsProfit factorVerdict
IB-1RBoth breaks, target 1R40148.4% (44% to 53%)-0.034 R0.015 R-0.049 R-20 R-1,817 pips0.91Buried
IB-2RBoth breaks, target 2R32934.7% (30% to 40%)-0.045 R0.015 R-0.060 R-20 R-2,445 pips0.91Buried
IB-2R-TOnly with the 50-day trend, target 2R22536.4% (30% to 43%)+0.025 R0.015 R+0.011 R+2 R+443 pips1.02Buried
-20 R0 R200620102014201820222026validationholdout*IB-1RIB-2RIB-2R-T

Cumulative net R by month. * Holdout already used before this test.

By period

Variant2004 to 2012 (trades)2013 to 2019 (trades)Holdout* 2020 to 2026 (trades)t, first periodPF, second period
IB-1R-17.6 R (171)-3.5 R (123)+1.5 R (107)-1.350.94
IB-2R-10.3 R (142)-5.3 R (96)-4.3 R (91)-0.640.92
IB-2R-T+3.8 R (104)-2.9 R (67)+1.4 R (54)0.270.94

Inside bar strategy win rate and success rate: how trades ended

VariantHit the targetHit the stopClosed after 20 daysMedian stop (pips)Median days held
IB-1R47.4%50.9%1.7%1132
IB-2R27.7%63.8%8.5%1133
IB-2R-T29.8%62.2%8.0%1134

With a 1R target the inside bar breakout won 48.4% of the time, a little under the 50% a coin toss would give with symmetric exits; with 2R, 34.7%, just above the one in three a 2R target needs to break even, but not enough once the trades closed early at the 20-day limit are counted. A good-sounding win rate is not the point; the average after costs is.

04Inside bar breakout or random entry?

VariantTradesReal net per tradeControl medianControl 5th to 95thPercentile (95 needed)
IB-1R401-0.049 R-0.011 R-0.106 R to +0.092 R26.2
IB-2R329-0.060 R-0.012 R-0.151 R to +0.157 R29.6
IB-2R-T225+0.011 R-0.010 R-0.197 R to +0.179 R57.6

The control places every trade on another day at the same time, same direction, same stop distance and exits, 500 times. Without the trend filter, the inside bar trades did worse than most of those random-day runs; with it, they landed in the middle. The pattern did not add information about direction.

05Not a cost problem

VariantBefore costsAt 1.0 pipAt 1.5 pips (verdict)At 2.5 pipsWith a 0.5-pip nightly swap
IB-1R-0.034 R-0.044 R-0.049 R-0.059 R-0.071 R
IB-2R-0.045 R-0.055 R-0.060 R-0.070 R-0.100 R
IB-2R-T+0.025 R+0.015 R+0.011 R+0.001 R-0.030 R

Daily stops are wide (a median 113 pips), so 1.5 pips is about 0.015 R a trade; the result barely moves between 1.0 and 2.5 pips. The swap matters more: trades last a few days, and at 0.5 pip a night even the trend-filtered version, the only one above zero, falls below it.

06Year by year, long and short

YearInside barsIB-1R net (trades)IB-2R net (trades)IB-2R-T net (trades)
200435-2.2 R (16)-1.7 R (13)-2.1 R (8)
200532+3.8 R (16)+7.1 R (14)-0.8 R (10)
200627-3.2 R (11)+1.9 R (10)+0.9 R (8)
200733-5.1 R (19)-1.2 R (16)+1.3 R (11)
200841-5.8 R (23)-7.2 R (22)-1.2 R (16)
200943-5.2 R (27)-5.9 R (20)-1.9 R (16)
201024-3.2 R (17)+1.8 R (16)+8.7 R (10)
201140+6.8 R (25)+1.2 R (16)+1.8 R (12)
201229-3.6 R (17)-6.2 R (15)-2.9 R (13)
201345+2.6 R (25)-3.0 R (16)+4.9 R (10)
201435-0.3 R (16)+4.9 R (12)+1.0 R (10)
201544+3.4 R (14)+5.0 R (14)+1.2 R (10)
201642-2.3 R (20)-1.3 R (16)-3.7 R (12)
201729-1.2 R (13)-4.6 R (11)-1.1 R (7)
201829-8.3 R (18)-6.9 R (14)-5.1 R (8)
201937+2.6 R (17)+0.5 R (13)+0.1 R (10)
202028+3.7 R (16)+4.8 R (13)+5.2 R (8)
202132-3.6 R (16)-6.4 R (14)-5.2 R (8)
202237-5.2 R (17)-8.9 R (14)-1.8 R (10)
202331+3.2 R (18)+4.1 R (16)+2.4 R (10)
202432+0.7 R (13)+2.0 R (11)-0.0 R (5)
202540+2.7 R (15)+3.1 R (13)+4.3 R (7)
2026 (to 28 Sep)30-0.1 R (12)-3.0 R (10)-3.4 R (6)
VariantLongs: trades / gross / net (R)Shorts: trades / gross / net (R)
IB-1R218 / -3.9 R / -7.1 R183 / -9.9 R / -12.6 R
IB-2R179 / -13.5 R / -16.2 R150 / -1.4 R / -3.6 R
IB-2R-T128 / +5.1 R / +3.2 R97 / +0.6 R / -0.9 R

07The gates

VariantTrades1. PF ≥ 1.2 in validation2. ≥ 50 trades in each period3. t ≥ 2.0 on development4. Above the 95th percentile of the moved-entry control5. Positive without the 10 best trades6. Holdout net positive (already used)
IB-1R401failpassfailfailfailpass
IB-2R329failpassfailfailfailfail
IB-2R-T225failpassfailfailfailpass

The data-gap check

VariantTradesOpen across a suspect gapNet per tradeVerdict
IB-1R40135-0.049 R → -0.056 RBuried → Buried
IB-2R32944-0.060 R → -0.126 RBuried → Buried
IB-2R-T22526+0.011 R → -0.050 RBuried → Buried

08Verdict by variant

VariantCauseGates failedVerdict
IB-1RNo proven edge1, 3, 4, 5Buried
IB-2RNo proven edge1, 3, 4, 5, 6Buried
IB-2R-TFragile1, 3, 4, 5Buried

No proven edge (IB-1R, IB-2R): negative before costs, worse than random days. Fragile (IB-2R-T): slightly positive overall, negative without its ten best trades.

TWhat this shows, and what to take into your own tests

What the results show

  • Trading the break of the mother bar after a daily inside bar on EURUSD lost money before any cost: -0.034 R a trade with a 1R target and -0.045 R with 2R, over 401 and 329 trades from 2004 to 2026.
  • The same trades placed on other days did better (the inside bar trades sat at the 26th and 30th percentile of 500 random-day runs). The pattern did not point the way.
  • Taking only breaks in the direction of the 50-day average brought it to about zero (+0.011 R a trade after costs), no better than chance and negative without its ten best trades.

What remains unknown

  • Other markets and timeframes (stocks, indices, gold, 4-hour charts), and inside bars with extra conditions such as a key level or a pin bar. We tested the plain daily setup on EURUSD.
  • Fading the breakout ("inside bar false break"). Its result would roughly be the mirror image of ours before costs, small and not significant; we did not test it as a rule.
  • Your own discretion. Educators teach the inside bar with context we cannot code without inventing rules.

Why it was buried

Not because of costs: with a typical 113-pip stop, 1.5 pips is only 0.015 R a trade. An edge in the breakouts themselves was not demonstrated: they lost before costs, and the same trades on random days did as well or better. The trend filter removed the worst trades but left nothing a gate could confirm.

What you can apply to your own tests

  • Test the setup before the story. "Compression, then expansion" sounds right; on 795 daily inside bars it did not predict the direction.
  • Compare with the same trades on random days. A pattern that does worse than random timing is telling you something.
  • Separate the cost question from the edge question. Here costs were small; the edge was missing.

A note on the numbers: drawdown figures are measured on closed trades unless a table says it includes open losses. Open losses inside a trade are not counted in a closed-trade drawdown, so real account risk is higher, especially for systems with no stop. Backtests are not live trading.

FAQCommon questions

Does the inside bar trading strategy work?

Not in our backtest on EURUSD daily bars. Over 795 inside bars from 2004 to 2026, the breakout made -0.049 R a trade after costs with a 1R target and -0.060 R with 2R; only the version filtered by the 50-day trend was slightly positive (+0.011 R), and no better than random entries.

What is the inside bar strategy win rate?

In our test 48.4% with a 1R target, 34.7% with 2R and 36.4% with 2R and the trend filter. The win rate mostly reflects the target; the average after costs decides whether a strategy works.

What is an inside bar?

A candle whose high is below the previous candle's high and whose low is above its low. The previous candle is called the mother bar. Traders read it as a pause before a move and trade a break of the mother bar's high or low.

How do you trade an inside bar breakout?

The common way, which we tested: place a buy stop just above the mother bar's high and a sell stop just below its low, keep whichever triggers first, and put the stop at the other side of the mother bar. Targets are often 2R; some traders only take breaks in the direction of the trend.

How was the inside bar strategy tested?

On 22 years of EURUSD daily bars built from 1-minute data, with rules written and dated before the data was run, costs included on every trade, results split into development, validation and holdout periods, a random-entry control as the benchmark, and every variant reported. Read the protocol.

09Check our arithmetic

Frozen specificationThe bars, the inside bar, the orders, the exits, costs, periods, gates and control, dated before any bar was computed.
ib_spec.md
CodeThe engine (its readings of the rules at the top), the independent re-implementation, the self-test, the run (node ib_run.js), and the clock check and gap audit (node ib_clock.js). Needs your own MT4 EURUSD history.
ib_lib.js · ib_ref.js · ib_selftest.js · ib_run.js · ib_clock.js
Shared code it usesThe MT4 loader, statistics and control helpers.
control_audit_lib.js · fx_data.js · gh_lib.js · gx_lib.js · hourly_lib.js · ma_lib.js · rsi2_protocol.js
ResultsSelf-test result, the console output of the run, all numbers, the clock check and the gap list.
ib_selftest_result.txt · ib_results.txt · ib_summary.json · ib_clock_result.json · data_holes_eurusd.json
Trade logs (CSV)Every trade: the inside bar day, entry and exit (New York time), direction, entry, stop, exit, R and the mother bar in pips, the exit reason, days held, rollovers, gross and net pips and R, and the swap stress.
IB-1R · IB-2R · IB-2R-T

Code provenance: our own code, written from the rules in the specification.

10Data notes

Source. A broker's demo history of spot EURUSD, bid prices, built into daily bars on the 17:00 New York boundary; other charts with other day boundaries show different inside bars. Spreads are not in the file, so costs are an assumption, shown at three levels. Gaps. Suspect gaps outside weekends and the daily rollover are listed; without the trades that cross one, no verdict changes.

11Corrections

22 Oct 2026, navigation: added a link to the new guide comparing trading costs across all our tests. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing trend following and mean reversion across all our tests. No result changed.

+More tests and guides