# DAX trend pullback to the Fibonacci 61.8% level (a YouTube day-trading strategy) - specification (RIP Backtest protocol v1.0 plus the 8 Oct 2026 rules)

Specification written and **frozen 2026-11-07**, approved in advance by the owner the same day ("scrie sa fa si testul": write it and run the test). It was written before any EMA, Fibonacci level, signal or trade of this test was computed. Once frozen, any change of a rule is documented and treated as a separate test; bugs may be fixed.

## Why this test, and what was looked at before
- **The source:** chosen by the owner on 2026-11-07. It is the YouTube video "Easy Trend Day Trading Strategy DAX | Top-Down Analysis to Sniper Entries" (channel Mindfully Trading, December 2025, about 3,100 views); the owner pasted its transcript.
- **What the video does:** it shows one long trade on the DE40 (DAX CFD) that the presenter says she **did not take**. Its steps:
  - **daily:** price above the 50 and 200 EMA, the 50 above the 200, and a green background from an RSI inside her paid indicator, whose rule is not shown;
  - **1-hour:** a "change of behaviour" (a close above the last structural high); a new high of the day above the previous day's high; the 50 EMA above the 200;
  - **15-minute:** a Fibonacci drawn on candle bodies from the most recent pullback low to the current high, with a **buy limit at the 62% level** (the top of her 62/70/79% "optimum trade entry" zone);
  - **trade:** a **50-pip stop** (50 index points) and a **2R target** (100 points), in the London morning.
- **What we test:** our mechanical reading of those steps, below. The paid indicator's RSI cannot be reproduced and is **left out**; its other parts (the two EMAs) are kept.
- **Earlier work:**
  - **DAX file:** the DAX 15-minute opening range breakout (same day, four variants, all Buried). That is the only earlier use of the file, so the holdout has been **used once**.
  - **Fibonacci pullbacks on other markets:** the 61.8% pullback on EUR/USD 1-hour and Fibonacci scalping on ES, both Buried. With them the Fibonacci family has more than four variants, so the development bar is **t >= 2.5**.
  - No number of this strategy has been computed.

## Data
- **Files:** the DAX 1-minute HistData files and clock reading of `orbd_spec.md` and `dax_data.js`, unchanged:
  - Frankfurt time, Xetra cash session 09:00 to 17:29;
  - Xetra holidays and the 20 unclear days of 2019 not traded;
  - prices never filled.
- **Daily bars:** the cash session. The daily close is the close of the last minute at or before 17:29.
- **1-hour bars:** the cash-session hours 09:00, 10:00, ..., 17:00, the last one 30 minutes long.
- **15-minute bars:** 09:00-09:14, 09:15-09:29, and so on.
- A bar's open, high, low and close come from the minutes it contains. A bar with no minute does not exist.
- **Difference from the video:** her chart (TradingView DE40) also has overnight hours. Our EMAs use the cash session only, the same in every year of the file.

## Rules (long; shorts mirrored in the long-and-short variant)
1. **Daily trend**, from the previous trading day's close: close > EMA(50) > EMA(200), with the EMAs on daily closes. A day needs 200 earlier daily closes, so the first trades come late in 2011.
2. **Trigger:** the first 15-minute bar ending between 09:15 and 12:00 whose **close is above the previous trading day's high** (the highest minute high of its cash session).
3. **1-hour trend at the trigger:** on the last completed 1-hour bar, EMA(50) > EMA(200). If it fails, there is no trade that day.
4. **Fibonacci anchors at the trigger, on candle bodies of today's 15-minute bars from 09:00 to the trigger bar:**
   - **H** = the highest body top, max(open, close), the first bar if it ties;
   - **L** = the lowest body bottom, min(open, close), among the bars from 09:00 to the bar of H.
   - No trade if H - L <= 0.
