Static vs. Trailing Drawdown in Prop Firms Explained
Drawdown is the mechanic that ends more evaluations than anything else. But 'drawdown' means two structurally different things depending on the firm, and the difference changes how a strategy should be sized from day one.
Breach the drawdown limit and the evaluation fails, regardless of how much total profit sits on the account. The part that trips traders up isn't the concept — it's that "drawdown" is calculated completely differently depending on the firm, and each version demands a different approach to position sizing.
Static drawdown
A static (fixed) drawdown is measured against the account's starting balance and never moves. A 50k account with a $2,000 static drawdown can lose up to $2,000 from that original $50,000 — no matter how much profit has been made since, the floor stays at $48,000.
- Start: $50,000
- Static drawdown: $2,000 → floor fixed at $48,000
- Account grows to $54,000 in profit → floor is still $48,000
- Real cushion above the floor is now $6,000, not $2,000
That's more forgiving than it first sounds: as equity grows, the gap between current balance and the static floor widens, giving genuinely more room to absorb a losing streak.
Trailing drawdown
A trailing drawdown follows the account's highest equity peak. Every new high moves the floor up with it — locking in that progress, but shrinking the effective cushion back down to the original limit.
- Start: $50,000
- Trailing drawdown: $2,500 → initial floor $47,500
- Equity peaks at $51,000 → floor moves to $48,500
- Equity peaks again at $53,000 → floor moves to $50,500
- A $2,501 pullback from that $53,000 peak now lands at $50,499 — below the floor, evaluation failed
Intraday vs. end-of-day trailing
This detail is where trailing-drawdown accounts differ from each other the most. Some firms trail on intraday equity — the account's highest tick-by-tick value during the session, including open positions. Others only trail on end-of-day (EOD) closed equity.
| Drawdown type | What moves the floor | Relative risk |
|---|---|---|
| Static | Nothing — the floor is fixed | Lowest |
| Trailing (EOD) | Closed P&L at end of session | Medium — unrealized swings don't count |
| Trailing (intraday) | Highest tick-level equity, including open trades | Highest — unrealized gains move the floor |
Apex Trader Funding uses intraday trailing drawdown. A position that runs up $500 on paper and then gives it back to flat has already cost $500 of cushion, even though the trade itself broke even — the floor moved the instant equity touched that peak. That makes intraday trailing the most demanding version for a strategy that lets winners run before closing them.
Which firms use which drawdown type
| Firm | Drawdown type | Notes |
|---|---|---|
| Apex Trader Funding | Intraday trailing | Moves with unrealized intraday gains |
| Topstep | EOD trailing | Only moves on closed trades at end of day |
| TradeDay | Trailing | Tracks peak account value across sessions; source doesn't confirm EOD vs. intraday |
| FundedNext | Static | Fixed from account start, most forgiving of the group |
| MyFundedFutures | Static | Explicitly and repeatedly stated as never trailing |
How this changes strategy design
Intraday trailing accounts (Apex)
Treat every unrealized gain as a liability. A position that runs +15 points before the profit target fires has already raised the floor, whether or not the trade eventually closes flat. That argues for:
- Tighter profit targets relative to the stop — don't let winners run so far that they raise the floor before closing
- Avoiding wide internal trailing stops, since they extend how long a position stays "up big" before locking anything in
- A daily loss kill switch around 40% of the trail — on an intraday floor, a bad sequence can close the gap faster than expected
EOD trailing accounts (Topstep)
There's more room to let a position breathe intraday. A trade that runs up, gives it back, and closes flat doesn't permanently raise the floor the way it would on an intraday account. The real risk shifts to a single bad day that closes well below where the floor currently sits. See our Topstep evaluation guide for contract sizing built around that EOD structure.
Static drawdown accounts (FundedNext, and cautiously TradeDay)
This is the most forgiving structure for a systematic strategy. As equity grows, the effective cushion above a fixed floor grows with it — rewarding a strategy that compounds steadily rather than punishing it for the variance that comes with normal trading.
Simulating drawdown type in a Pine Script backtest
Add these variables to any backtest to see how a given drawdown type would have actually tracked the account:
equityPeak— the highest equity value reached across all barscurrentDrawdown—equityPeak - strategy.equitydrawdownLimit— the evaluation's maximum allowed drawdown- Flag every bar where
currentDrawdown >= drawdownLimitto count how many times the account would have failed
This matters most for intraday trailing accounts — EOD and static accounts are far less sensitive to intrabar equity spikes.
Drawdown type simulator — Pine Script
An original indicator that plots how each drawdown type would have tracked the same equity curve. Switch the input to compare an intraday trail, an EOD trail, and a static floor side by side on one backtest.
//@version=5
indicator("Drawdown Type Simulator", overlay = false)
// ── settings ─────────────────────────────────────────────────────────
ddType = input.string("Intraday Trailing", "Drawdown Type",
options = ["Intraday Trailing", "EOD Trailing", "Static"])
ddLimit = input.float(2500.0, "Max Drawdown ($)")
startBal = input.float(50000.0, "Starting Balance ($)")
// ── equity proxy — swap for strategy.equity inside a real strategy ────
equityProxy = startBal + ta.cum(close - close[1])
var float peak = startBal
var float floor = startBal - ddLimit
var float eodPeak = startBal
isNewSession = ta.change(time("D")) != 0
if ddType == "Intraday Trailing"
peak := math.max(peak, equityProxy)
floor := peak - ddLimit
else if ddType == "EOD Trailing"
if isNewSession
eodPeak := math.max(eodPeak, equityProxy[1])
floor := eodPeak - ddLimit
// Static: floor never recalculates — stays at startBal - ddLimit
// ── breach flag ─────────────────────────────────────────────────────
breached = equityProxy <= floor
bgcolor(breached ? color.new(color.red, 85) : na, title = "Breach Zone")
plot(equityProxy, "Equity", color = color.blue, linewidth = 2)
plot(floor, "Floor", color = color.red, linewidth = 2)
plot(peak, "Peak", color = color.green, style = plot.style_circles)