Skip to content
Backtest Results

Index Gap-and-Go (S&P 500)

Dukascopy Tick Data · OOS 2022–2026 · IS 2017–2022 · commission included

Buy the S&P 500 CFD at the 09:30 ET open when it gaps up 0.4-0.5% or more over the previous session's close, stop at that close, flat by 15:55 ET. Profitable in every in-sample year 2017-2021 (PF 1.49, +$2,807 on 181 trades); out of sample 2022-2025 it made $111 on 169 trades (PF 1.02).

USA500_CUSTOM · C1

Does not hold up
$10k → $10.1k
+$111 net profit
Win Rate: 52.66% · PF: 1.016 · Max DD: 8.43%

USA500_CUSTOM · C2

Does not hold up
$10k → $10.4k
+$397 net profit
Win Rate: 52.53% · PF: 1.043 · Max DD: 7.74%

Strategy Rules

Reference close = close of the last completed M1 bar of the PREVIOUS regular session at or before 15:59 ET (on a half-day that is the 12:59 ET bar; the previous session is the most recent weekday that has a 09:30 ET bar). Never the 20:xx/overnight CFD prints.
At the open of the 09:30 ET M1 bar (DST-adjusted from server UTC), gap% = (bar open - reference close) / reference close * 100.
If GapMinPct <= gap% <= GapMaxPct: enter LONG at market immediately on that 09:30 bar's open (no confirmation bar; the vendor data shows a quarter of all fills happen in the first 5 minutes, so waiting hands the edge to the faders).
One trade per session; no entries after 09:31 ET; skip sessions without a 09:30 ET bar (index holidays) and sessions whose previous session has no 15:30-15:59 ET bars.
NONE in the candidate. The short leg (gap-DOWN >= GapMinPct -> sell at the 09:30 open, stop at the reference close, same exits) is pre-registered as an ABLATION run on IS only, controlled by EnableShortLeg=true, to report the asymmetry (spec-time scan: gap-down shorts lose; see notes.md). It is never part of the optimized candidate and never runs on OOS.
Stop-loss = the reference close (a full gap fill = thesis falsified). Structural, no ATR stop: the gap IS the risk unit, so percent-risk sizing is 1R = gap size.
Take-profit: TakeProfitR x the gap size above entry when TakeProfitR > 0; TakeProfitR = 0 means no target (ride to the time exit). The spec-time scan favoured no target.
Time exit: flatten at 15:55 ET if ExitAtNoon=false, or at 12:00 ET if ExitAtNoon=true. Hard safety: if a position is still open at 16:30 ET or later for any reason (half-day session, missing bars), close it on the next tick — never hold across the CFD rollover (index swap: USA500 -1.726/lot/night, US30 -12.0, USTEC -6.8), never carry a weekend.
GapMaxPct (default 4.0, not optimized) skips limit-up style opens where the stop distance is absurd; the scan had almost no such days in IS.
Regular US cash sessions only; skip half-days entirely if the EA cannot detect the 13:00 ET close (simplest: skip the session after Thanksgiving, Christmas Eve, and July 3 when they fall on weekdays; document the list in the EA).

Backtest Parameters

In-Sample Window2017.01.01 – 2022.01.01
Out-of-Sample Window2022.01.01 – 2026.01.01
Data SourceDukascopy tick data (real ticks)
Starting Capital$10,000
Risk per Trade1.0% of equity
Commission$3.50/side/lot (IC Markets Raw, modeled)
OOS Runs Consumed2

Methodology

Genetic optimization on the in-sample window with a net-of-costs robustness criterion; parameter-plateau selection (top candidates must have profitable neighborhoods, not just a best pass); out-of-sample window run once per frozen candidate on real ticks; verdicts gated on net profit factor, drawdown, and IS-to-OOS retention.

Key Takeaway

The in-sample edge was real on its own data: a pre-registered measurement found +0.15R per trade (t 2.3) before any EA was built, and the backtest reproduced it trade for trade. It did not survive the holdout: the strongest failed gate is out-of-sample profit factor (1.02 against the 1.15 minimum), profit came only from 2022, and the $5-per-side cost stress turns both candidates into losses of $4,578 and $6,645. Large gap-ups stopped continuing after 2022. Index CFDs are modeled spread-only (no commission) with the 0.75-point spread subtracted from every trade; all figures carry the M1-OHLC asterisk because indices have no tick feed.

Disclaimer: Past performance is not indicative of future results. These backtest results are based on historical data with realistic commission assumptions. Real trading involves additional risks including execution delays, variable spreads, and emotional decision-making.