A printable rule checklist in vanilla JS, with no build step
A prop firm rulebook is written in percentages. A trading platform shows dollars. The gap between those two units is where most evaluation failures happen, and it is a UI problem, not a discipline problem.
So the tool is small: pick a plan, enter an account size, get every limit in cash, printable. Everything below is the reasoning behind it — no framework, no build step, one file that still works when the network does not.
The conversion is one function, with a rule about rounding
const cash = (accountSize, pct) => Math.floor(accountSize * pct / 100);
Math.floor, not Math.round. If the true daily limit is $4,999.50 and you display $5,000, a trader can be stopped out and believe they were inside the rule. Rounding in the stricter direction is the only choice that cannot mislead, and it costs nothing.
The same logic applies to the profit target, except there the strict direction is upward — round the target up, so "you need $10,000" is never understated as $9,999.
Trailing floors are a state machine, not a number
This is the part a static table cannot express. On a trailing plan the floor moves with the peak, so the figure the trader needs is the distance from the floor right now:
function trailingFloor({ startBalance, peak, trail, locksAtBalance }) {
const moved = peak - trail;
// Many plans stop raising the floor once it reaches the starting balance.
return locksAtBalance ? Math.min(moved, startBalance) : moved;
}
locksAtBalance is one line of code and it is the difference between a plan that lets you build a cushion and one that follows you until payout. Two plans with identical headline percentages differ only here.
Missing data gets a state, not a default
Every checklist row is one of three things:
- a confirmed figure from a rulebook read on a stated date,
- an unconfirmed row, printed as an open question, or
- a derived figure computed from confirmed inputs.
const row = (label, confirmed, value, note) => ({
label,
state: confirmed ? 'confirmed' : 'unconfirmed',
value: confirmed ? value : null,
note,
});
The temptation is to delete an unconfirmed row so the checklist looks complete. That is how a checklist stops being a checklist. An open question — "does this plan trail intraday or only at settlement?" — is the most useful line on the page, because it is the one the trader has to answer before paying.
The working version, with plans read from firm documentation and figures left blank where the firm publishes none, is the rule checklist generator. It prints, it needs no account, and the row states are visible rather than hidden behind a tooltip.
Print CSS is the actual feature
The page exists to be carried into a session, so @media print is not decoration:
@media print {
.site-header, .cta-band, form button { display: none; }
.checklist li { break-inside: avoid; }
.checklist { font-size: 11pt; }
}
break-inside: avoid on each row matters more than it sounds: a limit split across two printed pages is a limit nobody checks. Hiding the call to action on paper is the difference between a worksheet and a flyer.
Why vanilla, and where it costs you
Three reasons, in order of how much they mattered:
- It has to work offline. A rules checklist opened on a laptop during a news event should not depend on a CDN.
- It is one screen of state. A framework would be more code than the feature, and harder for the next person to audit — which matters when the correctness of the arithmetic is the product.
- No build step means no supply chain. Nothing to update, nothing to install, nothing that breaks at 03:00.
The cost is real: no reactivity, so every input handler re-renders the list by hand, and the state lives in a plain object that you have to keep coherent. At this size that is cheaper than the alternative. It stops being cheaper around the point you need URL-shareable state, which the embedded calculator does and this one does not.
The one thing to copy
If you take nothing else: convert the unit before the trader is in the position. A 5% daily limit on a $100,000 account is $5,000. Someone down $3,900 with an open position is not thinking in percentages, and "I still had 1.1% left" is not a thought anybody has while watching a losing trade. The rule was known; it was just in the wrong units.
Which rule breaks first, once the units line up, is covered one at a time at prop firm rules explained — daily loss and maximum loss are the two that end most evaluations, and they are the two that are easiest to misread as the same rule when one trails and the other does not.
Top comments (0)