Forward Test: NQ EMA Ribbon (RB-M15-LS-N)

Protocol and monthly journal. The 15-minute EMA 5/8/13 ribbon on Nasdaq-100 futures, long and short, no stop, US session, tested forward on new data with the rule, the start, the costs and the evaluation fixed in advance.

Status, 14 October 2026: this page was live before the start (checked against the live site on 11 October 2026), so the record started as scheduled on Monday 12 October 2026, 09:30 New York. Its first data comes with the NQ export in the first week of November 2026.

One-line summary: a pre-registered forward test of the 15-minute EMA 5/8/13 ribbon on Nasdaq-100 futures, long and short, no stop, US session only. The record is a paper series: the original rule, computed by the backtest's own code on new data as it comes in, month by month, with the backtest's costs. No live or simulated orders are placed. It can show whether the historical result is contradicted. It cannot confirm an edge within a year or two (section 7).

Status: frozen 9 October 2026 (draft 7, approved by the owner the same day). Start: Monday 12 October 2026, 09:30 New York, provided this protocol is published on the site before that time; otherwise the next session after it is published, written here before any forward trade is computed. Nothing before the start counts.

What changed from draft 6, and why (owner's decision of 9 October 2026): draft 6 also ran the rule as an automated NinjaTrader strategy on a simulation account, as an implementation check. The owner's NinjaTrader has no local simulation account (Sim101); its only simulation account is a broker demo account that rejects NQ orders without a paid live-data subscription, and the free data feed is delayed by about 10 minutes, so that series could not have measured real execution either. The simulation series, its account requirements and its drawdown limit are therefore removed. The strategy check made for it (section 3) is kept as a record. A test of the rule with live data and real or simulated fills would be a separate test with its own protocol.

01What this test is, and what it is not

  • A forward evaluation, not a second backtest. The historical test (EMA 5/8/13 ribbon on NQ) gave Buried: this variant beat the matched control (percentile 99.8) but failed the development t-statistic (1.61, 2.5 needed) and the validation profit factor (1.15, 1.2 needed). The forward result does not change that verdict; it is a separate record.
  • Why only this variant: one variant, fixed before any forward data, so that the forward test is not another search. It had the highest control percentile and the most trades of the four 15-minute variants. That choice was made after seeing the historical results, which is one more reason why a positive forward result would be modest evidence.
  • A paper record, not trading. Results are computed, not traded: fills are the backtest's assumed fills (next 1-minute open plus one tick) and costs are the backtest's assumed costs. It says nothing about real execution.

02The rule (frozen; nothing here may change during the test)

  • Market: NQ (E-mini Nasdaq-100), 1 contract, NinjaTrader's continuous back-adjusted series (merge policy MergeBackAdjusted, rolling on the second Thursday of the expiry month). Bars: 15-minute bars of the electronic session (CME US Index Futures ETH), New York clock, bar time = close time.
  • Averages: EMA(5), EMA(8), EMA(13) of the 15-minute closes, on all bars of the electronic session. Alignment at a bar close: bull if EMA5 > EMA8 > EMA13; bear if EMA5 < EMA8 < EMA13; otherwise none (differences below 1e-10 count as ties).
  • Entry: when an alignment starts on a bar that closes after 09:30 and no later than 15:45 New York: bull start = buy 1 contract, bear start = sell short 1 contract. An alignment that started before the window does not give an entry.
  • Exit: at the next 1-minute open after the first 15-minute bar on which the position's alignment is broken; and at the scheduled close of the US session from the exchange calendar: 16:00 New York; 13:00 on US holidays when the market is open and on Thanksgiving; 13:15 on the day after Thanksgiving, on 24 December and on 3 July when they are not the observed holiday. No position overnight. No stop, no target, no filter, no discretion. If the alignment flips on one bar inside the window, the long is closed and the short opened together.
  • Fills and costs: entries and exits at the open of the next 1-minute bar plus one tick against the position; the session-close exit at the close of the scheduled-close bar; $15.76 a round trip (commission $5.76 plus one tick of slippage on each fill), exactly as in the backtest.
  • R: 1.5 x ATR(14) of the 15-minute bars at the signal bar, in points; with no stop, R is a reporting unit, not a maximum loss.

03How the series is computed

  • Code: rb_lib.js, the backtest's code, unchanged (SHA-256 20b1be79cb731804ef1a924d57da311bbd3ad0e8d0e0489d5aa2f520ebb44b12); any change to it makes a new test.
  • Data: NinjaTrader's NQ 1-minute history, exported in the first week of every month with FuturesDataExporter.cs, from 1 January 2020 to the end of the previous month, so the averages are fully warmed up at the start. The export's SHA-256, its last bar and its holes (find_holes.js) are recorded with each update.
  • Data rule 3 (as in the backtest): holes are never filled. Trades open across a hole are counted, and the evaluation is also reported without them; if that changes a label, the label is reported as inconclusive for that reason.
  • Each month the whole forward window is recomputed from the new export. Because the series is back-adjusted, past prices shift by a constant at each roll; results in R, points and dollars do not change with that shift. Check: every earlier forward trade must reproduce in entry and exit time, direction, points and R; any difference is published and explained.
  • Record kept from draft 6: the NinjaTrader strategy RibbonForwardNQ.cs (SHA-256 6f38db93ec5f8f61637166f2164d22577475d765a6f76ae93874b714d9864c2e) was checked on history (15 June to 7 October 2026) against rb_lib.js: the same 156 trades, 96 identical in every field and 60 differing only in the price of the session-close exit (rb_strategy_check.txt). It is not part of this test.

04Records and reporting

  • Per trade: entry and exit time, direction, entry and exit price, points, dollars, R, the exit reason, and whether it was open across a data hole.
  • Monthly update (the first for the month in which the test starts, published in the first week of the next month): the trades of the month and of the whole forward window, results in R and dollars, profit factor, win rate, drawdown on closed trades and including open losses, the export's hash and holes, and the reproduction check. Months with no trades are reported too. Raw files (the trade list and the computation's output) are published with each update; the raw NinjaTrader price data is not.

