The setup: one strategy, three data modes

To make the comparison concrete, we ran the same momentum strategy against BTCUSD data for a single day using three different data modes available in HFTS:

The strategy logic did not change between runs. Only the data source changed. The results are dramatically different.

The punchline upfront: OHLC says +1.70%. Last trades say -1.69%. Full quotes say -2.13%. The strategy does not have an edge — the OHLC result is an artifact of the data format, not a real signal.

Step 1: OHLC 1-minute bars — the optimistic baseline

OHLC bars are the default format for most backtesting frameworks. Each bar gives you four prices — open, high, low, close — and a volume figure. They are compact, widely available, and easy to work with. They are also a significant simplification of what actually happened during that minute.

When your strategy fires on an OHLC bar, the simulator fills your order at the bar's close price. It doesn't know whether the high came before the low, whether there was a spike and recovery, or what the bid/ask spread looked like. It assumes you could transact at that close price — which in a fast market is rarely true.

BTCUSD OHLC 1-minute backtest chart, April 7 2026 — 7 trades, P&L +1.70%
BTCUSD, Apr 7 2026 — OHLC 1-minute mode. Seven trades placed, P&L +1.70%, win rate 66.67%.
OHLC backtest report: Profit Factor 37.88, Sharpe 0.58
Performance report for the OHLC run. Profit Factor 37.88, Sharpe 0.58, max drawdown 0.05%.

The numbers look impressive. Profit Factor of 37.88, win rate above 66%, drawdown under 0.1%. But look more carefully: only 7 orders were placed across an entire trading day. The strategy fired rarely because the OHLC signal aggregates many market movements into a single bar-close decision.

Seven fills is not a result — it is a hypothesis. A Profit Factor of 37 on 7 trades has essentially no statistical meaning. You would need hundreds of trades to begin estimating whether an edge exists. Here, the strategy happened to catch a few of the day's larger directional moves on a single day, and the fill model assumed each one executed cleanly at the bar close.

Rule of thumb: a Profit Factor above 3 on fewer than 30 trades is almost always noise. At 7 trades it tells you nothing reliable about whether the strategy works.

Step 2: last-trade ticks — the same strategy sees more reality

Last-trade data gives you every individual execution that printed on the exchange: timestamp, price, and size. For BTCUSD on an active day, that is around 16,000 events — more than 11 times the resolution of 1-minute OHLC.

With this data, your strategy now reacts to individual trades rather than minute-close prices. The signal logic is unchanged. What changes is when the signal fires and what price the simulator uses for fills.

BTCUSD last-trade ticks backtest chart — 20 orders, P&L -1.69%
Same strategy, same day — now on last-trade ticks. 20 orders placed, P&L -1.69%, win rate 14.29%.
Last-trade ticks backtest report: Profit Factor 0.19, Sharpe -4.51
Performance report for the last-trade run. Profit Factor 0.19, Sharpe -4.51, total fees $127.39.

The strategy went from +1.70% to -1.69%. Profit Factor collapsed from 37.88 to 0.19. The strategy is now clearly losing.

Several things changed simultaneously when we switched from OHLC to trade ticks:

Metric OHLC 1m Last Trades
P&L+1.70%-1.69%
Orders placed720
Win rate66.67%14.29%
Profit Factor37.880.19
Total fees$30.02$127.39
Ticks processed1,44016,649

The shift from OHLC to last-trade data did not reveal a bad strategy — it revealed the true strategy. The OHLC version was a fiction built from aggregated data and optimistic fill assumptions.

Step 3: full quotes with latency — the most honest picture

Full quote data gives you every change to the best bid or best ask: new prices, cancellations, size updates. This is the raw feed that a live trading system actually sees. For the same BTCUSD day, that's 62,452 events — four times more than last-trade data, and 43 times more than OHLC.

In addition to higher data resolution, HFTS injects simulated round-trip latency. When your strategy reacts to a quote update and sends an order, the order arrives at the book some time later — after the market may have moved. This is how a real execution environment behaves.

BTCUSD full quotes backtest chart — 58 orders, P&L -2.13%
Same strategy on full bid/ask quotes with latency injection. 58 orders, P&L -2.13%, win rate 43.75%.
Full quotes backtest report: Profit Factor 0.52, Sharpe -4.38, 62452 ticks
Performance report for the quotes run. Profit Factor 0.52, Sharpe -4.38. 62,452 ticks processed in 1.331s.

P&L settled at -2.13%, Profit Factor 0.52, Sharpe -4.38. The strategy is still losing — but a few things are worth noting about the quotes result compared to the last-trade result:

Post-only orders and missed fills

There is one more layer of realism that quote-level backtesting exposes: not every order can be placed. Many exchanges and strategies use post-only limit orders — orders that are rejected if they would immediately match against the book (i.e. cross the spread). This is common when a strategy wants to earn the maker rebate and avoid taker fees, but it means that in fast-moving markets a significant fraction of intended orders simply do not go through.

On OHLC data this problem is invisible — the simulator always assumes your order filled. On trade data it is partially visible through missed signals. On full quote data with latency, it becomes concrete: by the time your order arrives, the best bid or ask may have moved past your limit price. A post-only order in that situation is either cancelled by the exchange or sits unmatched while the market moves away.

In practice: a strategy that fires 58 signals at the quote level may only successfully place 30–40 of them as post-only orders, and fill an even smaller fraction. The backtest numbers above assume all orders were placed — a real post-only strategy would show fewer fills, lower fee drag, but also a different PnL curve that depends heavily on which signals were actually routable at the moment of arrival.

This is why OHLC and even last-trade backtests tend to overestimate fill rates. They have no concept of market conditions at the moment of order placement. Quote-level simulation with latency is the first layer where post-only rejection and partial fills become visible — and where the gap between "signal fired" and "order filled" starts to match live trading reality.

A strategy that survives a quotes + latency backtest with positive P&L has cleared a much higher bar than one that only looks good on OHLC bars. If it passes here, you have a genuine candidate for live testing. If it fails here but passed on OHLC, you have saved yourself from a losing live trade.

The full comparison

Metric OHLC 1m Last Trades Full Quotes
P&L+1.70%-1.69%-2.13%
Orders placed72058
Win rate66.67%14.29%43.75%
Profit Factor37.880.190.52
Max drawdown0.05%2.04%1.80%
Total fees$30.02$127.39$247.54
Ticks processed1,44016,64962,452
Sharpe ratio0.58-4.51-4.38

What to take away from this

The lesson here is not that this particular strategy is bad. The lesson is that OHLC backtesting inflates results by design. It collapses time, hides the bid/ask spread, smooths away intra-bar volatility, and assumes fills at synthetic prices. For lower-frequency strategies these simplifications are tolerable. For anything reacting at tick speed, they produce results that cannot survive contact with a live market.

A few practical rules this experiment supports:

The same strategy, run on three data types, is three different experiments. The first is easy and flattering. The third is honest. HFTS exists to make the third experiment fast and accessible — before you commit real capital to a strategy that only worked on bars.