Strategies we backtested London breakout

Tested by BacktestingMax

London breakout strategy backtest on forex and gold

Does the London breakout strategy work?

Mostly no, in our backtest. When we waited for a candle to close outside the Asian range, 13 of 18 tests lost money. The Asian range is the highest and the lowest price from 00:00 to 07:00 London time. We tested 8 forex pairs and gold from 2020 to 2025, after trading costs, each on 5-minute and 15-minute charts. From 07:00 to 10:00, the strategy buys when price breaks above the range and sells short when it breaks below. The stop-loss is at the other side of the range. The take-profit is twice the stop-loss distance (2R), and trades still open at 16:00 close then. GBP/USD and EUR/USD lost money on both charts: on about half of the days, price broke both sides of the range. Only USD/JPY and EUR/JPY made money in both 2020–2023 and 2024–2025. With stop orders instead, 6 of the 9 markets made money (a stop order gives the same trades on both charts, so that is 12 of 18 tests). Stop orders sit at the range high and low and open a trade as soon as price reaches them. But our test filled them at the exact range price, with no trading cost. With half the spread (the gap between the buy and the sell price) on each entry, as a candle-close entry pays, they came to about break-even over all 9 markets.

18 backtests 2020–2025 Trading costs included Tested 26 October 2026

Where it worked 18 backtests
Made money
5
of 18 tests, using a candle-close entry
Made money in both periods
4
2020–2023 and again 2024–2025
Best backtest
+43%
USD/JPY, 5-minute chart: account growth 2020–2025
Stop orders at the range high and low, filled at the exact price
10
tests made money in both periods, compared with 4 using a candle-close entry

Made money in both periods

  • USD/JPY, 5-minute
  • USD/JPY, 15-minute
  • EUR/JPY, 5-minute
  • EUR/JPY, 15-minute

The results

Results on every market

Each box shows one backtest of the London breakout using a candle-close entry, from 2020 to 2025, after trading costs: the % result, and a small chart of the account balance. The solid line is the account balance and the dashed line is the starting balance. Green results made money; red results lost money. Under each result: whether it made money in both 2020–2023 and 2024–2025, or passed all four of our checks (see "How a test passes" further down).

Market 5-minute 15-minute
EUR/USD −29% Lost money −13% Lost money
GBP/USD −40% Lost money −22% Lost money
USD/JPY +43% Made money in both periods +26% Made money in both periods
GBP/JPY −15% Lost money −9% Lost money
EUR/JPY +36% Made money in both periods +25% Made money in both periods
EUR/GBP −61% Lost money −48% Lost money
AUD/USD −20% Lost money −22% Lost money
USD/CHF −78% Lost money −72% Lost money
Gold +2% Made money overall, lost in one period −10% Lost money
All the numbers, test by test
Market Chart Trades Win rate Profit factor Result Max drawdown 2020–2023 2024–2025 Monte Carlo drawdown Trading costs
EUR/USD 5-minute 1,363 41.8% 0.96 −29.4% −43.4% −8.7% −22.7% −58.0% $4,133
EUR/USD 15-minute 1,303 44.1% 0.98 −13.0% −41.1% +10.6% −21.3% −51.8% $4,401
GBP/USD 5-minute 1,421 41.6% 0.93 −39.5% −52.3% −43.9% +7.8% −62.1% $3,569
GBP/USD 15-minute 1,364 42.3% 0.96 −21.5% −40.2% −32.5% +16.4% −54.6% $3,714
USD/JPY 5-minute 1,049 49.3% 1.09 +43.0% −16.2% +36.1% +5.1% −29.9% $2,987
USD/JPY 15-minute 987 48.7% 1.06 +26.2% −14.0% +20.6% +4.6% −30.3% $2,570
GBP/JPY 5-minute 1,259 44.6% 0.97 −14.7% −27.0% −6.9% −8.3% −47.5% $5,040
GBP/JPY 15-minute 1,197 45.4% 0.98 −8.9% −25.1% −4.9% −4.2% −44.6% $4,775
EUR/JPY 5-minute 1,236 48.3% 1.07 +36.3% −19.4% +16.7% +16.8% −34.7% $4,280
EUR/JPY 15-minute 1,162 48.3% 1.05 +24.5% −16.8% +10.0% +13.2% −34.0% $3,811
EUR/GBP 5-minute 1,492 40.1% 0.92 −60.5% −75.6% −49.7% −21.5% −73.8% $9,439
EUR/GBP 15-minute 1,452 40.9% 0.94 −47.7% −70.8% −34.8% −19.8% −67.0% $10,583
AUD/USD 5-minute 1,080 47.1% 0.94 −20.0% −24.4% −15.5% −5.4% −44.2% $3,153
AUD/USD 15-minute 1,002 47.4% 0.93 −22.0% −28.0% −16.1% −6.9% −42.8% $2,831
USD/CHF 5-minute 1,415 38.1% 0.85 −78.4% −82.2% −61.4% −44.0% −82.8% $6,411
USD/CHF 15-minute 1,357 39.1% 0.86 −72.4% −78.9% −58.3% −33.6% −78.9% $6,239
Gold 5-minute 1,115 43.8% 1.00 +2.2% −42.9% −16.5% +22.5% −42.4% $3,174
Gold 15-minute 1,037 43.5% 0.98 −9.6% −39.9% −20.8% +14.1% −42.8% $2,615

