After Costsresearch log
Forex · Scalping & order books

Scalping EUR/USD live: fast fills, no edge

We ran four scalping strategies on two broker demo accounts and studied the order book. Orders filled in under 300 ms with no slippage. The strategies still lost, because a 0.7-pip round trip is bigger than almost anything they could predict.

30 September 2026 · 8 min read

Key findings

  • A EUR/USD round trip on a raw-spread CFD account costs about 0.7 pip: 0.1 pip of spread plus 0.6 pip of commission. In the London and New York session only 0.4% of 1-second moves, 31% of 1-minute moves and 52% of 5-minute moves are larger than that, before direction even matters.
  • In a tick backtest of 1,443 momentum and reversion configurations, none was profitable in both the training and the test period. The 15 best in training averaged +0.19 pip per trade in training and −1.45 pip in the test.
  • Live on two demo accounts (about 28 hours, 201 trades) all four strategies lost. Roughly 81% of the loss was commission. Market orders filled in 286 ms on average with no adverse slippage.
  • Limit orders on a CFD broker do not earn the spread. At the fill the mid price was already past our price, and two minutes later the average position was 0.22 pip under water.
  • Level-1 order-book imbalance predicts the next move very reliably (t = 16) and very weakly (0.01–0.04 pip). On the demo account we used, the broker’s depth-of-market stream showed a fixed ladder of sizes, so its size imbalance is always zero.

The cost of a round trip

Scalping lives or dies on the cost of a round trip. On the raw-pricing account we used, EUR/USD had a median spread of 0.1 pip in every hour except the daily rollover at 21:00 UTC, when it jumps to a median of 3.8 pips. Commission is 6 USD per lot per round trip, which is 0.6 pip. A typical market-order round trip during the day therefore costs about 0.7 pip.

We measured how often the price moves that far at all, using 8.7 million ticks from six months of a cTrader price feed.

How long until a EURUSD move pays for the trade?

Share of 1-second start points in the 07:00-16:00 UTC session whose absolute mid move over the horizon exceeds the ~0.7-pip round-trip cost.

larger than the cost (0.7 pip)larger than twice the cost (1.4 pips)half of all moves
Share of moves larger than the threshold
Direction is ignored. A move larger than the cost is necessary for a profitable trade, not sufficient. Source: 8.7 million EUR/USD ticks from a cTrader demo price feed, 31 Mar – 29 Sep 2026, 1-second mid grid, 07:00–16:00 UTC.
Show data · values in %
larger than the cost (0.7 pip)larger than twice the cost (1.4 pips)
1 s0.400.0000
2 s1.000.10
5 s3.300.40
10 s7.501.20
15 s11.302.20
30 s20.505.70
1 min31.1012.30
2 min41.4022
3 min46.6028.50
5 min51.8036.10
10 min57.3045.10
15 min59.8049.40

A strategy that holds for a few seconds can almost never cover its costs, however good its direction calls are. At one minute, two moves in three are still smaller than the cost. Only from about five minutes on is the typical move larger than the round trip, and at that horizon a scalping signal has to compete with ordinary market noise.

A tick backtest of 1,536 configurations

The simulator works on a 1-second bid/ask grid. A signal at the end of one second is filled in the next second at the ask (buy) or the bid (sell). If a take-profit and a stop are both reached within the same second, the stop counts. The 0.6-pip commission is charged, trades are only allowed while the spread is at most 0.3 pip, and only one position is open at a time.

The grid combined two ideas (trade with a burst, or against it), four lookbacks (5 to 60 seconds), four trigger sizes (1 to 5 pips), four maximum holds (1 to 15 minutes), four exit plans and three sessions: 1,536 configurations. The first two thirds of the six months were used for training (about 86 trading days), the last third for testing (about 43).

Tick backtest: the 15 best configurations in training all lose in the test period

Average net result per trade (after spread and 0.6-pip commission) for the 15 best of 1,443 momentum/reversion configurations, ranked on the training period.

