Our daily loss limit was lying to us — a measurement

We run a small MT5 stack with a 1 % daily loss cap. It had been in place for months and we trusted it.

Replaying our own history, a day where every stop gaps at its instrument’s 99th percentile reaches 13.84 % of equity. Not 1 %.

The cause is simple once you see it: the limit counts the stop, not the jump through it. The governor admits a new entry while realized loss plus open stop-risk stays under the cap — and neither term knows what a gap does. So the day keeps admitting entries right up to the line, and then the gaps arrive.

Lowering per-trade risk does not fix it. At 0.25 % risk the bad day lands at 0.980 % after 9 entries; at 0.01 % risk it lands at 0.981 % after 121. Same place. The cap is the constraint, not the size.

One more thing that surprised us: minute bars understate gaps badly. Measured against tick quotes on gold, the bar-derived figure is about a quarter of the real one, and on a scheduled release the difference is larger still. If you have ever sized a gap from bar data, it is worth re-checking on ticks.

We rebuilt the control. Same replay, same formula, same configuration: 0.753 %. It shipped with 81 tests, and 12 of 12 deliberately reverted defects were caught.

To be clear about what this is not: this is risk, not edge. Our live book is 60 trades and negative. We have not found an edge and I am not claiming one.

If anyone has measured their own worst gapped day against their cap, I would like to compare numbers.

The cap that matters is the one your account is judged on, so measure that rather than planned stop risk. Prop-firm style rules usually measure daily loss on equity, so floating loss counts and not only closed trades. Gap and slippage losses are not in the stop-risk arithmetic, which is why your replay overshoots. Use HistoryDealsTotal and HistorySelect from the day's server-time start to rebuild a realised curve, add AccountInfoDouble(ACCOUNT_ EQUITY) sampled on every tick or at least every few seconds, and record the worst equity versus the day's starting balance or equity, whichever your firm uses. For the control, close or block new trades at a soft limit well under the hard one, for example 60-70% of it, so that a gapped stop still lands inside the rule. Also log the fill price minus the stop price on every stop-out, per instrument. Its 95th and 99th percentile gives you the real gap allowance, and tick data will show a bigger number than minute bars, as you found.
This is why I wouldn't take a "1% daily loss limit" at face value. What matters most is how it holds up when execution gets ugly. The 0.753% replay result is encouraging, but how does the rebuilt control handle gaps beyond the historical assumptions? That's where I'd want to see the next test

Whether your live strategy is currently profitable is a separate issue here. Controlling risk and proving an edge are different jobs, and improving one doesn't automatically solve the other.

Hey Mohamed,

i have it not measured in a replay. But, I have one real data point, and it matches yours. 

On a prop account I ran EAs with stops set so that the planed loss stayed inside the daily limit. It worked for about 1,5 years. Then one forex pair opened with a big gap, far past the stops, and the positions were closed at the first price. The limit was 5 %, the day ended round about at roughly 7%. 

What made it worse: a grid EA was running on the same account with open positions, so part of the daily room was already used by floating loss before the gap came. The gap didn´t have to do it alone. 

So yes, the limit counted the stops, not the jump, and not what else was open. Your "the cap is the constraint, not the size" is exactly what i learned that day.

And thanks for being upfront that the live book is negative. Thats rare here, and it makes the risk part easier to trust. 

Cheers,
Chris

Does your system use pending orders? If so, one extra replay case would be worth testing: the daily lock activates just as an existing pending order fills.

Check that the control catches the resulting position, confirms which cancellations and closes actually succeeded, and keeps entries blocked until the daily reset. Several pending orders filling together would also test whether their combined risk was reserved before they triggered.

This checks a separate failure path from slippage through the SL; it doesn’t solve the gap risk itself.