Profit factor is the money won divided by the money lost. Above 1 means the test made money. Max drawdown is the biggest fall from the highest balance. 2020–2023 and 2024–2025 show the result in each period on its own. Monte Carlo drawdown: we shuffled the trades into a random order 1,000 times; in 95% of those runs, the worst drawdown was this number or less. Result is the change in the account, with the risk of each trade set to 1% of the account at that time.

The account balance

The best test and the middle test

Best test USD/JPY, 5-minute chart +43.0% from 2020 to 2025
Middle test (median): half of the 18 did better, half did worse GBP/JPY, 5-minute chart −14.7% from 2020 to 2025

What we found

What the 18 backtests show

  1. With a candle close as the breakout, 5 of the 18 tests made money from 2020 to 2025, after trading costs. Each test made 987 to 1,492 trades. Four of the five were on two pairs with the Japanese yen (JPY), on both charts. USD/JPY grew the account by 43.0% on the 5-minute chart and by 26.2% on the 15-minute chart. EUR/JPY grew it by 36.3% and 24.5%. All four made money in both 2020–2023 and 2024–2025. The fifth was gold on the 5-minute chart, at +2.2%. GBP/USD, a popular pair for the London breakout, lost 39.5% of the account on the 5-minute chart and 21.5% on the 15-minute chart. USD/CHF and EUR/GBP lost the most: between 47.7% and 78.4% of the account. Most of the USD/JPY and EUR/JPY profit came from buys, while the yen fell: when the yen falls, these pairs rise. Results in R count what one trade risked: 1R is 1% of the account at the time of the trade. On both charts together, the USD/JPY buys made +63.4R, and the sells +4.1R.

  2. One reason most pairs lost money: on EUR/USD, GBP/USD, EUR/GBP and USD/CHF, price broke both sides of the Asian range on about half of the days (48.7% to 55.7%). It went above the range high and below the range low, both between 07:00 and 16:00 London time. On these 4 pairs, the distance between the highest and the lowest price from 07:00 to 16:00 was typically 2.5 to 3 times the height of the Asian range. So price often reached the stop-loss at the other side of the range: 43% to 51% of the candle-close trades hit it. On USD/JPY and AUD/USD, the 07:00 to 16:00 distance was typically only 1.4 to 1.5 times the Asian range, and price broke both sides on only 1 day in 4. On these two pairs, 65% to 70% of the trades reached neither the stop-loss nor the take-profit, and closed at 16:00. A small Asian range also makes the trading costs a bigger part of each trade's risk. On EUR/GBP, the typical range was 11.8 pips (a pip is 0.0001 on most pairs, and 0.01 on the yen pairs). There, the 1.2-pip spread was about 9% of what a typical trade risked.

  3. Compared with stop orders, waiting for a candle to close outside the range avoided some losing trades, but it lost more on the other days than it saved. We matched the two entries day by day on the 15-minute charts of all 9 markets (see the table below). On 10,134 days, both entries traded in the same direction. On those days, the stop orders made +1,681.2R, and the candle-close trades lost 123.5R, because the stop orders entered sooner, at a better price. Waiting helped on two kinds of days. On 727 days, price first broke one side of the range, and then a candle closed beyond the other side. On those days, the stop orders lost 745.9R, and the candle-close trades lost 47.9R. On 1,410 days, price went past the range, but no candle closed outside it by 10:00. The stop orders lost 609.2R on those days, and the candle close took no trade.

  4. The stop orders' profit depends on the entry price our test gave them. Our test opened each stop-order trade exactly at the range high or low, and charged no spread on that entry. A candle-close entry pays half the spread, because it opens at the buy or the sell price, not at the middle price on the chart. With half the spread on each stop-order entry too, the stop orders' total on the 15-minute charts of all 9 markets falls from +326.1R to −6.1R, about break-even. The candle close lost 171.3R on the same charts. On the 5-minute charts, the stop orders made +326.0R, or lost 6.3R with half the spread on each entry, and the candle close lost 235.5R.

  5. Many traders expect a narrow Asian range (small price moves in the night) to lead to a big move in the London session. In our test, a narrow range did not reliably lead to more profitable breakout trades. We compared each day's Asian range with the average Asian range of the previous 20 trading days. With the candle close, in 2020–2023, the trades after a narrower-than-average range lost 0.031R per trade on average, and the trades after a wider range lost 0.003R. In 2024–2025, the result reversed: the trades after a narrow range lost 0.004R per trade, and the trades after a wide range lost 0.030R. So both kinds of day lost a little, and which kind lost more changed from one period to the next. Trading only after a narrow range made money in 4 of 18 tests from 2020 to 2025, compared with 5 when trading every day.

