Markets › Crypto · BTCUSDT, Binance (15-minute bars)

Intraday Trend Pullback Backtest: Bitcoin, 15-Minute Bars, 2017 to 2026

Buy the dip in an uptrend, sell the rally in a downtrend, flat by midnight: a mechanical version of one of the most recommended intraday Bitcoin strategies, on nine years of 1-minute data with costs and a control.

BTCUSDT (Binance) · 15-minute entries, 1-hour trend · Protocol v1.0 plus the 8 Oct 2026 rules

Buried · No proven edge

Nothing before costs. Costs did the rest.

BornFrozen 14 Oct 2026 (tp_btc_spec.md), before any average, signal or trade was computed
Died14 Oct 2026

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

Short answer: not in our test. A mechanical trend pullback on 15-minute Bitcoin bars (trend from the 1-hour averages, entry when price closes back above the 20-bar average, stop below the last five bars, 2R target, flat by midnight) made close to nothing before costs from 2017 to 2026 and lost in every full year after them. It did no better than the same trades placed on other days.How much costs took here, compared across all 54 of our tests →

00The verdict in three lines

  • “Trend pullback” has no single official rule, so we fixed one common version in advance: the trend from the 50- and 200-hour exponential averages, an entry on the 15-minute bar that closes back above its 20-bar average after a dip to it (below, in a downtrend), a stop beyond the last five bars, a target at twice the risk, and every position closed by midnight UTC. Long and short, and long only, after 0.05% of costs on every fill.
  • Close to zero before costs. Over 10,526 trades the long-and-short version made +0.001% a trade before costs and -0.099% after; long only +0.013% and -0.087%. Every full year lost money in both versions.
  • Both Buried. The pullback entries did no better than the same trades placed on other days (control percentiles 56.8 and 84.0); the only gate passed was the number of trades.

01What we tested

  • Trend (1-hour bars): up when the 50-hour exponential average is above the 200-hour one, down when below. A 15-minute bar uses the last 1-hour bar already closed, so no rule looks ahead.
  • Signal (15-minute bars): in an up trend, the previous bar closed at or below its 20-bar exponential average (the pullback) and this bar closes above it. In a down trend, the mirror image.
  • Entry at the next bar's open. Stop one cent beyond the lowest low (highest high for shorts) of the last five 15-minute bars. Target at twice the risk (2R). Stop and target are checked on 1-minute bars; when one minute touches both, the stop counts.
  • Flat by midnight: a position still open is closed at the 23:59 UTC minute. One position at a time.
  • Two variants: BTC-TP-LS (long and short) and BTC-TP-L (long only). With two variants of a strategy not tested before on the site, the development t-statistic bar is 2.0.

This is our version of a loosely defined idea, written down and dated before the data was run. Other versions could do differently; each would be a new test.

02Data and costs

BTCUSDT on Binance, the exchange's public 1-minute history from August 2017 to September 2026 (the file of our Turtle test on Bitcoin), grouped into 319,294 15-minute and 79,837 1-hour bars on the UTC clock. Signals from 15 September 2017, once the 200-hour average had settled. Costs: 0.05% of the price on every fill, about 0.1% a round trip, the taker fee on Binance perpetual futures, where short positions are possible; no slippage beyond gaps, which is optimistic. Results are the net return per trade in percent of the entry price; sums add those percentages (no compounding).

Periods by entry date: development 15 September 2017 to June 2021, validation July 2021 to December 2023, holdout January 2024 to September 2026. The holdout was already used once, by the Turtle test (daily bars), and is reported as such. Engine check: a self-test with hand-worked cases and an independent re-implementation that matched all 10,526 and 5,555 trades one by one (tp_selftest_result.txt). During that check, before any result, stop levels were set to round to the cent: without it, a stop such as 6,543.22 − 0.01 is stored as 6,543.2099… and a low of exactly 6,543.21 would not touch it (noted in the specification).

03Results

Net is the sum of the trades' net returns after costs. The 95% range is the Wilson interval for the win rate.

