# Forward test: NQ ribbon RB-M15-LS-N, protocol v1.0 (frozen 9 October 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.

## 1. What 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](/posts/ema-ribbon-5-8-13-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.

## 2. The 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.

## 3. How 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.

## 4. Records 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.

## 5. Evaluation (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.

## 6. Stopping

- 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.

## 7. How 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 trades | About | Expected t | Chance of "supported" if the true mean is +0.049 R | If it is half that |
|---|---|---|---|---|
| 500 | 1 year | 0.70 | 10% | 5% |
| 1,000 | 2 years | 0.99 | 17% | 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".

## 8. Modifications

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.