training (first two thirds)test (last third)
Mean of these 15: +0.19 pip per trade in training, −1.45 pip in the test period. No configuration of the 1,443 was profitable in both periods. Some test samples are small (three configurations have only 8 test trades; the median is 37). Labels: type, lookback/trigger, maximum hold, take-profit/stop in pips, session (UTC hours). Source: tick backtest of 1,443 configurations with at least 50 training trades.
Show data · values in pips
training (first two thirds)test (last third)
Mom 5s/3p, hold 300s, TP5/SL3, 7-10h0.41-3.65
Rev 10s/5p, hold 900s, TP8/SL5, 12-16h0.38-0.65
Mom 10s/3p, hold 300s, no TP/SL, 7-10h0.37-1.97
Rev 10s/5p, hold 180s, TP8/SL5, 7-16h0.28-1.25
Mom 5s/3p, hold 900s, TP5/SL3, 7-10h0.26-3.75
Rev 10s/5p, hold 900s, TP8/SL5, 7-16h0.25-0.63
Rev 10s/5p, hold 180s, TP8/SL5, 12-16h0.24-1.17
Rev 10s/5p, hold 180s, no TP/SL, 12-16h0.17-0.70
Rev 10s/5p, hold 180s, no TP/SL, 7-16h0.17-0.84
Mom 5s/3p, hold 180s, TP5/SL3, 7-10h0.16-3.25
Rev 5s/5p, hold 180s, no TP/SL, 7-16h0.05-0.42
Rev 30s/5p, hold 300s, no TP/SL, 12-16h0.03-1.00
Rev 10s/5p, hold 300s, TP8/SL5, 7-16h0.01-0.94
Rev 10s/2p, hold 900s, no TP/SL, 12-16h0.0030-0.45
Rev 30s/5p, hold 300s, TP8/SL5, 12-16h-0.0010-1.02

Of the 1,443 configurations with at least 50 training trades, 14 were profitable in training, 72 in the test period and none in both. The average configuration lost 0.71 pip per trade in training and 0.72 in the test. The best training configurations did worse out of sample than the average one, which is what selection on noise looks like.

We also tried to rescue the live entry rules with better exits: 45 trailing-stop variants for each entry type, from tight to loose stops with different activation levels, at the 1.1-pip commission of the first demo account. None of the 90 was profitable in training or in the test. Exits cannot fix entries that have no edge.

Four strategies, live

We ran the bot anyway, on demo accounts only, to measure what a backtest cannot: latency, slippage, real commission and the behaviour of limit orders. It connected to the broker through the cTrader Open API and traded 1,000 units of EUR/USD per position.

Strategy Entry Exit (since day 1, 12:51 UTC)
Momentum burst The mid moves at least 2 pips within 10 s, 07:00–16:00 UTC. Market order in the direction of the move. Stop 5 pips. At +2 pips the stop moves to 3 pips behind the price and becomes a broker-side trailing stop.
Spike reversion The same trigger with at least 3 pips. Market order against the move. Same as momentum.
Session breakout The 30-minute range before the 07:00 and 13:30 UTC opens. In the first hour after the open, a break of the range by 0.5 pip. One trade per session. Stop at half the range (at least 4 pips), trailing stop at the same distance from +3 pips.
Market making Only in a quiet market (spread at most 0.2 pip, 60-second range at most 2 pips). Limit orders 0.6 pip below and above the mid, re-quoted every 20 s. Take-profit 1.5 pips, stop 3 pips.

Every position had a 4-hour safety limit and was closed before the rollover. Daily loss limit: 20 USD.

Live demo scalping: cumulative net P&L per strategy

Every strategy lost money on the demo accounts; market making lost the most because it traded by far the most.

