Markets › FX · EUR/USD spot (1-hour bars)

Fibonacci 61.8% Pullback Backtest: EUR/USD 1-Hour Bars

A limit order at the 61.8% retracement of a mechanically found impulse, stop at its start, target at its end, on EUR/USD from 2004 to 2026.

EUR/USD spot · 1-hour bars, around the clock · Protocol v1.0 plus the 8 Oct 2026 rules

Buried · No proven edge

A precise level. No proven edge behind it.

BornRules, variants, costs and gates frozen 9 Oct 2026 (fb_spec.md), before any swing or level was computed on EUR/USD
Died9 Oct 2026

Variants tried: 2 · Passed every gate: 0 · Holdout opened: yes (already used)

Short answer: not in our test. We backtested a mechanical Fibonacci 61.8% pullback on EUR/USD 1-hour bars from 2004 to 2026, long only and long and short, net of about one pip of costs a trade. Neither variant passed: both lost money after costs, and neither did better than the same orders placed at other times.How much costs took here, compared across all 54 of our tests →

00The verdict in three lines

  • The 61.8% retracement is the best-known Fibonacci level: after a strong move, wait for price to pull back 61.8% of it and enter in the direction of the move. We made it mechanical (swings from fractals, an impulse of at least 3 ATR, a limit order at 61.8%, the stop at the start of the impulse and the target at its end) and tested it on EUR/USD 1-hour bars from 2004 to 2026, long only and long and short, with the rules, costs, gates and a matched control fixed in a dated specification before any level was computed.
  • Neither variant passed. Both lost money after costs (-87 R over 1,927 trades and -241 R over 3,374), lost in the holdout, and did no better than the same orders placed at other times.
  • The level did not add anything we could measure. The setup pays about 1.6 to 1, so it needs about 38% winners to break even before costs; the long-only version won 37.8%.

01What we tested

Swings: a swing low is a 1-hour bar whose low is strictly below the lows of the two bars before and the two bars after it (a Williams fractal); it is known only when the second bar after it has closed. Swing highs mirror this. Impulse: from the most recent confirmed swing low (L) to the highest high since (H); it counts once H − L is at least 3 times the 14-bar ATR. A new swing low starts a new impulse. Entry: a buy limit order at H − 0.618 × (H − L), recalculated at every bar close while the impulse extends; it fills at that level, or at the open if price gaps below it (an open at or below L cancels it). Exit: stop at L, target at H, both fixed at the fill; if both are touched in the same minute the stop is taken; a level gapped through fills at the open; no time exit. Shorts mirror this from swing highs. One trade per impulse, one position at a time; in the long-and-short version, a long and a short order touched in the same minute are both cancelled (it never happened). Positions and orders are held over weekends.

Two variants: FB-L (long impulses only) and FB-LS (long and short impulses). Nothing else was tried.

02Data and costs

EUR/USD spot, the 1-minute bid history of an IC Markets MetaTrader 4 demo server, 1 January 2004 to 28 September 2026, built into 141,042 one-hour bars. Periods by fill date: development 2004 to 2012, validation 2013 to 2019, holdout 2020 to September 2026. These periods are not new: the same file and years were used by our FX study and the EUR/USD golden cross, so the holdout is reported as already used. Costs: about 1 pip a trade (0.15 pip on every fill for half a 0.3 pip spread, plus 0.7 pip commission), the FX study's model, kept so the EUR/USD tests stay comparable. The overnight swap is not modelled; the average trade was held 12 hours and through 0.53 rollovers.

Engine check: the rules needed a new engine (fb_lib.js). Before the run, fb_selftest.js checked hand-worked cases (swings and ties, an impulse that extends, fills at the level and at a gapped open, an open below the stop, a stop in the entry minute, a stop and a target in the same minute, a gap through the stop, orders and positions across a weekend gap, a long and a short touched together, the costs in R and pips), the bars, ATR and swings against naive recomputations, and both variants trade by trade against an independent minute-by-minute re-implementation (fb_selftest_result.txt).

03Results