The markets

On EUR/USD, GBP/USD, EUR/GBP and USD/CHF, price broke both sides of the Asian range on about half of the days

Each row is one market, from 2020 to 2025. The typical Asian range is the median: on half of the days, the range from 00:00 to 07:00 London time was smaller. The next column compares the distance between the highest and the lowest price from 07:00 to 16:00 with the height of the Asian range, on a typical day (the median). 'Both sides broken' is the share of days when price went above the range high and below the range low, both between 07:00 and 16:00. The last three columns show the change in the account from 2020 to 2025, after trading costs, risking 1% of the account per trade.

Market Typical Asian range 07:00 to 16:00 distance, compared with the Asian range Both sides broken Candle close, 5-minute chart Candle close, 15-minute chart Stop orders, 5-minute chart
EUR/USD 22.5 pips 2.5 times 48.7% −29.4% −13.0% −12.1%
GBP/USD 29.1 pips 2.6 times 49.2% −39.5% −21.5% +56.3%
USD/JPY 45.2 pips 1.5 times 25.0% +43.0% +26.2% +137.9%
GBP/JPY 55.6 pips 1.9 times 33.6% −14.7% −8.9% +76.2%
EUR/JPY 45.8 pips 1.7 times 31.5% +36.3% +24.5% +113.8%
EUR/GBP 11.8 pips 3.0 times 55.7% −60.5% −47.7% +146.6%
AUD/USD 30.4 pips 1.4 times 25.5% −20.0% −22.0% −15.3%
USD/CHF 18.3 pips 2.6 times 53.2% −78.4% −72.4% −66.1%
Gold $10.04 1.9 times 36.2% +2.2% −9.6% +36.7%

The stop orders gave the same result on both charts, or within 0.3 percentage points, because a stop order opens at the range high or low whatever the chart. Our test opened each stop-order trade exactly at the range high or low, with no spread. With half the spread on each stop-order entry, the stop orders still made money in R on the same 6 markets: GBP/USD, USD/JPY, GBP/JPY, EUR/JPY, EUR/GBP and gold. But they made less. On the 5-minute charts, EUR/GBP made +19.2R instead of +103.8R, GBP/USD +22.4R instead of +55.7R, and GBP/JPY +28.2R instead of +64.4R. Here, 1R is 1% of the account at the time of the trade.

Candle close or stop orders?

Waiting for a candle close skipped some false breakouts, but on most days it entered later, at a worse price

A false breakout is a move past the range that turns back. We matched the trades of the two entries day by day, on the 15-minute charts of all 9 markets, from 2020 to 2025. Each row is one kind of day. Each cell adds up the results of the trades, after trading costs, in R: 1R is 1% of the account at the time of the trade. The last column charges every stop-order entry half the spread, the same cost that a candle-close entry pays.