VariantDirectionTradesNet after costs (sum)Gross per tradeCost per tradeNet per tradeWinners (95% range)Profit factorNet per trade in RVerdict
BTC-TP-LSLong and short10,526-1044.3%+0.001%0.100%-0.099%36.1% (35% to 37%)0.79-0.21 RBuried
BTC-TP-LLong only5,555-483.5%+0.013%0.100%-0.087%37.1% (36% to 38%)0.81-0.21 RBuried
-1,000%-500%0%20182020202220242026validationholdout*BTC-TP-LSBTC-TP-L

Cumulative net percent by month. * Holdout used once before. Bitcoin over the same data: $4,261 to $83,624.

By period

VariantDevelopment Sep 2017 to Jun 2021 (trades)Validation Jul 2021 to Dec 2023 (trades)Holdout* Jan 2024 to Sep 2026 (trades)Development tValidation PF
BTC-TP-LS-367.2% (4,268)-333.4% (2,958)-343.8% (3,300)-3.660.74
BTC-TP-L-147.1% (2,323)-160.4% (1,448)-176.1% (1,784)-2.160.73

Both variants lost in every period, and the development t-statistics are negative.

04Where the result comes from

VariantLongs: trades / gross / netShorts: trades / gross / netStoppedTargetClosed at midnightAverage risk (stop distance)Average minutes held
BTC-TP-LS5,499 / +73.4% / -476.5%5,027 / -65.1% / -567.8%5,771 (55%)2,841 (27%)1,914 (18%)0.78%221
BTC-TP-L5,555 / +72.0% / -483.5%–3,010 (54%)1,445 (26%)1,100 (20%)0.75%234

Short trades lost even before costs; long trades made a little before costs and lost after them. With the stop about 0.78% from the entry, the 0.1% round trip is about an eighth of the risk on every trade.

By year (net, trades)

YearBTC-TP-LSBTC-TP-L
2017 (from 15 Sep)+7.8% (316)+24.7% (243)
2018-118.1% (1,132)-36.4% (434)
2019-86.8% (1,134)-53.3% (599)
2020-137.0% (1,128)-71.2% (733)
2021-130.2% (1,145)-60.4% (618)
2022-146.1% (1,178)-67.9% (463)
2023-90.0% (1,193)-42.9% (681)
2024-99.7% (1,195)-48.8% (715)
2025-139.0% (1,216)-68.3% (615)
2026 (to Sep)-105.0% (889)-59.0% (454)

By time of entry (net, trades)

Entry timeBTC-TP-LSBTC-TP-L
00:00 to 04:00 UTC-191.2% (2,629)-129.0% (1,388)
04:00 to 08:00 UTC-208.3% (1,668)-114.0% (924)
08:00 to 12:00 UTC-218.5% (1,620)-82.9% (865)
12:00 to 16:00 UTC-173.3% (1,840)-54.6% (953)
16:00 to 20:00 UTC-111.0% (1,411)-31.6% (748)
20:00 to 24:00 UTC-142.1% (1,358)-71.4% (677)

Only the three and a half months of 2017 ended positive. No four-hour block of the day did.

05Funding