Market making (180 trades)Momentum burst (15 trades)Spike reversion (4 trades)Session breakout (2 trades)break-even
Cumulative net P&L after commission
1,000-unit EUR/USD trades. The first phase was booked in EUR and is converted to USD at each trade's exit price. Exits moved to stop-loss and trailing-stop management at 12:51 UTC on 29 Sep. Market making was switched off from 20:15 UTC on 29 Sep to 10:25 UTC on 30 Sep. Snapshot 30 Sep 13:34 UTC. Source: the bot's own trade log on two broker demo accounts; closed trades only, net of commission.
Show data · values in USD
DateMarket making (180 trades)Momentum burst (15 trades)Spike reversion (4 trades)Session breakout (2 trades)
2026-09-29T09:430.00000.00000.00000.0000
2026-09-29T09:46-0.07–––
2026-09-29T09:48-0.29–––
2026-09-29T09:51-0.45–––
2026-09-29T09:53-0.46–––
2026-09-29T09:54-0.88–––
2026-09-29T09:57-1.03–––
2026-09-29T09:59-1.34–––
2026-09-29T10:02-1.67–––
2026-09-29T10:10-1.85–––
2026-09-29T10:13-1.87–––
2026-09-29T10:15-1.84–––
2026-09-29T10:17-2.17–––
2026-09-29T10:19-2.19–––
2026-09-29T10:22-2.41–––
2026-09-29T10:24-2.38–––
2026-09-29T10:26-2.35–––
2026-09-29T10:29-2.51–––
2026-09-29T10:32-2.60–––
2026-09-29T10:34-2.85–––
2026-09-29T10:40-2.91–––
2026-09-29T10:42-3.03–––
2026-09-29T10:48-3.10–––
2026-09-29T10:51-3.40–––
2026-09-29T10:54-3.41–––
2026-09-29T10:56-3.59–––
2026-09-29T10:58-3.78–––
2026-09-29T11:01-3.80–––
2026-09-29T11:03-4.09–––
2026-09-29T11:05-4.21–––
2026-09-29T11:08-4.41–––
2026-09-29T11:10-4.52–––
2026-09-29T11:13-4.74–––
2026-09-29T11:15-4.80–––
2026-09-29T11:17-4.97–––
2026-09-29T11:20-5.21–––
2026-09-29T11:22-5.32–––
2026-09-29T11:25-5.28–––
2026-09-29T11:27-5.52–––
2026-09-29T11:32-5.65–––
2026-09-29T11:34-5.61–––
2026-09-29T11:36-5.78–––
2026-09-29T11:37-5.75–––
2026-09-29T11:40-5.86–––
2026-09-29T11:41-5.83–––
2026-09-29T11:44-5.88–––
2026-09-29T11:47-6.11–––
2026-09-29T11:49-6.08–––
2026-09-29T11:50-6.52–––
2026-09-29T11:55-6.70–––
2026-09-29T11:58-6.64–––
2026-09-29T12:01-6.79–––
2026-09-29T12:03-7.03–––
2026-09-29T12:05-7.27–––
2026-09-29T12:08-7.43–––
2026-09-29T12:09-7.40–––
2026-09-29T12:11-7.36–––
2026-09-29T12:13-7.63–––
2026-09-29T12:15-7.79–––
2026-09-29T12:16-7.75–––
2026-09-29T12:18-7.85–––
2026-09-29T12:21-8.16–––
2026-09-29T12:23-8.17–––
2026-09-29T12:25-8.13–––
2026-09-29T12:28-8.35–––
2026-09-29T12:30-8.51–––
2026-09-29T12:32-8.55–––
2026-09-29T12:35-8.96–––
2026-09-29T12:37-9.13–––
2026-09-29T12:38-9.26–––
2026-09-29T12:42-9.55–––
2026-09-29T12:46-9.46–––
2026-09-29T12:48-9.45–––
2026-09-29T12:59-9.81–––
2026-09-29T13:06-9.72–––
2026-09-29T13:18-10.08–––
2026-09-29T13:33-10.44–––
2026-09-29T13:41-10.33–––
2026-09-29T13:47-10.23–––
2026-09-29T13:50-10.12–––
2026-09-29T13:58-10.52–––
2026-09-29T14:00-10.90–––
2026-09-29T14:04-11.28––-0.11
2026-09-29T14:09-11.19–––
2026-09-29T14:17-11.55–––
2026-09-29T14:21-11.44–––
2026-09-29T14:27-11.34–––
2026-09-29T14:37-11.25–––
2026-09-29T14:43-11.16–––
2026-09-29T14:46-11.06–––
2026-09-29T15:03-11.42–––
2026-09-29T15:12-11.78–––
2026-09-29T15:23-11.69–––
2026-09-29T15:24-12.05–––
2026-09-29T15:25-11.96–––
2026-09-29T15:28-11.86-1.20––
2026-09-29T15:33-12.22–––
2026-09-29T15:40-12.13–––
2026-09-29T15:47-12.50–––
2026-09-29T15:56-12.41–––
2026-09-29T16:00-12.32–––
2026-09-29T16:12-12.68–––
2026-09-29T16:20-13.04–––
2026-09-29T16:26-13.40–––
2026-09-29T16:33-13.77–––
2026-09-29T16:40-13.68–––
2026-09-29T16:45-14.05–––
2026-09-29T16:49-13.95–––
2026-09-29T16:56-13.86–––
2026-09-29T16:57-13.75–––
2026-09-29T17:01-13.66–––
2026-09-29T17:02-13.56–––
2026-09-29T17:04-13.92–––
2026-09-29T17:09-13.82–––
2026-09-29T17:21-13.71–––
2026-09-29T17:45-14.07–––
2026-09-29T17:48-13.98–––
2026-09-29T18:00-13.81–––
2026-09-29T18:03-13.71–––
2026-09-29T18:05-14.07–––
2026-09-29T18:09-13.98–––
2026-09-29T18:13-14.34–––
2026-09-29T18:16-14.71–––
2026-09-29T18:23-14.62–––
2026-09-29T18:28-14.52–––
2026-09-29T18:30-14.43–––
2026-09-29T18:36-14.32–––
2026-09-29T18:38-14.69–––
2026-09-29T18:43-14.60–––
2026-09-29T18:52-14.51–––
2026-09-29T19:03-14.42–––
2026-09-29T19:15-14.78–––
2026-09-29T19:25-15.14–––
2026-09-29T19:44-15.50–––
2026-09-29T19:45-15.41–––
2026-09-29T19:54-15.30–––
2026-09-29T19:56-15.20–––
2026-09-29T19:59-15.10–––
2026-09-29T20:05-15.01–––
2026-09-30T10:35-15.37–––
2026-09-30T10:44-15.28–––
2026-09-30T10:50-15.17–––
2026-09-30T10:53-15.06–––
2026-09-30T10:59-14.97–––
2026-09-30T11:02-14.88–––
2026-09-30T11:17-15.24–––
2026-09-30T11:18-15.13–––
2026-09-30T11:23-15.04–––
2026-09-30T11:34-14.95–––
2026-09-30T11:46-14.85–––
2026-09-30T11:47-14.75–––
2026-09-30T11:54-15.11–––
2026-09-30T11:58-15.47–––
2026-09-30T12:04-15.83–––
2026-09-30T12:09-15.73–––
2026-09-30T12:15-15.64–––
2026-09-30T12:18-16–––
2026-09-30T12:21-15.90–––
2026-09-30T12:22-15.75–––
2026-09-30T12:24-15.66–––
2026-09-30T12:26-16.02-1.64––
2026-09-30T12:30-15.55-1.53-0.38–
2026-09-30T12:38-15.91–––
2026-09-30T12:40-15.82–––
2026-09-30T12:44-15.73–––
2026-09-30T12:46-15.64–-0.46–
2026-09-30T12:50-16–––
2026-09-30T12:52-15.84–––
2026-09-30T12:54-15.75–––
2026-09-30T12:58-16.12–––
2026-09-30T13:00-16.03-1.81––
2026-09-30T13:04-16.44–––
2026-09-30T13:07-16.32–––
2026-09-30T13:08-16.21–––
2026-09-30T13:11-16.11–––
2026-09-30T13:12-16.01–––
2026-09-30T13:15-16.39–––
2026-09-30T13:16-16.30–––
2026-09-30T13:17-16.21-2.06––
2026-09-30T13:21-16.12–––
2026-09-30T13:26-16.51–––
2026-09-30T13:27-16.51-2.06-0.46-0.60
2026-09-29T09:47–-0.03––
2026-09-29T09:56–-0.44––
2026-09-29T11:52–-0.73––
2026-09-29T14:02–-1.29––
2026-09-29T15:48–-1.38––
2026-09-30T09:25–-1.06––
2026-09-30T12:33–-2.09-0.30–
2026-09-30T12:43–-1.82––
2026-09-30T12:47–-1.64––
2026-09-30T13:06–-1.98––
2026-09-29T14:03––0.18–
2026-09-30T07:27–––-0.60
Strategy Trades Net win rate Average net result Net P&L Of which commission
Market making 180 46.7% −0.92 pip −16.51 USD −14.49 USD
Momentum burst 15 33.3% −1.37 pip −2.06 USD −1.06 USD
Spike reversion 4 50.0% −1.15 pip −0.46 USD −0.24 USD
Session breakout 2 0% −3.00 pip −0.60 USD −0.12 USD
All 201 45.3% −0.98 pip −19.62 USD −15.91 USD