5. **Entry:** a **buy limit at E = H - 0.618 x (H - L)**, from the minute after the trigger bar until 13:59 (the end of the London morning). It fills in the first minute whose low is at or below E, at E, or at the minute's open if it opens below E. If it is not filled by then, the order is cancelled.
6. **Exit:**
   - **stop E - 50** and **target E + 100** points (2R);
   - in the fill minute only the stop is checked;
   - in later minutes, a level the minute opens beyond fills at its open; otherwise the stop, if touched, is taken before the target;
   - if neither is hit, the trade closes at the close of the last minute at or before 17:29.
7. **Limits:** one trade a day at most, one CFD of 1 euro a point.
8. **Shorts (DFIB-LS only):**
   - daily close < EMA(50) < EMA(200);
   - a 15-minute close below the previous day's low;
   - 1-hour EMA(50) < EMA(200);
   - H and L mirrored: the lowest body bottom, then the highest body top before it;
   - a sell limit at L + 0.618 x (H - L), stop +50, target -100.
   - On a day where both sides could trigger, the earlier trigger is taken.
9. **Variants:** **DFIB-L** (long only, as in the video) and **DFIB-LS**. R is 50 points.

## Costs
- **2.0 index points per round trip**, as in the DAX opening range test. Scenarios with 1.0 and 3.0, reported but not gated.
- Results in index points and R. No financing: every trade closes the same day.

## Periods, gates, control
- **Periods (by trade date):**
  - development 2011 to 2018;
  - validation 2019 to 2022;
  - holdout 2023-01 to 2026-10-30, **used once before** (the DAX opening range test).
- **Six gates per variant**, in points per trade:
  1. validation profit factor >= 1.2;
  2. at least 50 trades in each period;
  3. development **t >= 2.5**;
  4. above the 95th percentile of the control;
  5. positive without the 10 best trades;
  6. holdout net positive (flagged as used).
  
  A variant with fewer than 30 trades is Inconclusive.
- **Control (moved entries):**
  - Each eligible day carries either "no trade" or its trade's fill minute and direction. An eligible day is one with a previous trading day and 200 daily closes before it.
  - The list is moved, all together, by one random circular offset of at least 5% of the eligible days.
  - On each real day a market order is placed at the open of the moved minute (or of the first minute after it, if it is missing), in the moved direction, with the same 50-point stop, 100-point target, 17:29 exit and costs.
  - 500 runs, seeds 1000 + run. Statistic: the average net points per trade.
  - It asks whether the setup picks better days and times than the same entries on other days.
- **Missing minutes (rule 3):**
  - A trade is flagged if a minute is missing between its trigger and its exit (17:29 for trades held to the close).
  - Every gate and verdict is recomputed without flagged trades. If the verdict changes, the result is Inconclusive.
- **Also reported:**
  - triggers, orders, fills and the fill rate;
  - exit reasons;
  - the win rate with its Wilson interval;
  - points and R before and after costs;
  - longs and shorts, results by year;
  - the cost scenarios.

## Engine and self-test (before the run)
New code:
- `dfib_lib.js`: daily, 1-hour and 15-minute bars, EMAs and the rules, using the minutes of `dax_data.js`;
- `dfib_ref.js`: an independent re-implementation, using the independent minute loader of `orbd_ref.js`;
- `dfib_selftest.js`. It checks:
  1. EMAs against a hand calculation;
  2. hand-built days: the trigger and its window, the anchors on bodies, the limit fill (at the level, at a lower open, not filled by 14:00), the stop and target, both in one minute, the stop only in the fill minute, the 17:29 exit, a missing minute, a short;
  3. engine against reference, trade by trade, for both variants on the real data;
  4. the control at offset 0 reproducing the real trades.

## Before the article
Results go to the owner first. One article, published only with the owner's agreement, and not on the same day as the DAX opening range article.

## Reading the result
"Buried" or "Inconclusive" mean a convincing edge was not demonstrated; neither is proof that none exists. This is our mechanical reading of a discretionary method; the presenter's own choices on the chart could differ.

