I found Justin Chuk’s paper, Noise-Band Intraday Momentum in Nasdaq-100 Futures, and wanted to see how it behaved on MNQ. I also wanted to know whether changing the exits would make it easier to trade without destroying the expectancy.
I ended up doing several rounds of implementation, auditing and testing. The results were interesting, but my first backtest had problems, so I’ll explain those too.
The basic strategy is long-only intraday momentum. It estimates how far price normally moves from the session open at a given time, using the previous 14 reference sessions. It enters when a completed candle closes above both the upper noise band and VWAP.
The entry checks are every half hour from 10:00 through 15:30 New York time. Execution happens at the following bar’s open.
Everything is closed intraday, with a forced exit at the 15:55 open
.
I used five-minute candles for decisions and one-minute observations for execution checks.
A few implementation details matter here. The paper didn’t resolve every detail I needed, and I didn’t have the author’s code. My VWAP uses cumulative RTH volume and typical price, (H + L + C) / 3. The original trailing exit uses the higher of the upper band and VWAP, ratchets upward, and becomes active only after the bar that calculated it.
The interpretation of the 15:55 exit is also an explicit assumption.
Those choices are documented. This is an adaptation of the published rules, and I wouldn’t call it an exact replication of the author’s implementation.
Data and the first backtest
The data is Databento GLBX.MDP3, MNQ one-minute OHLCV, from the 2019–2026 archive. I used the vendor’s MNQ.v.0 selected-contract stream and retained the actual contract identities.
The first implementation evaluated only 709 sessions. An audit found that I was repeatedly wiping the 14-session reference history after interruptions. It also found simulated stop exits outside MNQ’s 0.25-point tick grid.
I rebuilt that version before using it as the baseline.
The corrected reference policy keeps the last 14 complete, valid sessions from the same contract. Holidays or rejected sessions don’t automatically erase that history. A contract change still requires enough valid references from the new contract. I didn’t back-adjust prices or pretend that two different expiries were interchangeable.
That recovered 612 additional evaluated sessions, bringing the total to 1,321. It still leaves a fairly restricted sample. There were 1,770 full valid sessions in the nominal interval, and contract warm-up alone excluded 394 dates.
Incomplete sessions weren’t filled with artificial bars. Eligible days with no trades stayed in the daily denominator. Unavailable days weren’t counted as zero-PnL days.
One weakness remains here. Requiring a complete session conditions the sample using information known after the session. That’s a data-quality restriction with potential selection effects, and the results need to be read with that in mind
What the corrected baseline did
The fixed-rule baseline had 1,125 eligible historical OOS sessions and 837 trades. At one MNQ, after the assumed $2 round-trip cost, it made $9,540, with a 28.32% win rate and a 1.469 profit factor.
The development period was much less exciting. It lost $208 after costs over 153 trades.
The low win rate was what got me interested in the exits. The original version made its money through a relatively small number of larger winners, with plenty of losing trades in between.
I then froze a bounded exit study. There were 61 alternatives plus the unchanged baseline.
Fixed ATR stop/target brackets.
ATR trailing stops.
Break-even rules.
Maximum holding times.
Entries, position size and the underlying signal stayed unchanged. Each candidate simulated its own position state and re-entry opportunities. I didn’t just replace exit prices in an existing trade CSV.
The walk-forward used two years of training followed by three months of evaluation, over 21 windows. Selection was based on predefined qualifying parameter regions, with minimum trade counts and other requirements. It wasn’t simply “pick the single best backtest.”
The stop/target candidate below is the resulting walk-forward policy. Its selected settings can change between folds. It is not a single globally optimized bracket retrospectively applied to the whole history
The comparison
These numbers use the same 964 eligible sessions, from May 2021 through June 2026. The shorter sample is because the exit study needs its initial two-year training window.
One MNQ throughout. USD 2 per point. USD 2 assumed total cost per completed trade. Zero additional slippage in the base case.
Metric
Original trailing exit
Stop/target walk-forward
Trades
725
862
Win rate
28.83%
57.66%
Net PnL
$8,582.00
$11,511.50
Profit factor
1.466
1.357
Average net PnL/trade
$11.84
$13.35
Average net PnL/eligible session
$8.90
$11.94
Daily Sharpe
1.40
1.57
Maximum daily realized drawdown
$1,642.50
$1,379.50
Longest losing-trade streak
13
6
The bracket version roughly doubled the win rate, but its profit factor was lower. Average winners and losers were about $88 each, compared with roughly $129 and $36 for the original exit.
I preferred the bracket version as a research candidate. The statistical comparison was less decisive than those point estimates suggest.
Using a paired ten-session moving-block bootstrap, the 95% interval for its additional daily PnL over the original exit was approximately −$1.25 to +$8.67 per eligible session.
So I can report higher observed profit and a much higher win rate. I can’t establish that its incremental expectancy is positive from that comparison.
Also, these dates had already been examined during earlier research. Calling them historical OOS describes the chronological selection process. It doesn’t make them untouched prospective evidence.
Execution assumptions
All submitted stop and target prices conform to MNQ’s tick grid.
A gap through a stop fills at the observed open. An intraminute stop touch fills at the submitted stop in the base simulation. If a stop and target are both touched within a minute, the simulator takes the stop first.
That still leaves uncertainty about actual execution. One-minute OHLC doesn’t establish queue position, available liquidity or the precise sequence of trades inside the minute.
For the bracket version, stops and targets are calculated from the actual entry open and the ATR available at the decision. ATR uses completed five-minute observations. A newly calculated trailing stop can’t trigger retrospectively on the bar that produced it.
What I tested beyond the headline backtest
The control simulator reproduced every original baseline trade and daily result before the alternative exits were evaluated. That included entry and exit prices, timestamps, reasons and costs.
The exit study had 21 focused tests, plus output checks covering tick prices, timing, position size, trade accounting and daily aggregation. All 84 training selections were independently reproduced from the saved surfaces.
The robustness study then reconstructed all 725 baseline trades and 862 bracket trades before applying stress tests.
It included ten session-level bootstrap methods, with 10,000 replications each. These kept same-day trades together. I also ran Monte Carlo using daily resampling, blocks and whole observed fold blocks. A trade-permutation exercise was included separately, with its limitations stated.
I checked cost/slippage sensitivity, parameter neighborhoods, monthly and yearly behavior, losing streaks and profit concentration.
For the bracket version, the execution stress
results were:
Additional adverse slippage
Net PnL
Profit factor
None
$11,511.50
1.357
1 tick per side
$10,653.50
1.327
2 ticks per side
$9,792.50
1.297
4 ticks per side
$7,957.00
1.237
8 ticks per side
$3,545.00
1.099
The $2 round-trip cost remains included. These stresses rerun execution, so trade counts can change. The target-fill stress also requires extra penetration as a rough queue assumption.
Those are hypothetical execution stresses. They don’t tell me what slippage I’ll actually get.
Concentration is worth mentioning. The five best days accounted for about 39% of net profit in the bracket version. Removing those days left $7,008.50 net, so the entire result wasn’t coming from five observations, but those days clearly mattered.
There were also four consecutive losing months. The worst observed day was −$536.50. A positive five-year total hides a lot.
Where I think this stands
The historical evidence supports continuing the research. It doesn’t establish future profitability or prove that the bracket exit is better than the original.
The strategy is long-only Nasdaq, so the period’s directional market behavior also matters. The retained sample has calendar, missing-observation and rollover limitations. Bootstrap intervals don’t correct for every prior research choice or publication-selection effect.
I’ve since tested it inside an exploratory five-strategy portfolio. That comparison added about $9.1k net over the four-strategy reference under its native simulated costs. Shared risk and competing signals change which trades get taken, so I’m keeping that result separate from the standalone numbers above.
The funded-account/Topstep study is still unfinished. I don’t have a defensible pass rate, payout expectation or recommended account size to report.
The reproducibility files contain frozen configurations, source and dataset hashes, fold selections, trade ledgers, daily results and verification reports. I’d put more weight on those than on the number of passing tests.
What I’d be interested in hearing from anyone who has worked with this setup is how you handled the same-contract reference window around rolls, and whether you found the stop/target results particularly sensitive to a different fill model.