Kind of day Days Candle close Stop orders Stop orders, with half the spread on each entry
Both entries traded in the same direction (both bought, or both sold) 10,134 −123.5R +1,681.2R +1,405.1R
Price first broke one side, then a candle closed beyond the other side 727 −47.9R −745.9R −774.4R
Price went past the range, but no candle closed outside it by 10:00 1,410 No trade −609.2R −636.8R
All days with a trade 12,271 −171.3R +326.1R −6.1R

A total in R adds up the trades, so it is not the same as the % change in the account. The two entries had different account balances, so 1R was a slightly different amount of money in each. The 5-minute charts gave a similar result. On the 10,899 days when both entries traded in the same direction, the stop orders made +1,254.4R, and the candle-close trades lost 160.7R. In total, the candle close lost 235.5R, and the stop orders made +326.0R, or lost 6.3R with half the spread on each entry.

The strategy

What the London breakout is

The London breakout is a day-trading strategy for forex (currency pairs) and gold. It uses two trading sessions. The Asian session is the night in London, when banks in Tokyo, Sydney and Singapore trade. Many pairs move less in those hours, so price often stays in a range. The London session starts in the morning, when banks in Europe start trading. The Asian range is the highest and the lowest price from 00:00 to 07:00 London time. A breakout is a move out of that range. Traders expect the first move out of the Asian range, after the London session opens, to keep going. A common way to trade it: buy when price breaks above the range, and sell short (sell first, to profit if price falls) when it breaks below. Traders enter in two ways, and both are common. Some wait for a candle to close outside the range, and enter at the next candle's open. Others use stop orders. A stop order opens a trade as soon as price reaches the order's price. At 07:00, when the Asian range is complete, they place a buy stop order at the range high and a sell stop order at the range low. Our standard rules use the candle close, as our New York open breakout and opening range breakout pages do, so the results compare. One of the versions we tested uses stop orders. The range is the same on the 5-minute and the 15-minute chart. The chart only decides which candle close counts as the breakout.

Asian range
The highest and the lowest price from 00:00 to 07:00 London time
Breakout
A candle closes above the range high (buy) or below the range low (sell), from 07:00 until 10:00 London time
Stop-loss
The other side of the range
Take-profit
2R: 2 times the distance from the breakout candle's close to the stop-loss. A trade still open at 16:00 London time closes then.
Trades per day
1 at most: the first breakout
Risk per trade
1% of the account, which started at $10,000. On gold, the trade size is rounded down to whole ounces. So about 1 gold trade in 5 risked less than 0.9% of the account, and a few as little as 0.5%. On 22 October 2025, gold's Asian range was $143, so even 1 ounce would have risked more than 1%, and the backtest skipped that day.
Fills
A fill is the price at which an order opens or closes a trade. The stop-loss fills at its price, or at a candle's open if price opens past it. The take-profit fills at its exact price. When price reaches both in the same candle, the backtest looks at the 1-minute candles inside it to see which came first. If both are in the same 1-minute candle, the backtest counts the stop-loss as hit first.
Trading costs
Each market's usual spread (the gap between the buy and the sell price): 0.8 pips on EUR/USD, 1.2 on GBP/USD, 0.9 on USD/JPY, 2.5 on GBP/JPY, 1.4 on EUR/JPY, 1.2 on EUR/GBP, 1.0 on AUD/USD, 1.5 on USD/CHF and $0.30 on gold. Our test treats chart prices as the middle between the buy and the sell price. So a trade pays half the spread when it opens at a candle's open, and half when it closes at the stop-loss or at 16:00. The take-profit is a limit order (an order that fills only at its price or better), so it pays no spread. On the 5-minute charts, 1,531 candle-close trades reached the take-profit. In 1,491 of them, price went at least half the spread past it, so a real limit order would have filled on those trades too. In the stop-order version, the entry is a stop order, which pays no spread in our test either. In live trading, a stop order opens at the buy or the sell price, not the middle price, so it pays half the spread like any other entry. It can also open further from its price when price moves fast. No commission.