### Run log
- 2026-11-07: frozen (owner: "scrie sa fa si testul"). sha256 of this file above the "### Run log" heading: 807ec441531304e61704216a640da7357159806257a94fa4b65f9e7c993af263.
- 2026-11-07, before the run: self-test item 4 reads "the control at offset 0 reproducing the real trades", but the control (as the Control paragraph specifies) uses market orders at the open of the moved minute, so at offset 0 its prices differ from the limit fills. The self-test therefore checks that the control at offset 0 enters on the same days, minutes and directions as the real trades. No rule changed.
- 2026-11-07: dfib_selftest.js PASSED on its first run (engine = independent re-implementation, 402 and 537 trades, the same day counts by stage), and again on the final code. dfib_run.js -> dfib_out/: both variants Buried (DFIB-L 1/6, DFIB-LS 2/6); gross negative before costs; control percentiles 9.0 and 0.6 (worse than the same entries on other days); rule 3 changes no verdict. No rule was changed.
- 2026-11-07: the owner asked for the article ("Da, scrie-l"). Written from the outputs of the single run, unchanged, to be published on 2026-11-09, the day after the DAX opening range post.
- 2026-11-07, after the run, DATA ERROR: the HistData GRX/EUR file holds prices at Euro Stoxx 50 level, not DAX, from 2020-06-15 to 2023-12-01 (891 trading days: 11,930 on 12 Jun 2020, then 3,138 on 15 Jun; 4,416 on 1 Dec 2023, then 16,412 on 4 Dec). The coverage and clock checks before the run did not look at price levels. Every result that uses those days is invalid as a DAX result; the 2011-2018 development period is not affected. Nothing of this test has been published. Next step, with the owner: a rerun on the DAX days only, documented here. (It explains why the long-only version had no trade in 2021: the 200-day EMA mixed the two price levels.)
- 2026-11-07, RERUN after the data error (owner: "Da, rulează-le"): the 891 weekdays 2020-06-15 to 2023-12-01 are not used. Because a 200-day EMA cannot run across a gap of three and a half years, the daily and 1-hour EMAs restart after any gap of more than 100 calendar days (only this one) and need 200 values again, so the first trade after the gap can come on 2024-09-17. (A first try with a 20-day threshold also cut at the March 2019 unclear-clock weeks; the self-test caught it before the run.) No rule of the strategy changed and the period dates are kept: validation 2019-01-02 to 2020-06-12, holdout 2024-09-17 to 2026-10-30 in effect. The self-test gained a segment and level check and PASSED with 0 differences. Results (dfib_out/): DFIB-L 327 trades, avg -6.29 points (gross -4.29), 0/6 (validation now has 42 trades); DFIB-LS 391, avg -7.00 (gross -5.00), 0/6; holdout -309 points for both; control percentiles 4.6 and 2.0; rule 3 changes no verdict. Both stay Buried. The first run's outputs, invalid as DAX, are kept in dfib_out_v1_invalid/.
- 2026-11-09, before publication: a review of the article found that both implementations (dfib_lib.js and dfib_ref.js, the latter also written by us) measured the stop and the target from the fill price, while rule 6 sets them at E - 50 and E + 100 (E = the limit level). They differ on the trades that filled through the limit (98 of 327 long, 125 of 391 long-and-short). Fixed in both as a bug; the self-test gained a check that separates the two readings and passed; the test was run again (the previous outputs are kept in dfib_out_v2_fillbase). DFIB-L: -6.29 -> -5.32 points a trade after costs (gross -4.29 -> -3.32), control percentile 4.6 -> 8.8; DFIB-LS: -7.00 -> -6.91 (gross -5.00 -> -4.91), percentile 2.0 -> 2.0. Both still Buried 0/6. The article reports the corrected run. Same review: wording fixes (early fills, the L anchor, the 2012 start of the long trades, the OTE levels, the FAQ's control, the epitaph, the Europe page description).