Perpetual futures charge funding every eight hours. As a scenario, longs pay and shorts receive 0.01% of the price at each 08:00 and 16:00 UTC a position is held (Binance's default rate, not a historical series; positions are closed before midnight). It changes little: long and short -1047.5% instead of -1044.3%, long only -501.4% instead of -483.5%.

06Is it the signal or chance?

The moved-entry control: every real entry moved by one random offset of whole days, at least 5% of the series, to the same time of day on another day, same direction, the stop at the same distance in percent, the 2R target, the midnight exit and the costs; 500 runs with fixed seeds. The bar is the 95th percentile of the average net result per trade.

VariantTradesReal average per tradeControl trades (mean)Control medianControl 5th to 95thPercentile (95 needed)
BTC-TP-LS10,526-0.099%8,404-0.101%-0.117% to -0.084%56.8
BTC-TP-L5,555-0.087%4,532-0.098%-0.121% to -0.080%84.0

The real entries sit inside the range of the moved ones: the pullback signal did not pick better moments than chance.

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 (used once)
BTC-TP-LS10,526failpassfailfailfailfail
BTC-TP-L5,555failpassfailfailfailfail

08Verdict by variant

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

No proven edge: close to zero before costs, below zero after them in every period, and no better than the control. Not tested: other averages, pullback definitions, targets or filters; limit orders and maker fees; other coins.

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

What the results show

  • Before costs the rule earned almost nothing: +0.001% a trade long and short, +0.013% long only. The 0.1% round trip turned that into -0.099% and -0.087% a trade.
  • The pullback entries did no better than the same trades placed on other days: control percentiles 56.8 and 84.0, against 95 needed.
  • Every full year from 2018 to 2025 lost money in both variants, and so did 2026 to September; summed over the years, every four-hour block of the day lost too.
  • Short trades lost money even before costs; long trades made a little before costs and lost after them.

What remains unknown

  • Other versions of the idea: other averages, other pullback definitions, other targets, or a filter for volatility or volume. We tested one common version, fixed before the run.
  • Lower costs: with maker fees (limit orders) the cost per round trip falls, but fills are no longer certain, and the gross result here was close to zero to begin with.

Why it failed

A trend pullback is a bet that a dip inside a trend ends and the trend resumes. On Bitcoin's 15-minute bars, a close back above the 20-period average after a dip did not mark better moments than the same trades on other days: the average result before costs was close to zero. With a stop about 0.78% away, a 0.1% round trip costs about an eighth of the risk on every trade, so a rule with no gross edge loses steadily, which is what the equity curve shows.

What you can apply to your own tests

  • Look at the result before costs first. If it is near zero, no fee schedule will save the rule.
  • On short timeframes, compare the cost of a round trip with the distance to your stop: here the cost was about an eighth of the risk on every trade.
  • Write your version of a loosely defined idea down in advance, test it as written, and only then try a different version as a new test, with a higher bar.

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 a trend pullback strategy work on Bitcoin?

Not in our backtest. Over 10,526 trades the long-and-short version made +0.001% a trade before costs and -0.099% after a 0.1% round trip; long only +0.013% and -0.087%. Both lost in every period and did no better than a control that moves the same trades to other days.

Would lower fees save the pullback strategy?

Unlikely. The result before costs was close to zero, so even at a fraction of the fee the rule would at best break even, and limit orders that earn lower fees are not always filled.

How was the Bitcoin trend pullback tested?

On Binance BTCUSDT 1-minute data from 2017 to 2026, grouped into 15-minute and 1-hour bars on the UTC clock, with 0.05% of costs on every fill and 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 specificationRules, data, costs, periods, gates and control, dated before any average was computed.
tp_btc_spec.md
CodeThe engine (its readings of the rule at the top), the independent re-implementation, the self-test and the run (node tp_run.js). Rebuild the data with btc_build.js from the Binance files.
tp_lib.js · tp_ref.js · tp_selftest.js · tp_run.js · btc_build.js
Shared code it usesThe Bitcoin loader, statistics and control helpers.
control_audit_lib.js · em_lib.js · fb_clock.js · fx_data.js · gh_lib.js · gx_lib.js · hourly_lib.js · ma_lib.js · rb_lib.js · rsi2_protocol.js · tt_lib.js
ResultsSelf-test result, the console output of the run and all numbers as one file.
tp_selftest_result.txt · tp_results.txt · tp_summary.json
Trade logs (CSV)Every trade of both variants: signal, entry and exit time (UTC), stop, target, exit reason, gross and net percent, R and the funding scenario.
BTC-TP-LS · BTC-TP-L
Data recordThe gaps of 10 minutes or more in the Binance history. The data itself is free from data.binance.vision (spot, klines, BTCUSDT, 1m, monthly).
btc_gaps.json

Code provenance: our own code, written from the rule as fixed in the specification. No third-party source code is used or published.

10Data notes

Gaps. 0.18% of the minutes are missing, mostly Binance maintenance in 2018 to 2021. Removing the few trades open across a gap of 10 minutes or more changes nothing:

VariantTradesRemovedNet per tradeVerdict
BTC-TP-LS10,52610-0.099% → -0.099%Buried → Buried
BTC-TP-L5,5553-0.087% → -0.087%Buried → Buried

Prices and costs. The prices are Binance spot (USDT, treated as dollars); the cost is that of Binance perpetual futures, whose prices track spot closely but not exactly. Two short periods in December 2017 and February 2018 have minutes a few seconds off the whole minute in Binance's files; they were rounded to the nearest minute (see the Turtle test).

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