Backtest Methodology & Disclosure

Last updated: 2 September 2026

This page documents how the Monitron TradingView indicator’s backtested figures were produced — the dataset, the assumptions, every result in the comparison matrix, and the limitations of the method. It is not a live track record, and no result on this page should be read as a prediction of future performance.

Applying these setups in practice — not modeled in this backtest

The backtest above applies the confluence checklist's numeric score mechanically: a setup qualifies whenever the score reaches the configured threshold, and every qualifying setup is traded identically. It does not, and cannot, evaluate the additional discretionary judgment a live trader is expected to apply on top of a qualifying score. Before placing a trade, four conditions should be checked every session — doing so is expected to raise the practical win rate of any rated setup beyond what the mechanical backtest alone shows, but this has not itself been independently backtested:

  1. A clear daily bias. If the case for both longs and shorts is equally supportable, that is usually a signal to stay hands-off until conditions clear up rather than take a rated setup regardless.
  2. A strong draw on liquidity — equal highs/lows, a news wick, or an HTF unmitigated gap — giving the trade somewhere real to go.
  3. A protected stop loss, meaning there is no obvious reason for price to run the stop before continuing in the intended direction.
  4. A breakeven rule. There is usually a point in the trade — a high/low, an FVG, or an UMG — on the way to your DOL/TP. That's your breakeven point.

Honourable mention: before placing a trade, ask whether more evidence supports it or opposes it.

None of this four-point check was applied as a filter in the automated backtest above — the reported trade counts and results reflect the mechanical score threshold only. Applying this judgment in live trading is expected to improve on the backtested numbers, but that expectation is itself unverified and should not be read as an implicit performance claim.

HYPOTHETICAL/SIMULATED RESULTS — NOT ACTUAL TRADING. These results were generated by applying programmed rules to historical bar data. No represented trade was placed in a live account. The model was developed and compared with alternatives using the same historical period, so the results benefit from hindsight and may overstate performance that could have been achieved live. No account is represented as likely to achieve similar profits or losses.

This is a refreshed run. The script went through several revisions since the previous disclosure (v3.63–v3.73 — most were display/logging-only; the signal-affecting changes were an external equilibrium timeframe, a reworked order-block scoring rule, and an order-block staleness cutoff switched on by default — see the full methodology for detail) and the backtest was rerun on the same methodology (same markets, timeframes, RR targets, score threshold and sessions described below). This document and its figures supersede any earlier version of this disclosure — do not mix numbers from the two.

Result being presented

The highest baseline PnL in the final 25-cell comparison was again the 4-minute chart, 3.0R target configuration:

MeasureSimulated result
Test period8 August 2021–6 August 2026
Starting account$50,000
Trades758
Win rate27.18%
Baseline PnL before modeled trading costs+$33,336.50
Baseline ending balance$83,336.50
Baseline return on starting balance+66.67%
Baseline profit factor1.133
Baseline maximum drawdown$19,283.50 / 32.34%
Baseline expectancy$43.98 per trade

"Net PnL" means gross simulated PnL less the costs configured in the engine. For the baseline simulation, commission was $0.00 per contract per side and slippage was zero ticks. The displayed baseline is therefore economically gross of real commission, exchange and regulatory fees, bid/ask spread, slippage, latency, market impact, data/platform charges and contract-roll costs. Live performance would be lower if these costs are positive.

The workbook includes a separate flat combined round-trip cost sensitivity. At $5 per completed position, the 4-minute/3.0R result falls to +$29,546.50 (59.09% on the fixed starting balance; profit factor 1.117). At $10 per position it falls to +$25,756.50 (51.51%; profit factor 1.101). At $15 per position it falls to +$21,966.50 (43.93%; profit factor 1.085) — and at that cost level, a different configuration edges it out: 5-minute/1.5R reaches +$22,115.00 (44.23%; profit factor 1.135), a narrow $148.50 margin. Unlike the previous run, the 4-minute/3.0R cell does not remain the best-performing configuration at every modeled cost level. 5-minute/1.5R also has a materially higher win rate (44.4% vs. 27.2%) and lower drawdown (11.5% vs. 32–40%) than the 4-minute/3.0R cell throughout, worth weighing against its slightly lower peak PnL at $5 and $10. These are flat per-position deductions, not a per-contract broker schedule, and do not change simulated fill prices. The 4-minute/3.0R run used as many as 125 MNQ contracts on tight-stop positions (average 8.78), so the sensitivity can materially understate actual cost where commission and slippage scale with size.