R is the distance from the fill to the stop; net R is the sum of the trades' results after costs. The 95% range is the Wilson interval for the win rate. The drawdown includes open losses.

VariantRulesTradesNet after costsR per tradePipsWinners (95% range)Profit factorDrawdown incl. open lossesVerdict
FB-Llong impulses only1,927-87 R-0.04 R-2,386 pips37.8% (36% to 40%)0.93-103.7 RBuried
FB-LSlong and short impulses3,374-241 R-0.07 R-7,033 pips36.9% (35% to 39%)0.89-268.2 RBuried
-200-1000200620102014201820222026validationholdout*FB-LFB-LS

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

By period

VariantDevelopment 2004 to 2012 (trades)Validation 2013 to 2019 (trades)Holdout* 2020 to Sep 2026 (trades)Development tValidation PF
FB-L-21 R (674)-9 R (656)-56 R (597)-0.640.98
FB-LS-186 R (1,181)+5 R (1,116)-61 R (1,077)-4.291.01

The long-only version lost in all three periods. The long-and-short version lost heavily in development (t -4.29), was about flat in validation and lost in the holdout.

04The arithmetic of 61.8%

With the entry at 61.8% of the impulse, the stop at its start and the target at its end, a trade risks about 0.382 of the impulse to make about 0.618 of it: a payoff of about 1.6 to 1 before costs. Such a trade breaks even before costs if it reaches the target about 38% of the time. The real payoff differs a little, because gapped fills and gapped stops move the prices:

VariantAverage winner, before costsAverage loser, before costsWin rate needed to break even before costsWin rate (95% range)
FB-L+1.67 R-1.01 R37.6%37.8% (36% to 40%)
FB-LS+1.67 R-1.01 R37.7%36.9% (35% to 39%)

For the long-only version the win rate needed lies inside the 95% range of the win rate it achieved: before costs it was about flat. Costs are what made it a loss:

VariantGross RNet RCost per tradeGross per tradeMedian R
FB-L+12.0 R-86.6 R0.051 R+0.01 R23 pips
FB-LS-74.5 R-241.1 R0.049 R-0.02 R24 pips

05By year

Year of the fillFB-L tradesFB-L net RFB-LS tradesFB-LS net R
200461+4.0 R95-4.6 R
200560-3.9 R112-13.6 R
200649+4.6 R93-14.8 R
200783-14.2 R148-38.0 R
200879-4.7 R139-40.3 R
200973-9.5 R131-6.0 R
201083-9.1 R150-35.6 R
201193+5.1 R157-28.2 R
201293+6.3 R156-4.6 R
201391+0.2 R146-30.2 R
201496-20.5 R166-12.9 R
201593+3.3 R165+17.9 R
2016105+10.6 R158+10.4 R
201773+23.6 R151+23.5 R
201897-4.4 R168+6.3 R
2019101-21.5 R162-9.7 R
202089-10.5 R165-21.6 R
202179-24.6 R144-9.0 R
202294-2.8 R162-9.3 R
202395+16.8 R165+11.5 R
202484-24.0 R165-31.2 R
202589-2.1 R165+7.1 R
2026 (to Sep)67-9.2 R111-8.2 R

06Longs, shorts and exits

VariantLongs: trades / R per tradeShorts: trades / R per tradeHow the trades endedAverage hours heldAverage rollovers held
FB-L1,927 / -0.04 R–target 728 · stop 1,198 · open at the end of the data 112.30.53
FB-LS1,704 / -0.04 R1,670 / -0.10 Rtarget 1,243 · stop 2,130 · open at the end of the data 113.10.56

Of the impulses that qualified and placed an order, 36.5% (long only) and 32.0% (long and short) were filled; most of the others were replaced by a new swing before price came back to 61.8%. The short side lost more than the long side (-0.10 R against -0.04 R a trade), although EUR/USD fell 1,225 pips over the period.

Trades with a tiny risk. When price opens below the 61.8% level but just above the stop, the order fills at the open and R becomes very small: 14 trades of the long-and-short version had R below 5 pips, and a cost of 1 pip turned each of them into a large loss in R (-6.0 R in total). The rule allows these fills, so they stay in the results.

