Projects

Quantitative engineering · Private

EUR/USD Core B

I tested six years of EUR/USD against its own noise; what survived became a bot — and every decision was stamped before I saw the result.

The parity gate between the Python research and the C# bot, animated from the gate's own report.

The video shows the parity gate over a backtest from 2025-07-01 to 2026-07-08: 57 trades, 57 identical, on the exact bar. It's not a statistical sample — it's case-by-case equality. The bot runs on a demo account, not real money.

The method

Decisions stamped before the result

Six years of EUR/USD data, minute by minute. Before looking at any result, I would write down the approval criterion and record it: if the number doesn't clear this bar, the idea dies. That removes my chance to move the goalposts after seeing the score — the most common and quietest way to fool yourself in quantitative research. Out-of-sample validation on rolling windows, and several hypotheses I liked were discarded by that process.

The discovery

The bars weren't opening where I thought

All the research assumed a four-hour bar starts at 00:00, 04:00, 08:00 and so on, in universal time. Measuring the broker's platform, they opened at 02:00, 06:00, 10:00 — anchored to the New York close. And they moved twice a year with US daylight saving. The same holds for gold, so it's a property of the platform, not of the pair. A strategy validated on one set of bars isn't the same strategy running on another: the bot now builds its own bars from the one-hour chart, which always opens on the round hour and doesn't suffer that shift.

The proof

I wrote the strategy twice

Once in Python, to research. Once in C#, to execute on the platform. Two languages, two environments, two sets of assumptions — and no guarantee they do the same thing. So I built a test that runs both over the same period and requires every trade to appear on both sides, on the same bar, with the same side, the same market regime and the same exit reason. It came to 57 trades and 57 exact matches, none of them needing the one-bar tolerance the test allowed. The bar aggregator was checked separately: 1,643 bars rebuilt, zero differences. The bot has been on a demo account since July, under a monitoring protocol defined before switching it on.

If you got this far, send a message.

Even if just out of curiosity. I reply on LinkedIn or by email.