The workbook also shows an adjusted 1%-of-current-balance comparison starting from $50,000. It compounds after each closed trade and recalculates whole MNQ contracts, but preserves the fixed-$500 backtest's accepted trade path. It is not a fresh signal replay and should not be presented as a separately validated backtest. Under this view, 5-minute/1.5R — not the headline 4-minute/3.0R cell — is best at every modeled cost level: +$42,837.75 at zero cost, +$39,571 at $5, +$34,207.25 at $10 and +$28,101.75 at $15 per completed position. This is a different pattern from the previous run, where 4-minute/3.0R led the adjusted view at three of the four cost levels.

Test scope

  • Signals were calculated on a back-adjusted continuous NQ series, using ES as the SMT reference. PnL used MNQ contract economics.
  • Chart timeframes tested: 1, 2, 3, 4 and 5 minutes.
  • Reward:risk targets tested: 1.0, 1.5, 2.0, 2.5 and 3.0.
  • Setups required a checklist score of at least 5.0 (maximum possible score is 11.5 under v3.73, down from 12.0 previously — see the full methodology).
  • Entry windows were the first 90 minutes of Asia, London and New York as defined in the full methodology. Trades were allowed to continue after the entry window until stop or target.
  • Position size was the largest whole number of MNQ contracts whose initial stop risk did not exceed $500. A setup was skipped if one contract exceeded that cap.
  • Breakeven-stop management was disabled.

Optimisation disclosure

The 4-minute/3.0R result was selected after comparing 25 timeframe/RR combinations. Session, rating, exact-score and year subsets were also reviewed. Earlier research iterations explored other score thresholds, session rules, breakeven management choices and indicator versions using substantially the same history. There was no untouched holdout period, walk-forward selection, multiple-testing correction or live trading record. The 25 results are highly correlated because they reuse the same NQ/ES bars and often the same setup events; they are not 25 independent experiments. This run makes the sensitivity of "the best result" concrete: it changes depending on whether cost or sizing assumptions shift (see above) — treat 4-minute/3.0R as the headline of this specific matrix, not a robust, assumption-independent finding.

The full dataset, code, execution assumptions, complete result matrix, hashes and limitations are documented in PHASE3_BACKTESTING_DOCUMENTATION.md.

This disclosure is a research record, not legal advice or a determination that the proposed listing complies with financial-promotion, CTA/CPO, NFA or other rules. Obtain review for the jurisdictions and platform where the listing will appear.


Full Methodology

v3.73 refresh — signal-affecting changes since the v3.62 run documented previously. Between v3.62 and v3.73 the Pine script went through v3.63–v3.66 (runtime/logging/display only, no signal change), then three real signal-affecting changes: v3.67 made Equilibrium external (premium/discount now measured against a higher-timeframe swing, default 1H, instead of chart-timeframe pivots), v3.72 rebuilt OB/RB scoring (it now scores when the current sweep's own bar overlaps an already-existing, still-alive order-block zone, rather than requiring a create→displace→retrace sequence to complete within the current setup — weight dropped 2.0→1.5, max possible score 12.0→11.5), and v3.73 flipped two input defaults: obMaxAge 0 (off) → 2500 bars, and the HTF FVG scan set swapped 8h off/2h on (was 8h on/2h off). src/ictbt/signals.py and src/ictbt/config.py were revised on 2 September 2026 to match; engine.py, account.py, compact_report.py and the export/verify scripts needed no signal-logic changes (though the compact-report/export/verify scripts' hashes moved — see §11.3). All result tables (§6.2, §8.1–8.4) and all hashes below are computed directly from this run's real files.

Document control