05Evaluation (fixed now)

  • Evaluation points: at 500 and 1,000 closed trades (about one and two years at the historical rate of about 500 a year). Monthly updates before them are descriptive only.
  • Statistic: the mean net R per trade, its standard deviation, the standard error (SD / sqrt(n)) and the 95% confidence interval = mean +/- t(0.975, n - 1) x SE; the profit factor; the win rate; drawdowns on closed trades and including open losses. As a robustness check, the same interval is also computed on daily totals (the sum of R per trading day as the unit), because trades on the same day are not independent; the verdict uses the per-trade interval and the daily one is reported next to it.
  • Verdict:
    • Contradicted: the mean net R per trade is zero or negative, or the profit factor is below 1.0.
    • Not contradicted: the mean is positive, the profit factor is at least 1.0, and the 95% interval includes zero. It means "keep going", not "confirmed".
    • Supported: the lower end of the 95% interval is above zero.
  • Two looks: the same rule is applied at 500 and at 1,000 trades without adjustment; because the two samples overlap, the chance of a "supported" label at either point when the true edge is zero is a little above 2.5% (one-sided), and is stated with the result.
  • Matched control on the forward window: the 15-minute alignment series from the start to the evaluation point, circularly shifted by a random offset of at least 5% of its length, 500 times with fixed seeds (1000 + run), with the same rules and costs; the forward percentile is reported next to the verdict.
  • The criteria are not changed after results are seen.

06Stopping

  • The paper series has no drawdown limit: it records what the rule would have done, and stopping it on a bad run would bias the record. It stops only at the 1,000-trade evaluation, or earlier if NinjaTrader's NQ history can no longer be exported; the reason and the date are then published, and the evaluation is made on the trades collected, with the sample size stated.

07How much this test can show (the power estimate)

From the 3,341 historical trades of this variant: mean +0.0493 R a trade, standard deviation 1.570 R. If the forward trades had the same mean and spread and were independent, the expected t-statistic after n trades is 0.0493 x sqrt(n) / 1.570, and the chance that the lower end of the 95% interval is above zero is about Phi(expected t - 1.96):

Closed tradesAboutExpected tChance of "supported" if the true mean is +0.049 RIf it is half that
5001 year0.7010%5%
1,0002 years0.9917%7%

These figures are optimistic: the historical mean comes from a variant chosen because it looked best, so the true mean is more likely lower than higher, and trades on the same day are correlated. About 4,000 trades (eight years) would be needed for an even chance at the historical mean. The likely outcomes are "not contradicted" or "contradicted".

08Modifications

Any change to the rule, the averages, the timeframe, the session, the market, the size, the costs, the code or these criteria is a separate test with its own name, frozen protocol and start date. Results are never merged across tests.

JMonthly journal

Updated in the first week of every month, months with no trades included. Results are computed by the backtest's code on the new data (a paper record, not trades).

No forward data yet. The test has not started.

Raw files

ProtocolThe protocol as text.
nq_ribbon_forward_protocol.md
CodeThe backtest's simulation, which computes the series (SHA-256 in section 3).
rb_lib.js
Strategy check (record from draft 6, not part of this test)The NinjaTrader strategy, its comparison with our simulation on 15 June to 7 October 2026, and its journal of that run.
RibbonForwardNQ.cs (as text) · rb_strategy_check.js · rb_strategy_check.txt · rb_test_journal_2026-10-08.csv
BackgroundThe historical test this forward test continues.
EMA 5/8/13 ribbon on NQ

CCorrections

None yet. Any change to this protocol after the start would be published here and would make the changed version a separate test (section 8).