The rules we tested

  1. All times are London time. In summer, London clocks move one hour forward, and these times move with them. Each trading day, mark the Asian range: the highest and the lowest price from 00:00 to 07:00. On the 5-minute chart, the range covers 84 candles. On the 15-minute chart, it covers 28 candles.
  2. From 07:00, buy when a candle closes above the range high. Sell (go short) when a candle closes below the range low. The trade opens at the next candle's open. A breakout counts on a candle that closes by 10:00. If no candle closes outside the range by then, there is no trade that day.
  3. Put the stop-loss at the other side of the range: at the range low for a buy, and at the range high for a sell.
  4. R is the risk of the trade: the distance from the breakout candle's close to the stop-loss. A loss of 1R costs 1% of the account (see the sizing rule below). Put the take-profit 2R from that close, in the direction of the trade.
  5. If the trade is still open at 16:00, close it then.
  6. Take only the first breakout of the day, win or lose. After that trade, wait for the next day.
  7. Size every trade so that a loss at the stop-loss costs 1% of the account balance at that time.
  8. Don't trade on 25 December and 1 January, when the forex market is almost closed.

The method

How we tested it

The test

Markets
EUR/USD, GBP/USD, USD/JPY, GBP/JPY, EUR/JPY, EUR/GBP, AUD/USD, USD/CHF and Gold
Charts
5-minute and 15-minute candles
Dates
January 2020 to December 2025
Account
$10,000, risking 1% of the account on each trade
Trading costs
Included. Every trade pays that market's normal trading cost: the spread, which is the gap between the buy price and the sell price.

How a test passes

We call a test passed only if it meets all four checks. A strategy can make money in one backtest and still fail one of these checks.

  • At least 100 trades. With fewer trades, a good result could be luck.
  • It made money from 2020 to 2023 and again from 2024 to 2025. This shows whether the strategy kept working in the newer years, not only in the older ones.
  • A profit factor (the money won divided by the money lost) of at least 1.2 from 2024 to 2025, after trading costs.
  • In 95% of 1,000 random shuffles of the trades, the account must not fall more than 30% from its highest point.

Improvements

Can the London breakout be improved?

Besides the standard rules, we tested four versions. Each one makes one change that London breakout traders often make. The table below explains each one. Each version ran on the same 9 markets and 2 charts: 18 tests. We picked the best version using 2020–2023 only. The best version is the one that made money in the most tests. In a tie, it is the one with the better middle result (the median of the 18 tests). Then we checked it on 2024–2025, the years we did not use to pick it. If you pick a version and judge it on the same years, it almost always looks better than it really is.

Version Made money 2020–2023years used to pick the best version Made money 2024–2025years not used to pick it Made money in both periods Passed all four checks
Candle close (standard rules) The rules under 'The rules we tested': a candle must close outside the Asian range, and the trade opens at the next candle's open. 5 of 18middle test −15.8% 8 of 18middle test −4.8% 4 0
Stop orders at the range high and low, filled at the exact priceBest on 2020–2023 A candle does not need to close outside the range. At 07:00 London time, when the Asian range is complete, place a buy stop order at the range high and a sell stop order at the range low. When one order opens a trade, cancel the other order. If neither order opens a trade by 10:00, cancel both. The stop-loss is at the other side of the range, so R (the distance from the entry to the stop-loss) is the height of the range. The take-profit is 2R from the entry. Our test filled each order exactly at its price, with no spread. 12 of 18middle test +7.8% 12 of 18middle test +19.0% 10 0
Stop-loss at the middle of the range Put the stop-loss halfway between the range high and the range low, instead of at the other side. The stop-loss is closer, so the 2R take-profit is closer too. 2 of 18middle test −38.5% 6 of 18middle test −18.1% 1 0
Only after a narrow Asian range Trade only when today's Asian range is smaller than the average Asian range of the previous 20 trading days. Many traders expect a small Asian range to lead to a big move in the London session. 5 of 18middle test −20.5% 10 of 18middle test +3.8% 4 0
London open at 08:00 The Asian range runs from 00:00 to 08:00 London time, and a breakout counts from 08:00 until 11:00. Trades still close at 16:00. Some traders count the London open from 08:00, when the London stock market opens, instead of 07:00. 8 of 18middle test −11.7% 2 of 18middle test −8.8% 2 0