FieldValue
StrategyICT Confluence Checklist
Tested implementationPine v3.73; Python port (signals.py, config.py) revised 2 Sept 2026 to match
Test typeHistorical, deterministic, hypothetical simulation
Backtest run date2 September 2026, ~13:55 (from the result file's own timestamp)
Documentation date2 September 2026
Primary release artifactresults/NQ_v373_ge5_risk500_costs_compact.xlsx
Working build artifactNot used; the release artifact was written directly
Result artifact SHA-256D5CE642FA54CA1784E3260EA9C10CA8A382521D68538EB1EB4CCEB1345108B04
Starting accountUSD 50,000
Tested data period8 August 2021 22:00 UTC–6 August 2026 23:59 UTC
StatusPre-publication research disclosure; not a live track record

This document applies only to the result artifact identified above. The workbook also contains a post-run 1%-of-equity sensitivity described in section 6.2. A strategy, Pine script, Python port, dataset, cost assumption or execution-setting change requires a new backtest and a new document version.

Prominent hypothetical-performance warning

THE RESULTS IN THIS DOCUMENT ARE HYPOTHETICAL AND DO NOT REPRESENT ACTUAL TRADING. Trades were reconstructed from historical OHLCV bars using modeled entries, stops and targets. They were not exposed to live spreads, order-book liquidity, queue position, rejected orders, partial fills, latency, market impact, operational failures, margin calls or the psychological and financial pressures of live losses. The strategy and selected configuration were developed with knowledge of the test history. No representation is made that any account will achieve results similar to those shown.

The CFTC states that simulated results should be accompanied by a prominent caution because they do not represent actual trading and may misstate liquidity effects; for electronic promotion, the warning should be in immediate proximity to the performance presentation. The FCA similarly requires a prominent warning that simulated past performance is not a reliable indicator of future performance. See the CFTC Regulation 4.41 final rule, CFTC trading-system advisory, and FCA COBS simulated-performance provisions. These links provide context only; this document is not legal advice.

1. Purpose and scope

The objective was to measure the historical behavior of the v3.73 signal model across five intraday chart timeframes and five reward:risk targets, using a constant rule set and a score threshold of 5.0 or higher. The backtest reports trade count, win rate, nominal USD PnL, return on a USD 50,000 starting balance, profit factor, expectancy, average R and peak-to-trough account drawdown.

The backtest is a strategy-research tool. It is not:

  • an audited performance record;
  • a broker statement or record of filled orders;
  • a forecast, guarantee or probability estimate for future returns;
  • a margin, liquidation, tax or cash-management simulation; or
  • evidence that the strategy can be executed at the modeled prices and size.

2. Dataset

2.1 Source data

Raw historical data came from Databento batch jobs using:

ItemNQES
DatasetGLBX.MDP3GLBX.MDP3
Requested parent symbolNQ.FUTES.FUT
Schemaohlcv-1mohlcv-1m
Encoding/compressionCSV / ZstandardCSV / Zstandard
Batch jobGLBX-20260808-C9VU9YLF4YGLBX-20260808-U3SY3RJ8LN
Raw-file SHA-256e749d7844e612eb864929d92631797ffa794063cf804b3dc2444ab0b705b3334cc27a38917ab2a0462eff91faab9b9e64faf61b943403f16db764f8e5e0f6e9f

The requested raw interval was 7 August 2021 00:00 UTC through 7 August 2026 00:00 UTC. After contract selection and removal of periods without the selected front contract, both processed series begin at the Sunday Globex open on 8 August 2021 and end on 6 August 2026. Unchanged since the v3.62 run — verified by recomputing both processed-file hashes directly against this run (§2.3); the same dataset was reused, not re-pulled.

2.2 Continuous-series construction

The raw parent-symbol files contain individual futures contract months. The backtest did not trade those contracts directly. ictbt.continuous created a synthetic continuous series as follows:

  1. Calendar-spread symbols were removed; outright contracts were retained.
  2. For each UTC calendar date, the outright contract with the highest total daily volume was selected as the front month.
  3. When the selected contract changed, the price difference between outgoing and incoming contracts was measured using their final close on the preceding front-contract date.
  4. Earlier OHLC history was shifted by the accumulated roll differences (Panama/back-adjustment). The latest contract price level was left unchanged.

This produces smoother point changes for research but is not itself tradeable. The simulation does not model an actual position roll, roll timing, calendar spread, roll slippage or roll commission. Back-adjusted historical price levels are synthetic, even though within-trade point differences are intended to be preserved.

2.3 Processed data audit

MeasureNQ continuous 1mES continuous 1m
Rows1,770,2291,769,807
First timestamp2021-08-08 22:00 UTC2021-08-08 22:00 UTC
Last timestamp2026-08-06 23:59 UTC2026-08-06 23:59 UTC
Source contracts represented2121
Duplicate timestamps00
Null OHLCV values00
Processed SHA-256AA7818CD146D50885204CE215B2CD556EA20DC28E8E257F956967C8712AAB341610D60D09A66CB8492CEDABA3BC7A2D9EAA5E2A286C4DE12C6F90B8B6AB8C7F6

Both hashes recomputed directly from disk on 2 September 2026 and confirmed identical to the v3.62 run's — the underlying dataset genuinely did not change between runs, only the signal model. The audit above checks file-level continuity properties, not market-data correctness against an independent vendor. Minute bars omit bid/ask quotes, order-book depth and tick sequence.

3. Markets, timeframes and test period

3.1 Market roles

  • Signal/chart market: NQ continuous futures.
  • SMT reference market: ES continuous futures.
  • PnL/execution proxy: MNQ contract economics applied to NQ prices.
  • Currency: nominal US dollars; no inflation, tax or currency conversion.

NQ and MNQ track the same index but are separate order books. Reusing NQ bars for MNQ fills assumes the same tradable price and ignores differences in spread, depth, volume and short-lived prints. That proxy can be optimistic.

MNQ economics used by the engine were $2 per index point, a 0.25-point minimum tick and $0.50 per tick per contract.

3.2 Chart and higher timeframes

The execution/chart series were resampled from the one-minute data into 1, 2, 3, 4 and 5-minute OHLCV bars. The same chart timeframe controlled signal-state bar counts, including pivot confirmation and the two-chart-bar SMT event-pairing distance.

The signal engine also used resampled higher-timeframe context. Changed in v3.73: default enabled HTF FVG scans are now 15-minute, 1-hour, 2-hour, 4-hour and Globex-session Daily; 30-minute and 8-hour scans are disabled (the v3.62 run had 8-hour enabled and 2-hour disabled — the two swapped). This affects HTF containment/draw/UMG-tap/stop-side-UMG scans and, since v3.72, the OB/RB parent-zone lookups wherever they iterate the enabled-timeframe ladder. Daily levels rolled on the futures session rather than UTC midnight.

Equilibrium, changed in v3.67 (unchanged since): premium/discount for the Equilibrium scoring row is measured against the last confirmed swing high/low on a separate eqTF setting (default 1H; options 1H/2H/4H/Daily) rather than chart-timeframe pivots. 1H/2H/4H reuse the confirmed HTF 2/2 pivot streams already fetched for the sweep-liquidity pool; Daily reuses PDH/PDL. Clean Target still uses chart-timeframe swing pivots and was not affected by this change.

3.3 Entry sessions

Signals were eligible only when their signal timestamp fell within one of these half-open, timezone-aware windows:

Session labelTimezoneEntry window
AsiaAmerica/New_York19:00–20:30
LondonEurope/London08:00–09:30
New YorkAmerica/New_York09:30–11:00

IANA timezone conversion was used, so UK and US daylight-saving transitions were handled by date. These were entry filters only. No maximum-bars or session-end exit was configured, so a position could continue after its entry window and could remain open across later sessions or overnight until stop, target or the end of available data.

4. Signal and portfolio rules

  • Pine/strategy version represented: v3.73.
  • Bias setting: Both (long and short signals eligible).
  • Minimum accepted score: 5.0. Under the model's grading table this includes A-, A and A+ setups, plus any exact score at or above 5. Maximum possible score is now 11.5 (was 12.0 under v3.62) — see the OB/RB weight change below; the grade-cutoff bands themselves were left unchanged by that change.
  • Mandatory trigger path: eligible sweep, directionally valid full-leg IFVG, accumulation gate, directional draw gate and stop-side UMG veto.
  • Confluence score components: HTF context, exact-stop SMT, order block/rejection block, equilibrium, CISD, clean target and killzone.
  • Order block / rejection block, reworked in v3.72: no longer requires a create → displace → retrace sequence to complete within the current setup (that retrace typically hadn't happened yet by trigger time, since OB creation usually confirms on the same thrust as CISD/IFVG — the old condition was effectively unreachable at the trigger bar). OB/RB is now treated like an HTF FVG/UMG: a zone persists across setups, and it scores whenever the current sweep's own bar overlaps an already-existing, still-alive zone of the matching side (the zone's creation bar must be strictly before the sweep bar, so a zone can't self-qualify off its own creation). Any live zone can score every time it's swept into — there is no first-touch-only restriction. Score weight dropped from 2.0 to 1.5 points to reflect that it's now a looser "swept into a standing zone" confluence rather than a confirmed post-sweep retest.
  • Order block staleness, added v3.70, defaulted on in v3.73: a still-untapped order block older than obMaxAge bars can now retire and be replaced at the next qualifying create pattern, rather than blocking OB/RB from ever scoring again in that direction (found via a real case: a bearish OB stuck ~2,400 points away for ~6 weeks of chart history). obMaxAge defaulted to 0 (off) through v3.70–v3.72; v3.73 changed the default to 2500 bars, so this run has the staleness cutoff active. Input default only — no other logic changed in v3.73.
  • One open position per scenario. Signals arriving before the prior position's exit timestamp were skipped.
  • Breakeven-stop management: disabled. The original stop remained active.
  • Stop: lowest low of the current and preceding four chart bars for longs; highest high of those five bars for shorts.
  • Target: entry plus/minus the selected RR multiplied by initial stop distance.

4.1 Discretionary application layer — not modeled in this backtest

Every signal meeting the numeric score threshold above was traded identically in this simulation. Live application of this strategy is expected to layer additional discretionary judgment on top of a qualifying score, checked every session before placing a trade:

  1. A clear daily bias — if the case for both longs and shorts is equally supportable, that session is usually treated as hands-off rather than traded regardless.
  2. A strong draw on liquidity (equal highs/lows, a news wick, or an HTF unmitigated gap).
  3. A protected stop loss, with no obvious reason for price to run it before continuing in the intended direction.

None of the three conditions above were encoded as a filter in this backtest — they require judgment the automated signal engine does not attempt to model. Applying them in live trading is expected to improve on the reported mechanical results, but that expectation has not itself been backtested and should not be read as an implicit performance claim on top of the figures in this document.

The detailed signal specification is maintained separately in SPEC.md.

5. Execution, fills and intrabar assumptions

Unchanged from the v3.62 run — engine.py and account.py hashes are byte-identical to that run (§11.3), confirming no execution/sizing logic changed.

5.1 Entry and exits

  • Entry fill: next chart bar open after the signal.
  • Stop/target fill: exact stop or target level when the bar range touched it.
  • Gap-through behavior: the engine still fills at the stop/target level rather than the first available worse market price. This can be optimistic around gaps and fast markets.
  • For 2–5 minute charts, one-minute OHLCV was supplied to determine which level was touched first when a chart bar contained both stop and target.
  • If a single one-minute bar itself contained both levels—or on a 1-minute chart where no finer sequence existed—the pessimistic stop_first rule was used.
  • No tick data was available, so ordering within a one-minute bar is unknown.

5.2 Position sizing

The execution proxy was MNQ. For each signal:

  1. Initial risk per contract equaled stop distance × $2 per point.
  2. Contracts equaled the floor of $500 divided by risk per contract.
  3. The setup was skipped when one MNQ contract alone exceeded $500 risk.

The resulting planned market risk was therefore less than or equal to $500, not exactly $500. This is 1% of the fixed $50,000 starting balance at inception, but it is not continuous 1%-of-equity sizing. The size did not compound with account equity and was not reduced after drawdowns. Margin availability, buying power, liquidation and concentration constraints were not modeled.

The maximum observed size on the headline cell was 125 MNQ contracts, caused by a very tight stop. No independent maximum-contract, margin or liquidity cap was applied. This is a material execution limitation for a nominal $50,000 or prop-firm account.

6. Fees, slippage and omitted costs

Cost itemBacktest assumption
Commission per MNQ contract per side$0.00
Slippage per entry0 ticks
Slippage per exit0 ticks
Bid/ask spreadNot modeled
Exchange/regulatory/broker feesNot modeled
Market data/platform feesNot modeled
Contract-roll costsNot modeled
Market impact/partial fillsNot modeled

The workbook column is named net_pnl, but the engine subtracts only configured commission and applies only configured slippage. Because both were zero, the reported "net" figures are not net of realistic trading costs. They should not be advertised simply as "net returns" without this qualification.

6.1 Flat round-trip sensitivity

The workbook's Cost Sensitivity sheet deducts a flat combined round-trip cost of $5, $10 or $15 from every completed position. It recomputes adjusted PnL, ending balance, return, win rate, profit factor, expectancy, average R and closed-trade drawdown for every timeframe/RR/session cell.

This is a post-trade sensitivity only. It does not alter entry/exit prices, intrabar ordering, contract quantity, position duration or subsequent signal eligibility. It is modeled per completed position rather than per MNQ contract. The winning 4-minute/3.0R cell itself averaged 8.78 contracts and reached 125 contracts on its tightest-stop trades — its own maximum, not one drawn from elsewhere in the matrix — so the flat sensitivity can materially understate actual costs where fees or slippage scale with quantity.

New in this run: at $15/position the best-performing cell is no longer 4-minute/3.0R — see §8.4 for the full breakdown and why.

Before public use, also model the intended broker or prop firm's current per-contract all-in fees, realistic size-dependent slippage and any maximum contract limits. Publish those assumptions rather than substituting one favorable flat-cost case.

6.2 Adjusted 1%-of-equity sensitivity

The workbook's 1% Dynamic Risk sheet starts every independently filtered timeframe/RR/session/cost scenario at $50,000. Before each accepted trade, its whole MNQ quantity is recalculated as the floor of 1% of current closed-trade equity divided by that trade's initial risk per contract. Equity changes only after a trade closes. A session-specific row compounds only that session's trades; an Overall row compounds all accepted sessions chronologically.

This is an adjusted same-trade-path comparison, not a full event-loop replay. It preserves the fixed-$500 report's accepted trades, fills, stop/target outcome and sequence. In a fresh simulation, changing the risk budget could admit a trade that the $500 cap rejected, skip a trade after a drawdown, and consequently change one-position-at-a-time eligibility for later signals. Those path changes are not represented on this page.

Under this adjusted view, 5-minute/1.5R — not the headline 4-minute/3.0R cell — is best at every modeled cost level: +$42,837.75 at zero cost (ending balance $92,837.75, versus +$31,565 for that same cell under fixed-$500 sizing), +$39,571 at $5/position, +$34,207.25 at $10/position and +$28,101.75 at $15/position. This is a different pattern from the v3.62 run, where the adjusted view's best cell was 4-minute/3.0R at three of the four cost levels. These values are in-sample selections and inherit the flat-per-position cost limitation.

7. Parameters tested

The final matrix was:

  • chart timeframe ∈ {1m, 2m, 3m, 4m, 5m};
  • target RR ∈ {1.0, 1.5, 2.0, 2.5, 3.0};
  • score threshold fixed at ≥5.0;
  • fixed original stop only;
  • three entry sessions described above.

This created 25 portfolio simulations from one historical market period.

8. Sample size and complete final matrix

Signal generation produced the following score-eligible candidates (score >= 5.0) before the one-position-at-a-time rule: 6,664 (1m), 4,772 (2m), 3,686 (3m), 3,017 (4m) and 2,499 (5m) — read directly from this run's own generation log (results/NQ_v373_ge5_risk500_costs_compact.log) on 2 September 2026. These counts are meaningfully higher than the v3.62 run's (4,668/3,499/2,801/2,439/2,003) — consistent with the v3.67 equilibrium change and v3.72's OB/RB rework both loosening what can reach the trigger path, not a data or methodology change. These counts are not independent across timeframes. For reference, the total scored candidates at every grade (before any score filter at all) were far higher: 15,584 (1m), 10,052 (2m), 7,402 (3m), 5,994 (4m) and 4,884 (5m) — recovered on 2 September 2026 by rerunning the signal-scan step directly (scripts/export_score_threshold_comparison.py, written to results/NQ_v373_score_threshold_comparison.xlsx) and cross-checked against this run's own score>=5 counts above, which reproduce exactly.

8.1 Completed trades per scenario

Timeframe1.0R1.5R2.0R2.5R3.0R
1m2,0031,9461,8881,8551,830
2m1,2921,2601,2381,2201,203
3m1,0231,012993981971
4m800788780771758
5m636630625621616

There were 27,740 trade rows across all scenarios (up from 23,252 in the v3.62 run). This is not an independent sample of 27,740 trades: changing RR changes position duration and which later signals are skipped, and all scenarios reuse the same historical bars.

8.2 Configured-cost (zero-cost baseline) net PnL by scenario

Timeframe1.0R1.5R2.0R2.5R3.0R
1m+$7,235.00+$1,029.00-$3,421.50+$2,948.25+$20,837.00
2m+$7,357.50+$14,637.75+$20,751.50+$24,941.50+$13,951.00
3m-$3,733.00+$2,294.50+$2,990.00+$24,116.50+$18,009.00
4m+$23,390.00+$25,337.25+$23,467.50+$27,569.50+$33,336.50
5m+$14,551.00+$31,565.00+$21,604.00+$25,630.25+$25,970.00

8.3 Highest final-matrix result

The 4-minute/3.0R cell had the highest PnL among the 25 final cells, same as the v3.62 run:

MeasureResult
Trades758
Win rate27.18%
Baseline PnL before modeled costs+$33,336.50
Baseline ending balance$83,336.50
Baseline return on $50,000+66.67%
Baseline profit factor1.133
Baseline expectancy$43.98/trade
Baseline average R0.087R
Baseline maximum drawdown$19,283.50
Baseline maximum drawdown32.34%

That cell is the ex-post winner, not a pre-registered estimate. Note the maximum drawdown widened materially versus the v3.62 run (23.54% → 32.34%) even though headline PnL, win rate and profit factor moved only modestly — the small edge statistics (profit factor 1.133, average R 0.087) still make the result particularly sensitive to omitted costs, fill assumptions and modest rule/data changes.

8.4 Best result under each flat-cost case

Flat round-trip costBest cellTradesAdjusted PnLReturnProfit factorMax drawdown
$5/position4m / 3.0R758+$29,546.5059.09%1.117$20,558.50 / 34.75%
$10/position4m / 3.0R758+$25,756.5051.51%1.101$21,833.50 / 37.20%
$15/position5m / 1.5R630+$22,115.0044.23%1.135$7,507.75 / 11.53%

Changed from the v3.62 run: the same cell no longer wins at every cost level. At $15/position, 4-minute/3.0R's own adjusted result is +$21,966.50 (43.93% return, profit factor 1.085, max drawdown $23,108.50/39.69%) — 5-minute/1.5R edges it out by $148.50, a genuinely narrow margin, not a rounding artefact. 5-minute/1.5R also carries a much higher win rate (44.4% vs. 27.2%) and dramatically lower drawdown (11.5% vs. ~40%) than the headline cell at every cost level checked, worth weighing against its slightly lower peak PnL at $5 and $10. These rows are selected separately within each cost case; the same 4-minute/3.0R cell still wins at $5 and $10, but it remains an ex-post sensitivity winner, and this run shows that "winner" is genuinely sensitive to which cost assumption is used, not a fixed property of the strategy.

9. Metric definitions

  • Trade count: simulated positions completed in that scenario after one-position-at-a-time skipping and risk-cap eligibility.
  • Win rate: share of trades with positive configured-cost PnL.
  • Net PnL: gross point PnL converted using MNQ economics, minus configured round-trip commission. It is not realistic net PnL when configured costs are zero.
  • Profit factor: total positive trade PnL divided by absolute total negative trade PnL.
  • Expectancy: mean configured-cost PnL per trade.
  • R multiple: configured-cost PnL divided by the original planned stop risk.
  • Maximum drawdown: largest peak-to-trough decline in sequential closed-trade account equity. It excludes intratrade equity movement and margin calls.
  • Return: cumulative PnL divided by the $50,000 starting balance. Baseline, run, rating and yearly pages use fixed-$500 sizing without compounding. Only the explicitly labelled 1% Dynamic Risk page compounds closed-trade equity.

10. Optimisation and data-snooping disclosure

10.1 Final-run selection

The headline 4-minute/3.0R result was selected after viewing all 25 final cells. The workbook also enables retrospective comparison by session, grade, exact score and calendar year. Selecting the best of these views increases the chance that the apparent winner reflects historical noise. As §6.2 and §8.4 show for this run specifically, a different cell (5-minute/1.5R) wins under the 1%-dynamic-risk view and at the $15 flat-cost level — a concrete illustration of how sensitive the "best" configuration is to which lens is applied.

10.2 Earlier development iterations

Before this final run, substantially the same five-year history was used during repeated development and testing. Research iterations included:

  • multiple Pine/port versions and signal-rule changes, including the v3.63–v3.73 changes documented in §3.2 and §4 of this run specifically;
  • score cutoffs including approximately 6, 7, 9, 10 and 11+;
  • different Asia/London/New York entry windows;
  • breakeven versus original-stop management; and
  • repeated comparison of 1–5 minute charts and several RR targets.

These earlier decisions are part of the effective optimisation search even though they are not all represented in the final 25-cell workbook.

10.3 Validation status

  • No period was kept fully untouched throughout strategy development.
  • No formal train/validation/test split was used.
  • No walk-forward parameter selection was used.
  • No multiple-comparison or selection-bias adjustment was applied.
  • No Monte Carlo execution-cost or sequence analysis was applied.
  • No live, broker-verified or independently audited track record was supplied.
  • Pine/Python parity diagnostics (v3.68/v3.69 changelog entries) added logging for the equilibrium and OB/RB parity gaps found during porting, but the final v3.73 five-year output has not been fully reconciled against a fresh set of TradingView labels across all timeframes.

Accordingly, all results are in-sample research and should be expected to be optimistic relative to a genuinely untouched or live test.

11. Code and reproducibility

11.1 Execution command

Reconstructed from scripts/export_compact_report.py's actual argparse defaults, checked directly against the source on 2 September 2026 — every value below except --out matches the script's own default:

python scripts/export_compact_report.py NQ --out results/NQ_v373_ge5_risk500_costs_compact.xlsx

(Defaults used: --exec-rules 1min,2min,3min,4min,5min --rr-values 1.0,1.5,2.0,2.5,3.0 --min-score 5.0 --bias Both --risk-per-trade 500.0 --cost-scenarios 5,10,15 --gallery-count 8.)

The exporter fixed the PnL instrument to MNQ by default for NQ signals, applied risk_per_trade_usd=500.0, used engine defaults for baseline costs and fills, did not enable breakeven management, and added the separate flat $5/$10/$15 per-position cost sensitivity.

11.2 Runtime

ComponentVersion
Python3.12.1
pandas3.0.5
NumPy2.5.1
Matplotlib3.11.1
openpyxl3.1.5
PyArrow25.0.0
pytest9.1.1

The project supports Python 3.11+; the v3.62 run used 3.14.0, this run used 3.12.1 — both supported, noted for exact reproducibility rather than as a methodology change. The regression suite reported 117 passing tests before final delivery (was 102 for the v3.62 run — the increase reflects the new v3.67/v3.70/v3.72/v3.73 unit tests).

11.3 Source hashes

Computed directly from the files on disk on 2 September 2026.

FileSHA-256Changed since v3.62 run?
src/ictbt/signals.py4FDC24D9AC964D2B93C5F8106C3A5FB5598E97916AF356289F18712C31FC51B7Yes — v3.67/v3.70/v3.71/v3.72 ports
src/ictbt/engine.py73465EA6BC603825D82AD189973BC534ACB2E428455576396550CFF3197A8A01Yes (hash differs; no signal/execution-logic change identified)
src/ictbt/config.py31AE46637F13A2F34BE82868FF3C5A3D9E0C0C1F2FF39BA056B77391EC32B139Yeseq_tf, ob_max_age default 0→2500, htf_enabled 8h/2h swap
src/ictbt/compact_report.pyA222C585ADB388D03EB59F2F3AD948ADB49325BFEE2A3010717C74ED8DC29A91Yes (hash differs; no reporting-logic change identified)
src/ictbt/account.py6A4A918E7BBDA6B4CF992764E16B96709CD28134C7B50AF98523A1A7CCEBFF16No — byte-identical to the v3.62 run
scripts/export_compact_report.pyAD03D3ABFD707D97536B24548D89F837B866581F2C971818DE5D0B30E6DE52EAYes (hash differs; _v373_ filename-default tag only, per source at §11.1)
scripts/verify_compact_report.py4AC4E56C91E2E2FEEDE8FBACDCC4814848A682740B21EDC661C4252F03D23779Yes (hash differs; not independently diffed line-by-line)
Pine reference IndicatorPineScript.txt5D91438B10E4103D286FEB481DEC34BF92C459F9DD845E66DE1332877B175340Yes — v3.63 through v3.73, see banner above

engine.py's unchanged hash independently confirms §5's claim that execution/fills/sizing logic did not change between runs — a file whose logic genuinely didn't change produced the identical hash predicted, which is the same cross-check the v3.62 documentation used for account.py.

No immutable Git commit ID or source archive has been captured for this run (this project is not currently a Git repository). The workbook was written directly from the fresh signal replay and includes the contract-size warning, flat-cost sensitivity and 1%-of-equity same-trade-path sensitivity. The workbook's own hash (§ Document control, above) identifies this exact reported artifact. Before publication, archive the code, data, report and disclosure together under a versioned release. Do not silently replace files while retaining the same performance claim.

12. Known limitations

  1. Zero commission and zero slippage materially overstate executable returns.
  2. NQ bars proxy MNQ fills even though their order books differ.
  3. The $5/$10/$15 sensitivity is flat per position and does not scale with the run's 1–125 contract quantities or change fill prices.
  4. The 1% page rescales the accepted trade path but does not rerun signal and one-position-at-a-time eligibility under the changing account balance.
  5. No maximum-contract or margin cap prevents impractically large positions.
  6. Minute OHLCV cannot reconstruct tick order, spread or depth.
  7. Stops and targets fill at their exact level, including potential gap-through events.
  8. Continuous back-adjusted history is synthetic and omits roll execution.
  9. The best result was selected in sample after many comparisons — and this run demonstrates concretely that the selected "best" cell is not stable across cost assumptions (§8.4) or sizing method (§6.2).
  10. Strategy rules themselves were iterated using the same historical period, including the equilibrium and OB/RB reworks reflected in this run.
  11. Timeframe, RR, session and rating results are correlated, not independent.
  12. Drawdown uses closed-trade equity and excludes intratrade adverse excursion.
  13. Margin, liquidation, tax, financing, outages and operational errors are absent.
  14. No untouched out-of-sample or live broker record validates the selected configuration.
  15. A fresh full v3.73 Pine-versus-Python signal reconciliation remains pending; no TradingView log generated by this exact script version was supplied.
  16. The discretionary daily-bias/liquidity-draw/protected-stop checks described in §4.1 were not applied as a filter — every qualifying signal was traded identically regardless of whether a live trader would have taken it.

13. Pre-publication checklist

RequirementCurrent statusRequired action before performance-led listing
Dataset/source disclosedCompletePublish or retain this methodology with hashes.
Code/version disclosedPartialFreeze an immutable release/tag and archive it.
Markets/timeframes/period disclosedCompleteKeep beside the reported figures.
Fee/slippage assumptions disclosedFlat sensitivity complete; contract-aware case missingAdd intended-broker per-contract fees, size-dependent slippage and contract caps.
Sample size disclosedCompletePresent the full matrix, not only the winner.
Optimisation disclosedCompleteLabel the selected result in-sample/ex-post.
Out-of-sample validationMissingReserve new data or run a documented forward test before making robustness claims.
Pine/Python v3.73 reconciliationPendingExport fresh v3.73 TradingView logs and validate representative dates and all chart timeframes.
Independent/live auditMissingDo not describe results as audited, verified or actual.
Legal/platform reviewNot performedObtain review for the listing jurisdiction and platform.

14. Publication rule

Any backtested number from this run should be presented with the short disclosure in LISTING_BACKTEST_DISCLOSURE.md in immediate proximity, plus a direct link to this full methodology and the complete workbook. Do not publish only the 4-minute/3.0R winner without the zero-cost, flat-cost, position-size and optimisation disclosures — and, for this run specifically, without noting that the $15-cost and dynamic-risk views select a different cell.