The first 72 trades ran on a demo account with a higher commission (about 1.1 pip per round trip); the rest ran on the raw-pricing account at 0.6 pip. Amounts are in US-dollar equivalent. Outside market making the samples are far too small to judge the strategies. They are included for completeness.

Execution was not the problem. Over 21 market orders the time from sending the order to receiving the fill was 286 ms on average (median 276 ms, range 224–397 ms), and it was the same from a home PC and from a cloud container. Average slippage was −0.06 pip, slightly in our favour: 43% of fills had no slippage, 43% were better than the signal price and 14% were worse.

Why “market making” fails on a CFD broker

The market-making strategy had a take-profit of 1.5 pips and a stop of 3 pips. After commission a take-profit earned 1.04 pip on average and a stop lost 3.66 pips, so the strategy needed 3.66 / (1.04 + 3.66) ≈ 78% take-profit hits to break even. On the raw-pricing account it got 63%.

The reason is visible in the markouts, the move of the mid price after each fill:

Market making: where the mid price goes after a limit fill

Mean mid-price move in the direction of the filled position; the move needed just to pay the commission is far above anything observed.

29 Sep, 68 fills30 Sep, 42 fillsround-trip commission
Mean mid-price move in favour of the filled position (pips)
At the moment of the fill the mid was already about 0.03 pip beyond the fill price, so no spread was captured. The 29 Sep run did not compute 60 s. The standard error of the 30 Sep 120-second mean is about 0.48 pip, so neither day is distinguishable from zero. Both are far below the commission. Source: the bot's market-making fills on a broker demo account, broker price history.
Show data · values in pips
Seconds after the fill29 Sep, 68 fills30 Sep, 42 fills
00.00000.0000
1-0.020.04
5-0.07-0.09
30-0.14-0.02
120-0.220.24
60–0.14