Stop orders did best in both periods. But much of their lead over the candle close came from the exact entry price our test gave them. In 2020–2023, the years we used to pick the best version, stop orders made money in 12 of 18 tests, compared with 5 for the standard rules (a stop order gives the same trades on both charts, so that is 6 of the 9 markets). In 2024–2025, the years we kept for the check, they made money in 12 of 18 again, compared with 8. With stop orders, 10 tests made money in both periods: USD/JPY, EUR/JPY, GBP/JPY, EUR/GBP and gold, on both charts. With the standard rules, 4 tests did: USD/JPY and EUR/JPY, on both charts. With half the spread on each stop-order entry, the stop orders' trades added up to about break-even over all 9 markets (see 'What we found'). No test passed all four of our checks in any version. Each test that made money in both periods had a profit factor below 1.2 in 2024–2025, or a Monte Carlo drawdown over 30%, or both. The other three changes did not clearly help. A stop-loss at the middle of the range made money in 2 of 18 tests from 2020 to 2025, and 48% to 65% of its trades hit the stop-loss. Trading only after a narrow Asian range made money in 4 of 18 tests from 2020 to 2025, compared with 5 for the standard rules. It did better in 2024–2025 (10 of 18 tests made money, compared with 8). But, as with the standard rules, only USD/JPY and EUR/JPY, on both charts, made money in both periods. Starting at 08:00 made money in 8 of 18 tests in 2020–2023, but in only 2 of 18 in 2024–2025.

Questions

Questions traders ask

Does the London breakout strategy work?

Mostly no, in our backtest. A candle-close entry lost money in most tests, and stop orders came to about break-even in total once each entry paid half the spread. We tested 8 forex pairs and gold from 2020 to 2025, after trading costs, each on 5-minute and 15-minute charts, risking 1% of the account per trade. With a candle close outside the Asian range (the highest and the lowest price from 00:00 to 07:00 London time), 13 of 18 tests lost money. Only USD/JPY and EUR/JPY made money on both charts, in both 2020–2023 and 2024–2025. Across the 18 candle-close tests, the win rate (the share of trades that made money) was 38.1% to 49.3%. But only 13.1% of all the trades reached the 2R take-profit, and most winning trades were smaller wins that closed at 16:00. No test passed all four of our checks (see 'How a test passes').

What are the best pairs for the London breakout?

In our backtest, USD/JPY and EUR/JPY did best. With a candle-close entry, only these two pairs made money on both charts from 2020 to 2025. USD/JPY made +43.0% on the 5-minute chart and +26.2% on the 15-minute chart, and EUR/JPY made +36.3% and +24.5%. Most of that came from buys while the yen fell: when the yen falls, USD/JPY and EUR/JPY rise. With stop orders at the range high and low, GBP/JPY, EUR/GBP, GBP/USD and gold made money too. They still made money in R when each stop-order entry paid half the spread. EUR/USD, AUD/USD and USD/CHF lost money with both entries. One reason for the losses: on EUR/USD, GBP/USD, EUR/GBP and USD/CHF, price broke both sides of the Asian range on about half of the days. So 43% to 51% of their candle-close trades hit the stop-loss, compared with 25% to 33% on USD/JPY, EUR/JPY, GBP/JPY and AUD/USD. Fewer stop-losses were not enough on their own: AUD/USD and GBP/JPY still lost money with a candle close.

Should you use stop orders or wait for a candle close?

In our backtest, stop orders did better. But once both entries paid the same entry cost, neither made money over all 9 markets together. On the 15-minute charts, the candle-close trades lost 171.3R in total from 2020 to 2025, where 1R is 1% of the account at the time of the trade. The stop orders made +326.1R. The candle close skipped many false breakouts. On 1,410 days, price went past the range, but no candle closed outside it by 10:00. The stop orders lost 609.2R on those days. But on the 10,134 days when both entries traded in the same direction, the stop orders entered at a better price and made 1,804.7R more. Our test gave each stop order the exact range price, with no spread. With half the spread on each entry, the stop orders' total was −6.1R, about break-even.

What time should you trade the London breakout: 07:00 or 08:00?

Neither start time was clearly better in our backtest. Our standard rules mark the Asian range from 00:00 to 07:00 London time and take breakouts from 07:00 to 10:00. Some traders count the London open from 08:00, when the London stock market opens (usually 03:00 in New York). So we also tested a range from 00:00 to 08:00, with breakouts from 08:00 to 11:00. With 08:00, 6 of 18 tests made money from 2020 to 2025, compared with 5 with 07:00. In 2020–2023, it made money in 8 of 18 tests, compared with 5. But in 2024–2025, it made money in only 2 of 18, compared with 8. On EUR/USD's 5-minute chart, the 08:00 start made +18.4% from 2020 to 2025, compared with −29.4%, but all of that gain came in 2020–2023.

