A trader passes the evaluation. Target hit, drawdown never breached, every rule respected. Then the payout request comes back refused, because one day carried 46% of the total profit and the firm's consistency rule allows 40%.
That is not a bug in their paperwork. It is two rules measuring unrelated things, and one of them is silently a filter.
The rule, stated precisely
Most prop firms express the consistency rule as a ratio:
largest single day's profit / total profit <= cap (cap is typically 0.25 - 0.6)
The subtlety is what this expression is a function of.
- The pass decision is a function of the equity path: did you reach the target before the floor?
- The consistency cap is a function of the shape of the profit, not its size.
You can reach the target and still be ineligible. You can be wildly profitable over six weeks and still be ineligible, if the profit arrived in one afternoon. Nothing about the way you reached the target protects you from the second check, because the second check never looks at the path — only at the concentration.
Measuring how often that actually happens
I ran 50,000 simulated $50,000 accounts against a static $2,500 drawdown and a $6,000 target, one trade per day, up to 80 days. The generator produces normal days for the most part, with 6% of days outsized — a fat right tail, because real trading profit is not gaussian.
Result: 39,155 of 50,000 accounts passed (78.31%).
Then I applied the consistency cap to the accounts that had already passed:
| Consistency cap | Passes that violate it | Effective pass rate | Extra profit needed (median) |
|---|---|---|---|
| 25% | 38,400 of 39,155 (98.1%) | 1.51% | $6,343 |
| 30% | 37,416 of 39,155 (95.6%) | 3.48% | $4,162 |
| 40% | 30,475 of 39,155 (77.8%) | 17.36% | $1,727 |
| 50% | 15,448 of 39,155 (39.5%) | 47.41% | $737 |
| 60% | 3,130 of 39,155 (8.0%) | 72.05% | $213 |
Read the 40% row again. Nearly four fifths of the accounts that passed are ineligible to be paid under a cap of 40%.
And the control run matters just as much: with the same drawdown, the same target and the same 50,000 accounts, but no outsized days, violations at a 40% cap = 0.
That contrast is the whole insight. The rule does not bite on ordinary trading. It bites exactly when a trader has one very good session — which is the thing a discretionary trader most wants to happen.
Why the naive simulation misses this
If you backtest a challenge by asking "did equity reach the target before the floor", your model returns a single bit. The consistency rule needs a second, orthogonal output: the distribution of the daily contributions to the total.
That distinction is easy to get wrong, and I got it wrong the first time I built this. My first version produced zero violations at every cap from 25% to 60%, which I read as "the rule is harmless." The real cause was a generator bug: my winning days were small relative to the target, so the largest day was never more than 13% of the total. The rule looked harmless because the data could not possibly violate it.
If you are testing whether a rule hurts, you have to make sure your generator can violate it. Otherwise you have measured nothing.
The code
The pass decision and the eligibility check are separate functions. Only the second one needs the daily series.
// PASS DECISION: only needs the equity path.
function simulate(days, mode, cfg) {
const closedOnly = mode === 'trailing_closed' || mode === 'trailing_lock';
let eq = cfg.start, peak = cfg.start;
const floor = () => {
if (mode === 'static') return cfg.start - cfg.dd;
const f = peak - cfg.dd;
return mode === 'trailing_lock' ? Math.min(f, cfg.start) : f;
};
for (let i = 0; i < days.length; i++) {
const d = days[i];
if (!closedOnly) {
const up = eq + d.high;
peak = Math.max(peak, up);
if (up <= floor()) return { out: 'BREACHED', at: 'high', day: i + 1 };
const dn = eq + d.low;
if (dn <= floor()) return { out: 'BREACHED', at: 'low', day: i + 1 };
}
eq += d.close;
peak = Math.max(peak, eq);
if (eq <= floor()) return { out: 'BREACHED', at: 'close', day: i + 1 };
if (eq - cfg.start >= cfg.target) {
return { out: 'PASSED', day: i + 1, days: days.slice(0, i + 1) };
}
}
return { out: 'OPEN' };
}
// ELIGIBILITY: a pure function of the daily P&L series. No path, no equity.
function consistencyViolation(dayPnl, cap) {
const total = dayPnl.reduce((a, b) => a + b, 0);
const worst = Math.max(...dayPnl);
return worst / total > cap; // true = cannot be paid
}
function extraProfitNeeded(dayPnl, cap) {
const total = dayPnl.reduce((a, b) => a + b, 0);
const worst = Math.max(...dayPnl);
// solve worst / (total + x) = cap -> x = worst/cap - total
return Math.max(0, Math.ceil(worst / cap - total));
}
Then the measurement is a filter over the accounts that already passed:
const base = run('static', 50000, { seed: 20261013, bigP: 0.06 });
const passRate = base.passed.length / 50000; // 78.31%
for (const cap of [0.25, 0.3, 0.4, 0.5, 0.6]) {
const violators = base.passed.filter((r) =>
consistencyViolation(r.days.map((d) => d.close), cap)
);
const effective = (base.passed.length - violators.length) / 50000;
console.log(cap, violators.length, effective.toFixed(4));
}
effective is the number that matters and it is not the pass rate. It is the probability that an account both reaches the target and remains payable.
Diluting the violation, and what it costs
The standard remedy is not to stop trading. It is to keep trading until the offending day is a smaller share of a larger total. The arithmetic is one line:
largest_day / (total + x) = cap => x = largest_day / cap - total
For the violating accounts in the 40% bucket, the median extra profit required is $1,727 — on a $50,000 account with a $6,000 target, that is roughly another 29% of the target in profit, produced under the same drawdown constraint that just tried to kill the account.
That is the real cost of the consistency rule: not a rejection, but a forced extension. You are still trading, your floor is still rising if the drawdown trails, and you now need to manufacture additional profit specifically to dilute a number, with no risk budget set aside for it.
What I would actually do with this
-
Track the ratio continuously, not at payout. If
largest_day / running_totalis above the cap, you know before you submit. Most platforms show the daily breakdown; the calculation is a division. - Decide the dilution trade size deliberately. If you need $1,727 more to clear a 40% cap, that is a target, not a vibe. Size it as you would any other target, against the room you have left.
- Do not confuse the two failure modes. A drawdown breach is a path failure. A consistency violation is a distribution failure. Different causes, different fixes. Software that models only one of them will tell you that you are fine when you are not.
- Check the cap on your specific firm, because 25% and 60% are different sports. The 25% row above — 98.1% of passes ineligible — is a genuinely different experience from the 60% row at 8.0%.
Where this model is wrong
- One trade is not one day. I collapsed a day into a single trade for tractability. A real day contains many trades, and the intraday peak matters for trailing drawdowns in a way a daily aggregate cannot represent.
- Profit is not the only input. Several firms apply consistency to lots, trade count or session, not just dollars. The shape of the constraint changes; the independence from the pass decision does not.
-
The generator's fat tail is a choice.
6% of days outsizedis a modelled assumption, not a measurement of your trading. The control row (zero violations with no outsized days) exists precisely to show how much the answer depends on that assumption. - Deterministic seed. Every figure above comes from one fixed seed, so runs are reproducible but not an ensemble. The point estimates carry unquantified sampling error.
The consistency rule is usually described as a rule about consistency. In the model it is better described as a filter applied after the challenge has already been cleared, on a property — profit concentration — that the challenge never tested.
If you want to run these numbers against your own rulebook rather than the one I modelled, the prop firm consistency rule guide covers how the caps are written across the major firms and where the definitions quietly differ.
Top comments (0)