On an exchange a resting limit order sits in a queue and can earn the spread. On a CFD broker a limit order behaves like a triggered order: it fills once the broker’s quote reaches it. At that moment the mid had already moved about 0.03 pip past our price, so no spread was captured. On the first day the price then kept moving against the position (−0.14 pip after 30 seconds, −0.22 pip after 2 minutes). On the second day it drifted slightly our way, but with 42 fills that is indistinguishable from zero. On both days the markout was far below the 0.6 pip that each round trip costs in commission.

Order-book imbalance: real, and tiny

Academic work on limit order books (for example Cont, Kukanov and Stoikov, 2014, and Gould and Bonart, 2016) shows that the balance between bid and ask sizes at the best price predicts the next price move. We tested it on EUR/USD with Dukascopy tick data, which includes best bid and ask sizes: 44 sampled working days between March and September 2026, 07:00–19:00 UTC, split into 22 training and 22 test days, with bucket thresholds taken from the training period only.

Order-book imbalance predicts the next move, but only by hundredths of a pip

Mean EURUSD mid-price change 60 s ahead by level-1 volume-imbalance bucket, compared with the round-trip cost of trading on it.

training, 30 Mar – 28 Juntest, 29 Jun – 28 Sep
Mean EUR/USD mid-price change 60 s later (pips)
Deciles 5 and 6 merge because many seconds have an imbalance of exactly zero. A taker round trip costs about 0.88 pip (0.28 average spread plus 0.6 commission), roughly twenty times the largest bar. Source: Dukascopy EUR/USD ticks with best bid and ask sizes, 44 sampled working days, 07:00–19:00 UTC.
Show data · values in pips
Level-1 imbalance (bid size − ask size) / (bid size + ask size), deciles of the training periodtraining, 30 Mar – 28 Juntest, 29 Jun – 28 Sep
D1: I < -0.5-0.10-0.03
D2: -0.5 to -0.33-0.03-0.02
D3: -0.33 to -0.2-0.03-0.01
D4: -0.2 to 0-0.00770.0057
D5-7: 0 to 0.20.00480.0031
D8: 0.2 to 0.330.010.01
D9: 0.33 to 0.50.020.03
D10: I >= 0.50.040.02

The predictor is real. In the test period the relationship had a Newey–West t-statistic of 16.2 one second ahead and 4.4 sixty seconds ahead. It is also tiny: the difference between the top and bottom decile was 0.014 pip at one second and 0.042 pip at sixty seconds.

What the broker’s depth feed actually shows

We then recorded the depth-of-market stream from the broker’s demo server around the clock. Over 53,686 recorded book states the best level showed 1,000 units on both sides in 99.75% of cases, and the total displayed size was 396,000 units on each side in 99.93% of cases. Each side is one of a few fixed ladders of sizes (such as 1k, 15k, 30k, 50k, 100k and 200k). Size imbalance is therefore zero by construction, and the only thing that changes is how far apart the price levels are.

Whether that spacing predicts anything is the last open question for this strategy. We wrote the test down before looking at any results. It measures the predictive strength of the spacing skew, a taker version and a market-making filter. The decision rule was fixed in advance: the signal counts only if it is tradeable after costs, meaning a taker strategy with a positive average after costs, or a favourable market-making third with a two-minute markout above the 0.6-pip commission. A significant t-statistic alone does not count. The test runs automatically once 24 hours of non-rollover recording are available. The first scheduled run is on 3 October 2026, and its result will be added here.

Caveats