Keep exploring

Related strategies we tested

Sessions New York open breakout backtest on NQ, ES and gold futures Made money in 0 of 10 tests, 0 of them in both periods. Best: RTY (Russell 2000 futures), 15-minute, −6% Opening range breakout 15-minute opening range breakout backtest on NQ and ES futures Made money in 9 of 12 tests, 8 of them in both periods. Best: MNQ (Micro Nasdaq 100), 5-minute, +158% Opening range breakout 5-minute opening range breakout backtest on NQ and ES futures Made money in 5 of 8 tests, 2 of them in both periods. Best: MNQ (Micro Nasdaq 100), 5-minute, +31%
The strategy code we ran

This is the exact code from the BacktestingMax strategy engine. Paste it into the strategy editor in the app to run it on any market.

class LondonBreakout(Strategy):
    """The London breakout on forex and gold: the Asian range from 00:00 to 07:00 London
    time, and the first breakout of it in the first three hours of the London session.
    The Asian range is the highest and the lowest price of the candles that open from
    00:00 to 07:00 London time (British summer time included). On a 5-minute chart that is
    84 candles; on a 15-minute chart, 28.
    Standard (all switches off): from 07:00 London, the first candle that closes above the
    range high is a buy, and the first candle that closes below the range low is a sell
    (go short). The trade opens at the next candle's open. A breakout only counts on a
    candle that closes by 10:00 London. The stop-loss sits at the other side of the range:
    the range low for a buy, the range high for a sell. The take-profit sits 2 times the
    risk away (2R), the risk being the distance from the breakout candle's close to the
    stop-loss. A trade still open at 16:00 London closes then. One trade a day: the first
    breakout, win or lose. Size every trade so that the stop-loss costs 1% of the account.
    No trading on 25 December and 1 January.
    The changes, one at a time:
      stop_entry = 1   no candle close needed: at 07:00 place a buy stop order at the range
                       high and a sell stop order at the range low. The first one that
                       fills cancels the other; both are cancelled at 10:00. The stop-loss
                       is the other side of the range and the take-profit 2R from the
                       entry price.
      mid_stop   = 1   the stop-loss sits at the middle of the range instead of the other
                       side (the 2R take-profit comes closer too)
      narrow     = 1   only trade when today's Asian range is smaller than the average
                       Asian range of the previous 20 trading days
      open_hour  = 8   the London open is 08:00: the range runs from 00:00 to 08:00 and
                       breakouts count from 08:00 until 11:00
    """
    params = {"open_hour": Param(type=int, default=7, min=1, max=12),
              "exit_rr": Param(type=float, default=2.0, min=0.5, max=10.0),
              "stop_entry": Param(type=int, default=0, min=0, max=1),
              "mid_stop": Param(type=int, default=0, min=0, max=1),
              "narrow": Param(type=int, default=0, min=0, max=1)}
    lookback = 2
    window_minutes = 180  # breakouts count for 3 hours after the range ends
    exit_time = 960       # 16:00 London, in minutes after midnight
    average_days = 20     # the narrow-range filter compares with this many previous days
    closed_dates = ("12-25", "01-01")  # Christmas Day and New Year's Day: no trading
    def init(self, ctx):
        self.lon = ctx.clock("Europe/London")
        self.day = None
        self.high = None          # the Asian range high
        self.low = None           # the Asian range low
        self.has_start = False    # True once today's 00:00 candle has been seen
        self.counted = False      # True once today's range is finished and checked
        self.past_ranges = []     # the range heights of the previous trading days, newest last
        self.done = True          # True once today's trade is placed (or the day is skipped)
        self.orders = []          # today's resting stop orders (stop_entry = 1)
        self.trades_before = 0    # closed trades when those orders were placed
    def on_bar(self, ctx):
        start = self.lon.minute_of_day             # this candle's open, London time
        end = start + ctx.timeframe_minutes        # this candle's close
        open_min = ctx.params.open_hour * 60       # the range ends and the London open starts
        window_end = open_min + self.window_minutes
        if self.lon.date != self.day:              # a new day: forget yesterday's range
            self.day = self.lon.date
            self.high = self.low = None
            self.has_start = self.counted = False
            self.done = self.day[5:] in self.closed_dates
            self.orders = []
        # Stop orders: once one has filled, cancel the other. Cancel both at the window end.
        if self.orders:
            filled = ctx.position is not None or len(ctx.closed_trades) > self.trades_before
            if filled or end >= window_end:
                for order in self.orders:
                    ctx.cancel_order(order.order_id)
                self.orders = []
        if ctx.position is not None:
            if end >= self.exit_time or start < open_min:
                ctx.close_position()               # fills at the 16:00 candle's open
            return
        # Build the Asian range from the candles that open from 00:00 to 07:00 London.
        in_range = start < open_min
        if in_range:
            if start == 0:
                self.has_start = True
            self.high = ctx.high[0] if self.high is None else max(self.high, ctx.high[0])
            self.low = ctx.low[0] if self.low is None else min(self.low, ctx.low[0])
            if end < open_min:
                return                             # the range is not finished yet
        if not self.counted:                       # the range has just finished
            self.counted = True
            self.finish_range(ctx)
        if in_range or self.done or ctx.params.stop_entry == 1:
            return
        if end > window_end:                       # no breakout by 10:00: no trade today
            self.done = True
            return
        close = ctx.close[0]
        up = close > self.high
        down = close < self.low
        if not ctx.gate("range_break", up or down):
            return
        self.done = True                           # one trade a day: this breakout is it
        if ctx.params.mid_stop == 1:
            stop = (self.high + self.low) / 2
        else:
            stop = self.low if up else self.high
        risk = abs(close - stop)
        if risk <= 0:
            return
        size = ctx.size_by_risk_pct(0.01, stop=stop, entry=close)
        if not ctx.gate("size_fits_1pct_risk", size > 0):
            return
        rr = ctx.params.exit_rr
        if up:
            ctx.buy(size=size, sl=stop, tp=close + rr * risk, tag="london_long")
        else:
            ctx.sell(size=size, sl=stop, tp=close - rr * risk, tag="london_short")
    def finish_range(self, ctx):
        """Check today's range once it is complete; with stop_entry = 1, place the orders."""
        full = self.has_start and self.high is not None and self.high > self.low
        if not ctx.gate("full_asian_range", full and not self.done):
            self.done = True
            return
        height = self.high - self.low
        average = (sum(self.past_ranges) / len(self.past_ranges)
                   if len(self.past_ranges) >= self.average_days else None)
        self.past_ranges = (self.past_ranges + [height])[-self.average_days:]
        if ctx.params.narrow == 1 and not ctx.gate("narrower_than_average",
                                                   average is not None and height < average):
            self.done = True                       # a wide range (or not 20 days yet): no trade today
            return
        if ctx.params.stop_entry == 0:
            return
        self.done = True                           # the orders are today's one trade
        hi, lo = self.high, self.low
        mid = (hi + lo) / 2
        rr = ctx.params.exit_rr
        long_stop = mid if ctx.params.mid_stop == 1 else lo
        short_stop = mid if ctx.params.mid_stop == 1 else hi
        orders = []
        size = ctx.size_by_risk_pct(0.01, stop=long_stop, entry=hi)
        if ctx.gate("size_fits_1pct_risk", size > 0):
            orders.append(ctx.buy(size=size, stop=hi, sl=long_stop,
                                  tp=hi + rr * (hi - long_stop), tag="london_long"))
        size = ctx.size_by_risk_pct(0.01, stop=short_stop, entry=lo)
        if ctx.gate("size_fits_1pct_risk", size > 0):
            orders.append(ctx.sell(size=size, stop=lo, sl=short_stop,
                                   tp=lo - rr * (short_stop - lo), tag="london_short"))
        self.orders = [o for o in orders if o is not None]
        self.trades_before = len(ctx.closed_trades)

Your turn

Test the London breakout yourself

Change the settings, the market or the stop-loss and see the result in seconds. Ask the BacktestingMax AI: Backtest the London breakout on GBP/USD, 15-minute chart: Asian range 00:00 to 07:00 London time, buy stop at the range high and sell stop at the range low until 10:00, stop-loss at the other side of the range, 2R take-profit, close at 16:00.

Try it free in BacktestingMax

Free account. No credit card needed.

See every strategy we tested Browse strategies shared by traders

Backtest on historical data with trading costs, run by BacktestingMax. Past results do not guarantee future results, and nothing here is financial advice. Updated 26 October 2026.