07Is it the level or the market?

The benchmark is a time-shifted setup control: every real impulse that placed an order keeps its direction, its size and how long its order stayed in play, but its start is moved by one random offset of at least 5% of the bar series, so the same orders land at other times. At the new time the order is rebuilt on the real prices (for a long: the target at that bar's high, the stop one impulse-size below it, the entry at 61.8%), with the same fills, costs and one-position rule. 500 runs with fixed seeds; the bar is the 95th percentile of the average net R per trade. Fewer control orders are filled than real ones, because a rebuilt level is not where a real pullback turned.

VariantTradesReal average per tradeControl trades (mean)Control medianControl 5th to 95thPercentile (95 needed)
FB-L1,927-0.04 R1,134-0.06 R-0.14 R to +0.03 R60.0
FB-LS3,374-0.07 R2,267-0.06 R-0.11 R to +0.01 R40.2

Both variants sit in the middle of the control (60.0 and 40.2): the swing, the impulse and the 61.8% level did not make the orders better than the same orders placed elsewhere.

08The gates

VariantTrades1. PF ≥ 1.2 in validation2. ≥ 50 trades in each period3. t ≥ 2.0 on development4. Above the 95th percentile of the time-shifted control5. Positive without the 10 best trades6. Holdout net positive (already used)
FB-L1,927failpassfailfailfailfail
FB-LS3,374failpassfailfailfailfail

The bar for the development t-statistic is 2.0 here, not 2.5, because only two variants were tried (the protocol raises it to 2.5 above four). It made no difference: both development t-statistics were negative (-0.64 and -4.29).

09Verdict by variant

VariantCauseGates failedVerdict
FB-LNo proven edge1, 3, 4, 5, 6Buried
FB-LSNo proven edge1, 3, 4, 5, 6Buried

Not tested: other retracement levels, other swing definitions or impulse sizes, other exits, other pairs and timeframes, filters, the overnight swap and live fills.

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

What the results show

  • Neither variant passed: both cleared only the sample-size gate. The long-only version lost 0.04 R a trade over 1,927 trades and the long-and-short version 0.07 R over 3,374, after costs of about one pip a trade.
  • Before costs the long-only version was about flat (+0.01 R a trade). It won 37.8% of its trades; with the payoff it had, it needed about 37.6% to break even before costs.
  • The real orders did no better than the same Fibonacci-shaped orders placed at other times (percentiles 60.0 and 40.2; 95 needed).
  • The short side lost more than the long side, although EUR/USD fell over the period.

What remains unknown

  • Other retracement levels (38.2%, 50%, 78.6%), other swing definitions, other impulse sizes and other exits. We tested one of each, fixed in advance.
  • Other pairs and timeframes, and filters such as trend or session.
  • The effect of the overnight swap, which we did not model; positions were held about half a night on average.

Why it failed

Entering at 61.8% with the stop at the start of the impulse and the target at its end risks about 0.382 of the impulse to make about 0.618 of it, a payoff of about 1.6 to 1. That only pays if price comes back to the end of the impulse more often than about 38% of the time. In this test it did so 37.8% of the time for the long-only version, which is about break-even before costs, and costs of about 0.051 R a trade turned that into a loss.

What you can apply to your own tests

  • Work out the win rate your exit needs before you test the entry: a fixed stop and target set the break-even win rate by themselves.
  • Compare the result with the same orders placed at other times. A level that looks precise can behave like any other price.
  • Watch trades whose risk is tiny: a fill just above the stop makes a fixed cost of one pip worth several R.
  • Check your data clock against a known event, such as a scheduled US data release, before you test anything that depends on the time of day.

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 Fibonacci 61.8% retracement strategy work?

Not in our test. On EUR/USD 1-hour bars the long-only version ended at -87 R over 1,927 trades after costs and the long-and-short version at -241 R over 3,374. Both sat in the middle of a matched control (percentiles 60.0 and 40.2; 95 needed).

What win rate does a 61.8% Fibonacci entry need?

With the stop at the start of the impulse and the target at its end, a trade risks about 0.382 of the impulse to make about 0.618: about 1.6 to 1, so it breaks even before costs at about 38% winners. The long-only version won 37.8% of its trades, about break-even before costs (+0.006 R a trade).

How do you make a Fibonacci retracement mechanical?

We found swings with Williams fractals (a low below the two bars on each side), took the impulse from the last swing low to the highest high since, required it to be at least 3 times the 14-bar ATR, and placed a limit order at the 61.8% level, with the stop at the swing low and the target at the high.

How was the Fibonacci pullback tested?

On EUR/USD spot 1-minute broker data from 2004 to 2026, built into 1-hour bars, 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. The historical periods had been used by earlier tests, which the post states. Read the protocol.

10Check our arithmetic

Frozen specificationRules, variants, costs, gates, control, and the amendment made before the run. Dated before any level was computed on EUR/USD.
fb_spec.md
CodeThe engine, the independent re-implementation, the self-test, the run and the data checks. The run needs your own MT4 EUR/USD 1-minute history.
fb_lib.js · fb_ref.js · fb_selftest.js · fb_run.js · fb_clock.js · fb_timecheck.js · fb_newsclock.js · fb_audit.js
Shared code it usesLoaded by the files above (the MT4 loader, statistics, the control helpers).
control_audit_lib.js · em_lib.js · fx_data.js · gh_lib.js · gx_lib.js · hourly_lib.js · ma_lib.js · rb_lib.js · rsi2_protocol.js
ResultsSelf-test result, the console output of the run and all numbers as one file.
fb_selftest_result.txt · fb_results.txt · fb_summary.json
Trade logs (CSV)Every trade of both variants, net of costs, with R, pips and the exit reason.
FB-L · FB-LS
Data recordFile hashes, the gaps in the data, and the clock checks.
data_manifest.md · data_holes_eur.json · fb_audit.txt · fb_timecheck.txt · fb_newsclock.txt

Code provenance: our own code, written from the standard definitions of the Williams fractal, the ATR and the Fibonacci retracement. No third-party source code is used or published.

11Data notes

The clock of this file. Before the run we checked the file's time stamps against an outside event: the price jump at US data releases, which come out at 08:30 New York (the payrolls, the weekly jobless claims). From 2015 the jump sits at 08:30. In most weeks of 2005 to 2014 it sits at 07:30, so in those years the time stamps are about one hour early; from 2015 the same happens in many of the weeks when the US and European clocks change on different dates. This rule trades whole 1-hour bars around the clock and has no time-of-day condition, so a whole-hour error moves time stamps but leaves the content of every bar, and the prices of every trade, unchanged. We checked that: with the time stamps of 609 weeks moved by one hour, both variants gave exactly the same trades at the same prices, and no trade changed period. The finding matters for tests that depend on the time of day. We audited the ones we had published on this broker's data the same day: no verdict changed, and the comparison is in the clock-audit sections of the gold opening-range breakout and the FX study.

Gaps. Gaps of more than 30 minutes inside the trading week were listed and classed (data_holes_eur.json); prices were never filled. Removing the trades whose order or position was in play across a suspect or unclear gap does not change either verdict:

VariantTradesRemovedR per tradeVerdict
FB-L1,92716-0.04 R → -0.05 RBuried → Buried
FB-LS3,37425-0.07 R → -0.07 RBuried → Buried

Source. A broker's demo history, not an exchange record: the early years may contain interpolated bars, and costs are held constant across years, which flatters 2004 to 2012.

12Corrections

22 Oct 2026, navigation: added a link to the new guide comparing trading costs across all our tests. No result changed. Before the run, two points of the specification were corrected and dated in it: the last bar of the data closes at 15:46, not 15:47, and the clock treatment described above replaced a planned week-by-week correction after the clock check found a different pattern. While writing the self-test, one of its planned checks was found not to be possible as written and was split in two; no rule 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