One EA, two brokers, two different decisions — the day I stopped blaming the spread
2 September 2026, 17:03
0
30
This morning the same Expert Advisor, with the same inputs, made two different decisions on two live accounts. One took the trade. The other skipped the day. Same symbol, same minute, same code.
My first suspect was the spread. It usually is. So I wrote a small logger that samples the spread every five seconds and let it run for a full session: 3115 samples, mean 200 points, maximum 200 points, and not a single sample above the EA's own guard. The spread was innocent, completely.
The real reason was duller and far more interesting. The two brokers quote this index for a different number of hours per day. One of them opens at 03:31 server time, the other starts several hours later. My EA has a day filter that asks a simple question - how far has the market already travelled today - and it read the answer from the daily bar. But the daily bar is not the same object at two brokers. At the broker with the longer session it already contained hours of overnight movement; at the other one it did not. Same formula, same threshold, different input, different decision.
This is a whole class of bug, and it is invisible in a backtest. Anything your EA reads from a broker AGGREGATE - a D1 or W1 bar, "today's range", ATR on daily, server midnight, daily pivots - carries a hidden assumption about how many hours that broker quotes your symbol. Two accounts, same code, different behaviour, no error message anywhere.
So I measured how much it actually costs. On 13.8 years of minute data I ran the same filter logic with the trading day starting at 00:00, 02:00, 03:31, 06:00, 08:00, 09:00 and 10:00 server time. The result was a plateau: quality was flat for every opening hour from 00:00 to 09:00, and dropped by roughly a third only when the night was removed entirely. The lesson transfers to anyone: it is not the exact opening hour that matters, it is whether the symbol is quoted overnight at all.
That measurement also killed my two first instincts. Rewriting the filter to ignore the night would have cost a third of its value. Switching brokers would have fixed nothing, because the spread was never the problem. What was actually broken was neither the formula nor the broker - it was that the EA knew something important and never said it.
Because here is the part that stings. The line explaining the skip existed in my code all along. It was hidden behind a debug flag, off by default. For two days I had a robot that was working exactly as designed and looked completely broken, and the answer was sitting in a Print statement nobody could see.
So the fix went into the product instead of into the strategy. From version 1.03 my EA prints every skip reason unconditionally, once per day, with the actual number in it. And at startup it prints a data passport: the trading hours of your symbol, how much of the session your chart history covers, and a loud warning if the symbol has no night session at all - because now I know exactly what that costs.
If you write EAs, steal the rule, not the code: any decision that results in NO trade must be visible without a debug flag. Your user cannot read your source. All they see is a robot doing nothing, and silence is the most expensive answer you can give them.
Quartz DAX on the Market: https://www.mql5.com/en/market/product/192954
Live monitoring: https://www.mql5.com/en/signals/2389115


