> ## Documentation Index
> Fetch the complete documentation index at: https://tbignite.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Drawdown scenarios

> Step-by-step examples with the numbers filled in - every drawdown type, with and without a daily limit, plus locking, breach mechanics, and swing.

Step-by-step examples with the numbers filled in, one chart each. Use this to look things up: find the setup that matches the account in front of you, and read what the system does with it.

> [!NOTE]
>
> **How to read each one.** Every example repeats its **Setup** in full, so you can jump straight to one and have everything you need. **The check** is the literal comparison the system performs, with the numbers filled in. **What the system does** is the resulting behavior, including the account status it sets. For the rules behind any of it, see [How drawdown & failure work](https://tbignite.mintlify.site/drawdown-and-failure.md).

> [!WARNING]
>
> **Every amount here is illustrative.** These numbers demonstrate the rules - they are not live product settings. For a real account, read the values from its [phase configuration](https://tbignite.mintlify.site/challenge-phases.md).

Every account starts at **\$50,000**, and **equity** means `balance + unrealized P&L` - a number that sits *above* balance while an open position is in profit, and below it while that position is losing.

Example IDs follow the configuration: **S** static · **I** trailing (intraday) · **L** locking · **E** end of day · **SD / ID / ED** the same three *with a daily limit* · **DH / DD** daily-limit hard and disabled · **B** breach (The moment an account crosses one of its loss limits.) mechanics · **W** swing (The account may hold positions overnight instead of being closed out at the session end.).

## Static, max drawdown only

**Configuration.** Global drawdown type (Which maximum-loss rule the account uses: a fixed limit, or a trailing limit that moves up as the account makes new highs.) `Static` · Global DD threshold \$2,000 · Initial balance \$50,000 · Check daily drawdown **off**.

**Floor.** Initial balance 50,000 - 2,000 = **\$48,000**, fixed for the life of the account - and with the daily rule switched off it is the only line that can fail any of these four accounts. ([how this works](https://tbignite.mintlify.site/drawdown-and-failure.md#static))

### S1 · Equity dipping to 47,999 fails it; the day's 51,000 close never counts

![S1](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/S1.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=91405eb17df9fa9fcd98300563ad5498)

S1 - Equity dipping to 47,999 fails it; the day's 51,000 close never counts.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Static |
| Global DD threshold | \$2,000 |
| Initial balance | \$50,000 |
| Check daily drawdown | Off |

The initial balance of \$50,000 is the anchor the floor is measured from, and on a Static account it never moves. 50,000 - 2,000 → **Failure threshold \$48,000**, fixed for the life of the account. With `Check daily drawdown` off there is no second floor, so that single line decides everything below.

**What happens.** The session opens flat at \$50,000 - nothing is open, so balance and equity are the same number. A position moves against the trader and equity slides to \$49,200, then reaches \$47,999 at 11:00, one dollar under the threshold. That tick fails the account, and the flatten leaves it holding nothing. The chart's line carries on past 11:00 - up through \$49,500 and on to \$51,000 - but from 11:00 that line is the market's path, not the account's. Had the position still been on, equity would have recovered to \$49,500 and the day would have closed flat at \$51,000 in both balance and equity, a thousand above where it started. The account held nothing from 11:00, so it reached neither number.

**The check.** On every tick, `equity <= Failure threshold`:

| Time | Equity | Failure threshold | Result |
| - | - | - | - |
| Open | 50,000 | 48,000 | false |
| Mid-morning | 49,200 | 48,000 | false |
| 11:00 | **47,999** | 48,000 | **true → fail** |
| Afternoon | 49,500 | 48,000 | never evaluated - already failed |
| Close | 51,000 | 48,000 | never evaluated - already failed |

**Current balance** is \$50,000 for the whole descent, because the loss is sitting in an open position; it is not the value being compared. The chart then carries the balance line on to \$51,000 at the close, and that step is counterfactual too - the account was flat from 11:00, so \$51,000 is a balance it could never have realized.

**What the system does.**

1. Fails the account at 11:00, on the tick where equity reaches \$47,999 while **Current balance** is still \$50,000. Status → `FAILED`.
2. Flattens all open positions and cancels all working and pending orders.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$47,999.00 has reached or fallen below the failure threshold of \$48,000.00, so trading is no longer allowed on this account.
4. Does **not** run a daily check. `Check daily drawdown` is off on this account, so \$48,000 is the only live floor and the stored daily amount is ignored entirely. Do not generalise that into "the daily rule never matters once max drawdown breaches": had the daily rule been on here, the outcome could have changed. A valid config requires the daily amount to be smaller than the \$2,000 max drawdown, so on a session opening at a \$50,000 balance the daily floor sits **above** \$48,000 - a \$1,000 daily limit puts it at \$49,000, which equity crosses on this very slide, somewhere between \$49,200 and \$47,999. On the way down the higher floor is reached first, and a soft daily breach there ends the session for the account without failing it. That is [SD1](https://tbignite.mintlify.site/drawdown-scenarios.md#static-with-a-daily-limit), not this scenario. Max drawdown being evaluated first is a **same-tick** rule: it decides the outcome only when one tick crosses both floors at once.
5. Does **not** move the Failure threshold, in either direction. On Static it is \$48,000 from the first tick of the account's life to the last.
6. Does **not** reactivate - not at the close, not at the next session open. `FAILED` is terminal, so there is no resume time to state.
7. Treats the 11:00 breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** Two implementations get this wrong, for two different reasons. Evaluating the account on its closing figure passes it, because the day would have closed at \$51,000 in both balance and equity - but the account failed at 11:00 and held nothing after, so that close is a number it could never reach. Evaluating on **Current balance** passes it too: the realized balance never left \$50,000 on the way down, since the whole loss was unrealized. The check reads equity, and it reads it on every tick.

### S2 · The open loss fails the account; the realized balance never does

![S2](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/S2.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=f95c1a16b32014dc7eca407a12a963ab)

S2 - The open loss fails the account; the realized balance never does.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Static |
| Global DD threshold | \$2,000 |
| Initial balance | \$50,000 |
| Check daily drawdown | Off |

The initial balance of \$50,000 is the anchor the floor is measured from, and on a Static account it never moves. 50,000 - 2,000 → **Failure threshold \$48,000**, fixed for the life of the account. This account has already spent most of that room: its realized balance is \$48,500, exactly \$500 clear of the threshold.

**What happens.** **Current balance** is \$48,500 and stays there for every tick of this path - nothing is closed, so nothing is realized. One position is open and drifting against the trader. Equity starts level with balance at \$48,500, then falls to \$48,300, \$48,100 and \$47,900 as the unrealized loss deepens to \$600. The fourth tick is where the account fails, and the path ends there.

**The check.** Equity is `balance + unrealized P&L`, and equity is the only value compared with the threshold:

| Tick | Current balance | Unrealized P\&L | Equity | Failure threshold | Result |
| - | - | - | - | - | - |
| 1 | 48,500 | 0 | 48,500 | 48,000 | false |
| 2 | 48,500 | -200 | 48,300 | 48,000 | false |
| 3 | 48,500 | -400 | 48,100 | 48,000 | false |
| 4 | 48,500 | **-600** | **47,900** | 48,000 | **true → fail** |

**Current balance** is 48,500 on all four rows and never gets closer than \$500 to the threshold. The account still fails on row 4, because the check runs on equity.

**What the system does.**

1. Fails on the tick where equity reaches 47,900, while **Current balance** is still 48,500. Status → `FAILED`.
2. Flattens the open position and cancels all working and pending orders.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$47,900.00 has reached or fallen below the failure threshold of \$48,000.00, so trading is no longer allowed on this account.
4. Does **not** wait for the position to be closed. The \$600 unrealized loss counts from the moment the market prints it, not from the fill that realizes it.
5. Does **not** compare **Current balance**, realized P\&L, or closed-trade P\&L with the threshold. None of those ever crosses \$48,000 here, so an account evaluated on any of them looks healthy right up to the moment it fails.
6. Does **not** revise the verdict based on where the liquidation fills. If the flatten fills badly and the realized **Current balance** settles below \$47,900, the account is still failed on the \$47,900 equity touch - see [B2](https://tbignite.mintlify.site/drawdown-scenarios.md#breach-mechanics).
7. Treats the tick 4 breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** Recomputing equity only on fills. A system that revalues the account when a trade closes, rather than on every tick, never sees equity at 47,900 at all: the position is still open, **Current balance** is still 48,500, and nothing looks wrong. Holding a loser open does not postpone a breach. The same arithmetic runs the other way too - an open winner puts equity **above** balance, which on a Static account only widens the gap to the floor, but on a Trailing account raises the floor. (Trailing here means the intraday-trailing type, whose anchor is peak equity including unrealized. On an End of day account an unrealized gain moves nothing; only a new closing balance can raise that anchor.)

### S3 · Landing exactly on the floor fails the account; it is not a near miss

![S3](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/S3.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=810117fc0217c7d626640382b1ce373f)

S3 - Landing exactly on the floor fails the account; it is not a near miss.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Static |
| Global DD threshold | \$2,000 |
| Initial balance | \$50,000 |
| Check daily drawdown | Off |

The initial balance of \$50,000 is the anchor the floor is measured from, and on a Static account it never moves. 50,000 - 2,000 → **Failure threshold \$48,000**, fixed for the life of the account.

**What happens.** The account opens the session flat, so balance and equity are the same number: \$50,000, a full \$2,000 clear of the threshold. A losing position is opened and held. Equity falls steadily - \$49,400, then \$48,800, then \$48,300 - while the balance stays at \$50,000, because none of that loss has been realized. Equity then comes to rest on \$48,000 exactly. It does not pass through the threshold; it lands on it.

**The check.** The comparison is `equity <= Failure threshold`, and equity is the value compared - never balance, which is still \$50,000 on every one of these ticks. One character decides this scenario:

| Tick | Balance | Equity | Failure threshold | `equity <= threshold` | `equity < threshold` |
| - | - | - | - | - | - |
| 1 | 50,000 | 50,000 | 48,000 | false | false |
| 2 | 50,000 | 49,400 | 48,000 | false | false |
| 3 | 50,000 | 48,800 | 48,000 | false | false |
| 4 | 50,000 | 48,300 | 48,000 | false | false |
| 5 | 50,000 | **48,000** | 48,000 | **true → fail** | false → no breach raised, wrongly |

Every figure is dollars. The balance column reads \$50,000 on all five rows because the flatten has not run yet at the moment of the check; it is the equity column that fails the account.

The last column is the wrong implementation, shown so it can be spotted when checking an account: it agrees with the correct one on every other example in this group and differs only on an exact touch.

**What the system does.**

1. Fails on the tick where equity reaches \$48,000 exactly. Status → `FAILED`. Max drawdown is always a hard breach: terminal, with no reactivation at any later session open.
2. Flattens all open positions and cancels all working and pending orders. That flatten realizes the \$2,000, which is why the balance line drops from \$50,000 to meet equity at \$48,000 on the final tick of the chart. Here the liquidation fills at the floor exactly; had it filled worse, the closing balance would settle below \$48,000 and the verdict would be identical - the breach is the touch that started the flatten, not the price the flatten happened to fill at.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$48,000.00 has reached or fallen below the failure threshold of \$48,000.00, so trading is no longer allowed on this account. The wording is "reached or fallen below" precisely because the two amounts can be equal.
4. Does **not** treat the exact touch as a warning, a near miss, or a grace state. There is no band above the threshold in which an account is merely watched.
5. Does **not** apply a tolerance. Equity of \$48,000.00 breaches; nothing is rounded away and no cents are handed back.
6. Treats the \$48,000 breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** Writing the comparison as `equity < threshold`. It behaves identically on every other example in this group and diverges only here, where equity sits exactly on \$48,000: the strict comparison returns false, no breach is raised, the account is left running when it should already have been failed and flattened, and everything derived from that tick onwards - status, failure time, and any figure check against them - is wrong. The same bug in a different costume is comparing rounded dollars, or subtracting a small epsilon to "avoid false positives". Reaching the threshold is the breach.

### S4 · The floor never rises with profit, so an 11,500 loss still survives

![S4](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/S4.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=1f39c49ab2acf25d727fbe1896881a34)

S4 - The floor never rises with profit, so an 11,500 loss still survives.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Static |
| Global DD threshold | \$2,000 |
| Initial balance | \$50,000 |
| Check daily drawdown | Off |

The initial balance of \$50,000 is the anchor the floor is measured from, and on a Static account it never moves. 50,000 - 2,000 → **Failure threshold \$48,000**, fixed for the life of the account. This account has traded well and holds no position, so its **Current balance** and its equity are the same \$60,000 on day 1, and its real room is `60,000 - 48,000` = **\$12,000 of equity** - six times the \$2,000 threshold held in the phase.

**What happens.** The account is up \$10,000 and holds no position on any of these five days, so **Current balance** and equity are the same number the whole way through. It gives the profit back day by day: \$57,500, \$54,000, \$51,000, and \$48,500 by day 5 - \$11,500 of equity lost in total. Equity never reaches \$48,000.

**The check.** The threshold is a constant here; only equity moves:

| Day | Equity (= Current balance, account flat) | Failure threshold | `equity <= threshold` | Equity room left |
| - | - | - | - | - |
| 1 | 60,000 | 48,000 | false | 12,000 |
| 2 | 57,500 | 48,000 | false | 9,500 |
| 3 | 54,000 | 48,000 | false | 6,000 |
| 4 | 51,000 | 48,000 | false | 3,000 |
| 5 | **48,500** | 48,000 | false | **500** |

**What the system does.**

1. Nothing, on any of the five days. There is no status change and no partial-breach state: nothing is flattened, nothing is cancelled, and day 5 ends with \$500 of equity still above the Failure threshold.
2. Does **not** raise the Failure threshold as equity climbed to \$60,000. The anchor is the initial balance, so day 5's threshold is the same \$48,000 the account was opened with.
3. Does **not** lower it either. Nothing in the losing run moves that line.
4. Does **not** cap any individual session. `Check daily drawdown` is off, so there is no second floor: the same \$11,500 of equity lost inside one session would give the identical result, because \$48,000 is the only value being tested. That is the unbounded single-session loss property of Static without a daily limit.
5. Would fail on the next \$500. From day 5's \$48,500 of equity, the first tick at or below \$48,000 would be a max-drawdown breach, handled exactly as in S1 - flatten, cancel, `FAILED`. Nothing on this chart reaches it.

**Common mistake.** Reading the Global DD threshold as the trader's allowance for today. On a Static account in profit the real allowance is `equity - Failure threshold`: \$12,000 on day 1 here, \$500 on day 5, never the \$2,000 stored in the phase. A risk view built on the \$2,000 figure shows this account as one bad session from failing when it is six such sessions away, then shows it as comfortable on day 5 when it is \$500 of equity away. The mirror-image error is assuming the floor followed the profit up to \$58,000 - on Static it does not move at all. Capping each session is what `Check daily drawdown` is for; the drawdown type will not do it.

## Trailing (intraday), max drawdown only

**Configuration.** Global drawdown type `Trailing` · Global DD threshold \$2,500 · Lock trailing drawdown **off** · Check daily drawdown **off**.

**Floor.** Peak equity - 2,500, where peak equity is the highest equity the account has ever reached - updated on every tick and **including unrealized profit**. It moves up on a new high and never moves back down. ([how this works](https://tbignite.mintlify.site/drawdown-and-failure.md#trailing-intraday))

### I1 · Unrealized profit raises the floor, and giving it back fails the account

![I1](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/I1.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=cca132bf2678784f5b7b8140a5c360e0)

I1 - Unrealized profit raises the floor, and giving it back fails the account.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Trailing (intraday) |
| Global DD threshold | \$2,500 |
| Lock trailing drawdown | Off |
| Check daily drawdown | Off |

The account is fresh and has never traded, so peak equity (the anchor the floor is measured down from) is seeded at its \$50,000 opening balance and the **Failure threshold** is 50,000 - 2,500 = **\$47,500**. Peak equity is a stored lifetime high, never re-derived from where a session happens to open - an account carrying an earlier high would begin the day with a higher threshold than this one. It is recomputed on every tick as the greater of itself and current equity, and equity includes unrealized P\&L, so profit on a position that is still open moves it. The threshold follows the peak up and never moves back down.

**What happens.** The account opens the session flat, so balance and equity are the same number: \$50,000, with the threshold at \$47,500. A position runs into profit - equity \$50,900 at 10:30, lifting the peak to 50,900 and the threshold to \$48,400, then equity \$52,000 at 11:00, lifting the peak to 52,000 and the threshold to **\$49,500**. None of that profit is banked: the position is still open, so **Current balance is still \$50,000**. The position then reverses - equity \$51,000 at 13:00, equity \$50,000 at 14:00 (flat on the day), and equity \$49,400 at 15:00. That is \$2,600 of equity handed back from the \$52,000 equity high, against a \$2,500 threshold.

**The check.** Peak equity is updated first, then `equity <= failure threshold` is tested - on every tick. Every figure in the table below is equity; Current balance is \$50,000 on every one of these rows, because nothing has been realized yet:

| Time | Equity | Peak equity | Failure threshold | `equity <= threshold` |
| - | - | - | - | - |
| 09:30 | 50,000 | 50,000 | 47,500 | false |
| 10:30 | 50,900 | 50,900 | 48,400 | false |
| 11:00 | **52,000** | 52,000 | **49,500** | false |
| 13:00 | 51,000 | 52,000 | 49,500 | false |
| 14:00 | 50,000 | 52,000 | 49,500 | false |
| 15:00 | **49,400** | 52,000 | 49,500 | **true → fail** |

**What the system does.**

1. Fails the account at 15:00, on the tick where equity reaches 49,400. Status → `FAILED`.
2. Flattens all open positions and cancels every working and pending order. Nothing is left on the account: no position, no resting order, no partial exposure.
3. Rejects every order submitted afterwards. The stated reason is the max-drawdown breach itself - equity of \$49,400 reached the failure threshold of \$49,500. It is a failure and not a suspension, so the reason carries no resume time: there is no session at which this account comes back.
4. Raises the peak **before** it compares. On the tick where equity reaches 52,000 the threshold becomes 49,500 immediately, and that same equity is tested against the new value - so a new high can never fail an account, because the threshold always lands a full \$2,500 below it.
5. Does **not** move the threshold back down as equity falls away from 52,000. Peak equity stays 52,000 and the threshold stays 49,500 for the life of the account.
6. Does **not** wait for the loss to be realized. The comparison is on equity, and equity reached 49,400 while the position was still open. Current balance was still \$50,000 at the moment of the breach; it only steps down to \$49,400 as the flatten fills, which is why the balance line drops to meet equity at the last point on the chart. On a fast move those liquidation fills can land worse than the threshold, which changes the ending balance and not the verdict.
7. Runs no daily check. **Check daily drawdown** is off - and even with it on, the max-drawdown breach returns before the daily branch is reached.
8. Treats the 15:00 breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** Two implementations get this wrong. Tracking the peak on **Current balance** misses the breach entirely: balance never rose above \$50,000 at any point, so a balance-based peak stays at 50,000, leaves the threshold at \$47,500, and passes an account that has already failed. And measuring the loss from the session open says the trader is down \$600 of equity against a \$2,500 threshold - comfortable, and wrong. The measurement runs from the \$52,000 equity peak, and from there it is \$2,600.

### I2 · No breach, but the round trip leaves the account closer to failing

![I2](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/I2.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=d60ef11feba562c1ec55ebc9ec7392ac)

I2 - No breach, but the round trip leaves the account closer to failing.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Trailing (intraday) |
| Global DD threshold | \$2,500 |
| Lock trailing drawdown | Off |
| Check daily drawdown | Off |

The account opens the session flat at \$50,000 - no open position, so Current balance and equity are the same number - and peak equity (the anchor the threshold is measured down from) starts at \$50,000, making the **Failure threshold** 50,000 - 2,500 = **\$47,500**. Peak equity is the highest equity the account has ever reached, recomputed on every tick as the greater of itself and current equity, and equity includes unrealized P\&L - so profit on a position that is still open raises it. The threshold follows the peak up and never moves back down.

**What happens.** The session opens with balance and equity both \$50,000 and the threshold at \$47,500. A position runs into unrealized profit: equity \$50,600 at 10:30, lifting peak equity to 50,600 and the threshold to \$48,100, then equity \$51,000 at 11:30, lifting peak equity to 51,000 and the threshold to **\$48,500**. None of that profit is banked - the position is still open, so **Current balance is \$50,000 the whole time**. The position then hands it all back: equity \$50,600 at 13:30, then \$50,000 at 15:00, where it is closed at the price it was opened. Commissions aside, the round trip realized nothing, so the account ends the session flat with balance and equity both \$50,000 - exactly where it started. Equity never came near the threshold, so nothing breached. What did change is the threshold itself: it began the day \$2,500 below equity and ends it \$1,500 below.

**The check.** Peak equity is updated first, then `equity <= failure threshold` is tested - on every tick:

| Time | Current balance | Equity | Peak equity | Failure threshold | `equity <= threshold` |
| - | - | - | - | - | - |
| 09:30 | 50,000 | 50,000 | 50,000 | 47,500 | false |
| 10:30 | 50,000 | 50,600 | 50,600 | 48,100 | false |
| 11:30 | 50,000 | **51,000** | 51,000 | **48,500** | false |
| 13:30 | 50,000 | 50,600 | 51,000 | 48,500 | false |
| 15:00 | 50,000 | 50,000 | 51,000 | 48,500 | false - no breach all session |

**What the system does.**

1. Fires no breach on any tick. Equity never reached the Failure threshold, so no failure is recorded and no trading state is written - neither `FAILED` nor `DONE_FOR_DAY`. (`DONE_FOR_DAY` is the engine's trading state on a soft daily breach, not a value the Accounts grid exposes - and **Check daily drawdown** is off here, so it is not in play at all.) Nothing is flattened, nothing is cancelled, no order is rejected, and the account keeps trading - for the rest of this session and into the next.
2. Raises peak equity **before** it compares. On the 11:30 tick peak equity becomes 51,000 and the threshold becomes \$48,500 in the same step, and equity is then tested against that new value - which is why a new equity high can never breach an account: the threshold always lands a full \$2,500 below it.
3. Does **not** move the threshold back down as equity falls to \$50,600 and then \$50,000. Peak equity stays 51,000 and the threshold stays \$48,500. A trailing threshold moves in one direction only.
4. Carries peak equity across the session close. The close routine rolls the closing balance into the next session's starting balance and zeroes the day's realized P\&L and commissions; it does not touch peak equity. The next session opens with peak equity \$51,000 and the Failure threshold still \$48,500 - the \$1,000 of room this round trip consumed does not come back overnight.
5. Leaves \$1,500 between equity and the line, not \$2,500. The account is flat, so balance and equity are both \$50,000; a further \$1,500 of loss puts equity at 48,500, and `48,500 <= 48,500` is true - that fails the account. Before the trade the Failure threshold sat at 47,500, so the same \$2,500 **Global DD threshold** left \$2,500 of gap - a \$2,500 loss would have put equity at 47,500, and `47,500 <= 47,500` fails it just the same. The trade made no money and took \$1,000 of that gap.
6. Runs no daily check - **Check daily drawdown** is off, so the Failure threshold at \$48,500 is the only line in play and nothing else caps what this session can lose.

**Common mistake.** Recomputing the threshold from current equity - `current equity - 2,500` - instead of from peak equity. It agrees with the correct value on every tick of the way up, because on a new high current equity *is* the peak, and then silently hands the room back on the way down: at 15:00 it puts the threshold at 47,500 where it should be 48,500. The related bug is resetting peak equity when the position is closed, or at the next session open. Peak equity is a high-water mark on equity, not a per-trade or per-session statistic, and the room this round trip consumed does not come back.

### I3 · With no new high the floor stays put, and reaching it fails the account

![I3](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/I3.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=eb117e91e77145ce7e4e7909d0e7ed87)

I3 - With no new high the floor stays put, and reaching it fails the account.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Trailing (intraday) |
| Global DD threshold | \$2,500 |
| Lock trailing drawdown | Off |
| Check daily drawdown | Off |

The account opens the session flat at \$50,000 - no open position, so balance and equity are the same number. Peak equity (the anchor the threshold is measured down from) therefore starts at \$50,000 and the **Failure threshold** is 50,000 - 2,500 = **\$47,500**. Equity never rises above \$50,000 at any point in this session, so the peak never moves and the threshold stays \$47,500 from the first tick to the last.

**What happens.** The session opens at \$50,000 and a single position moves against the account from the start. Equity falls to \$49,300 at 10:30, \$48,600 at 11:30, \$48,000 at 13:00, and \$47,500 at 14:00 - exactly the threshold. Because there was never a new equity high, the trailing threshold behaved as a fixed line at \$47,500 all session and the trader had the full \$2,500 of room available from the open. The whole loss is unrealized, so **Current balance is still \$50,000 on the tick that fails the account**; the realized balance only settles at \$47,500 once the flatten fills.

**The check.** Peak equity is updated first - it never changes here - then `equity <= failure threshold` is tested on every tick:

| Time | Equity | Peak equity | Failure threshold | `equity <= threshold` |
| - | - | - | - | - |
| 09:30 | 50,000 | 50,000 | 47,500 | false |
| 10:30 | 49,300 | 50,000 | 47,500 | false |
| 11:30 | 48,600 | 50,000 | 47,500 | false |
| 13:00 | 48,000 | 50,000 | 47,500 | false |
| 14:00 | **47,500** | 50,000 | 47,500 | **true → fail** |

**What the system does.**

1. Fails the account at 14:00, on the tick where equity reaches exactly \$47,500. Status → `FAILED`. The comparison is `equity <= threshold`, so landing exactly on the threshold is a breach, not a near miss.
2. Flattens all open positions and cancels all working orders.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$47,500.00 has reached or fallen below the failure threshold of \$47,500.00, so trading is no longer allowed on this account. The two figures being equal is the ordinary case for a touch, and the wording covers it.
4. Never moves the threshold. With no new equity high, a trailing account is exactly as forgiving as a Static account carrying the same \$2,500 threshold - not tighter. Trailing only costs the trader something once equity has been in profit.
5. Does **not** lower the threshold as equity falls. It is measured down from peak equity, never from current equity, so the \$49,300 and \$48,600 equity readings leave it untouched at \$47,500.
6. Runs no daily check - **Check daily drawdown** is off, so nothing ended the session before the full \$2,500 of equity room was gone.
7. Treats the 14:00 breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** Two wrong implementations. Using `<` instead of `<=` lets equity of exactly \$47,500 through: no breach fires at 14:00, so the account is never marked `FAILED` even though its equity reached the threshold it was supposed to fail on. And seeding peak equity from whatever equity happens to be visible when the check first runs - after a restart, or from the first tick of a partial window - anchors it at the \$49,300 equity reading instead of the \$50,000 opening equity, putting the threshold at \$46,800 and passing an account that has failed. Peak equity is a stored lifetime maximum, seeded from the account's opening balance and never re-derived from the data currently in front of you.

## Trailing with a lock

**Configuration.** Global drawdown type `Trailing` · Global DD threshold \$2,500 · **Lock trailing drawdown** on · Check daily drawdown off. The ceiling is Initial balance + **Max trailing DD limit**, and that offset is set per firm - sometimes per challenge - so it is read from the phase, never assumed.

**Floor.** `min(peak equity - 2,500, ceiling)` - it moves up with each new equity high until it reaches the ceiling, then stops for good and the account behaves like a Static one from there. ([how this works](https://tbignite.mintlify.site/drawdown-and-failure.md#locking-a-trailing-floor))

### L1 · A locked floor stops moving, but it still fails the account

![L1](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/L1.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=db943491d667125e887c99c172733e61)

L1 - A locked floor stops moving, but it still fails the account.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Trailing |
| Global DD threshold | \$2,500 |
| Lock trailing drawdown | On |
| Max trailing DD limit | \$100 |
| Initial balance | \$50,000 |
| Check daily drawdown | Off |

Ceiling = initial balance 50,000 + 100 = **\$50,100**, and the floor is `min(peak equity - 2,500, 50,100)`. This account's peak equity has already reached \$52,600 in an earlier session - exactly the level it takes to push a \$2,500 trailing floor all the way to that ceiling, since 52,600 - 2,500 = 50,100 - so the floor has locked: **Failure threshold \$50,100**, and it will never move again. Any peak equity of \$52,600 or more produces the same locked floor; below that figure the floor would still be trailing.

**What happens.** The session opens flat at \$51,200, so balance and equity are the same number there. The trader opens a position and it runs against them, taking equity to \$50,900, \$50,500, \$50,200 and then \$50,050. Current balance stays at \$51,200 the whole way down, because nothing has been closed - the entire \$1,150 of drawdown is unrealized equity until the breach flattens the position and realizes it, which is what brings balance down to \$50,050 as well.

**The check.** A locked floor is a constant, but it is still evaluated on every tick, `current equity <= failure threshold`:

| Tick | Equity | Failure threshold (locked) | Result |
| - | - | - | - |
| 1 - open | 51,200 | 50,100 | false |
| 2 | 50,900 | 50,100 | false |
| 3 | 50,500 | 50,100 | false |
| 4 | 50,200 | 50,100 | false |
| 5 | **50,050** | 50,100 | **true → fail** |

Equity finishes \$50 below the line here, but the depth is irrelevant: the comparison is `equity <= threshold`, so equity landing exactly on 50,100 would breach it just the same.

**What the system does.**

1. Fails the account on the tick where equity reaches \$50,050. Status → `FAILED`.
2. Flattens all open positions and cancels all working orders. That flatten is what moves Current balance from \$51,200 to \$50,050; it does not decide anything, because the verdict was already reached on equity.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$50,050.00 has reached or fallen below the failure threshold of \$50,100.00, so trading is no longer allowed on this account.
4. Does **not** consult Soft breach. That setting governs the daily floor only, and this configuration has Check daily drawdown off in any case. A max-drawdown breach is always a hard breach.
5. Does **not** unlock, lower or otherwise revise the floor. \$50,100 is the number that failed the account, and it stays \$50,100.
6. Treats the tick-5 breach at \$50,050 of equity as final. The flatten and cancel should leave the account holding nothing - no open position, no working order. If anything does survive, it does not reopen the question: the account had already failed at that moment, so no later fill, position, or balance movement is evaluated against it or can change the outcome.

**Common mistake.** Evaluating this account on Current balance passes it. The realized balance sat at \$51,200 - \$1,100 clear of the locked floor - right up to the breach, and only reached \$50,050 because the flatten itself realized the open loss. The check is on equity, always. The second error is reading "locked" as "no longer enforced": a floor that has stopped moving is still compared against equity on every tick, and here it is the only thing that fails the account.

### L2 · Just above the locked floor, nothing happens and trading continues

![L2](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/L2.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=f8a75d43519154fb4718484cba061b9e)

L2 - Just above the locked floor, nothing happens and trading continues.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Trailing |
| Global DD threshold | \$2,500 |
| Lock trailing drawdown | On |
| Max trailing DD limit | \$100 |
| Initial balance | \$50,000 |
| Check daily drawdown | Off |

Ceiling = initial balance 50,000 + 100 = **\$50,100**, and the floor is `min(peak equity - 2,500, 50,100)`. This is the same locked account as L1: peak equity has already reached \$52,600 at some earlier point - exactly what it takes to push a \$2,500 trailing floor down onto that ceiling - so the floor sits on the ceiling and stops there. **Failure threshold \$50,100**, fixed.

**What happens.** The session opens flat at \$51,200, where balance and equity are the same number. The trader opens a position, it runs against them, and equity works down through \$50,900, \$50,600 and \$50,300 to \$50,150 - \$50 above the locked floor. Nothing is closed on the way down, so Current balance stays at \$51,200 for the whole path. Where the path ends the position is still open: balance \$51,200, equity \$50,150, and the \$1,050 gap between the two is entirely unrealized loss.

**The check.** Same locked floor, same comparison on every tick, `current equity <= failure threshold`:

| Tick | Equity | Failure threshold (locked) | Result |
| - | - | - | - |
| 1 - open | 51,200 | 50,100 | false |
| 2 | 50,900 | 50,100 | false |
| 3 | 50,600 | 50,100 | false |
| 4 | 50,300 | 50,100 | false |
| 5 | 50,150 | 50,100 | false - equity 50,150 is above 50,100 |

**What the system does.**

1. Nothing. No breach means no status change, and there is no at-risk state to move into: no warning status, no flag and no partial restriction for being close to the floor. The one intermediate status the engine has, `DONE_FOR_DAY`, belongs to the daily floor, and this configuration has Check daily drawdown off - so it cannot fire here, and the only state other than trading normally that this account can reach is `FAILED`.
2. Leaves the open position alone and every working order in place. No flatten, no cancel.
3. Keeps accepting new orders.
4. Keeps the failure threshold at 50,100. It does **not** follow equity down - a trailing floor never moves down - and it cannot move up, because the ceiling has already stopped it.
5. Evaluates again on the next tick. With \$1,050 of unrealized loss still running against a \$51,200 balance, another \$50 of equity takes it to exactly 50,100, and `50,100 <= 50,100` fails the account.

**Common mistake.** \$50 of equity is the entire margin here, so anything that blurs the comparison flips a surviving account into a failed one: rounding equity to the nearest hundred turns 50,150 into 50,100 and fires the breach, and any tolerance band drawn around the threshold does the same. Compare the exact equity value against the exact threshold. The second error is treating "close" as an outcome - building a buffer that flattens or restricts an account some fixed distance above the floor. The engine has no such state; the only line is \$50,100. And note what "survives" means here: it is a statement about this tick, not about the session. The position is still open and \$1,050 of loss is still unrealized, so nothing in L2 makes the account safe.

### L3 · With a zero offset the floor locks at break-even; a loss below it fails

![L3](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/L3.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=9799d6f59c0daf0aa3d4c002163fb837)

L3 - With a zero offset the floor locks at break-even; a loss below it fails.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Trailing |
| Global DD threshold | \$2,500 |
| Lock trailing drawdown | On |
| Max trailing DD limit | \$0 |
| Initial balance | \$50,000 |
| Check daily drawdown | Off |

Ceiling = initial balance 50,000 + 0 = **\$50,000**, the starting balance itself. The floor is `min(peak equity - 2,500, 50,000)`. Equity has already reached \$52,500 or more in an earlier session - 52,500 - 2,500 = 50,000, so reaching that figure is enough and exceeding it is not required - and the trailing floor has therefore settled on the ceiling and locked there: **Failure threshold \$50,000**.

**What happens.** The session opens flat at \$50,900, where balance and equity are the same number, so the account is \$900 in profit and \$900 clear of its locked floor. The trader opens a position that runs against them: equity steps down to \$50,600, \$50,300 and \$50,100 - still \$100 of equity above the floor - and then to \$49,990, which is \$10 of equity below the starting balance. Note what those first three steps are: \$800 of loss, and not one of them breaches anything. A zero offset does not fail an account on *any* loss; it fails it on a loss that carries equity to or below \$50,000. Current balance holds at \$50,900 the whole way down, until the breach flattens the position and realizes the loss, taking balance to \$49,990 as well.

**The check.** `current equity <= failure threshold`, on every tick:

| Tick | Equity | Failure threshold (locked) | Result |
| - | - | - | - |
| 1 - open | 50,900 | 50,000 | false |
| 2 | 50,600 | 50,000 | false |
| 3 | 50,300 | 50,000 | false |
| 4 | 50,100 | 50,000 | false - \$100 of equity still above it |
| 5 | **49,990** | 50,000 | **true → fail** |

Every figure in the Equity column is equity. Current balance is \$50,900 on ticks 1 to 4 and is never the number compared.

**What the system does.**

1. Fails the account on the tick where equity reaches 49,990. Status → `FAILED`.
2. Flattens all open positions and cancels all working orders. The unrealized loss is realized here, so current balance falls from \$50,900 to \$49,990 and the account ends flat - balance and equity are both \$49,990.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$49,990.00 has reached or fallen below the failure threshold of \$50,000.00, so trading is no longer allowed on this account.
4. Does **not** spare the account because its realized balance was in profit for the whole move. \$50,900 of balance is not the number being checked; \$49,990 of equity is.
5. Does **not** reactivate at any point, and Soft breach has nothing to say about it - that setting applies to the daily floor only, and this configuration has Check daily drawdown off.
6. Treats the tick-5 breach at \$49,990 of equity as final. The flatten and cancel should leave the account holding nothing - no open position, no working order. If anything does survive, it does not reopen the question: the account had already failed at that moment, so no later fill, position, or balance movement is evaluated against it or can change the outcome.

**Common mistake.** Four of them, and they all ship:

* **Hardcoding the offset at \$100.** It is set per firm, and sometimes per challenge. With 100 assumed, this account's floor is computed at 50,100 and it fails a tick early - on tick 4 at \$50,100 of equity, instead of on tick 5 at \$49,990. Read **Max trailing DD limit** from the phase.
* **Failing the account on any adverse tick.** A locked break-even floor does not mean "no losses allowed". Ticks 2, 3 and 4 are all losing ticks, all of them leave equity above \$50,000, and none of them is a breach. The comparison is `equity <= 50,000` and nothing else.
* **Treating \$0 as "not configured".** A zero offset is a deliberate setting, not a missing one. If the lock is skipped because `0` reads as unset, the floor reverts to peak equity - 2,500 with no ceiling to stop it, so an account whose peak equity ran past \$52,500 is held to a floor above \$50,000 and fails earlier than the firm's rules allow.
* **Measuring the ceiling from the wrong number.** It is `initial balance + Max trailing DD limit`, and the initial balance is the one on the **phase**, which may differ from the parent challenge's. It is never measured from current balance, and never from peak equity.

### L4 · The floor still trails below the ceiling, so the account survives

![L4](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/L4.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=d64c83c263b66a56ff791ca2ae138bb8)

L4 - The floor still trails below the ceiling, so the account survives.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Trailing |
| Global DD threshold | \$2,500 |
| Lock trailing drawdown | On |
| Max trailing DD limit | \$100 |
| Initial balance | \$50,000 |
| Check daily drawdown | Off |

Ceiling = initial balance 50,000 + 100 = **\$50,100**, and the floor is `min(peak equity - 2,500, 50,100)`. Peak equity - the highest equity this account has ever reached, and the level the trailing floor is measured down from - is \$51,000, so the trailing term is the smaller of the two: 51,000 - 2,500 = **\$48,500**. That floor sits \$1,600 below the ceiling, so locking is configured but has not yet done anything. Peak equity would have to reach \$52,600 before the floor arrives at 50,100 and stops moving for good.

**What happens.** The session opens with equity at \$51,000 and current balance at the same \$51,000 - the account is flat, so the two agree - and 51,000 is also the highest equity it has ever reached. From there equity only falls: \$50,400, \$49,600, \$48,900, \$48,600. No new equity high is made, so peak equity stays at 51,000 and the floor stays at 48,500 for the whole path. Current balance holds at \$51,000 while the position is open and steps down to \$48,600 only at the last point, when the trader closes out and realizes the loss - that step is the trader's own close, not a flatten, because nothing breached. Equity crosses below the \$50,100 ceiling line at the third point and keeps falling, and none of that matters: the ceiling caps the floor, it is not a level equity is compared against.

**The check.** The floor is derived from peak equity on every tick and then capped by the ceiling. The comparison is `equity <= floor`:

| Tick | Equity | Peak equity | Floor = `min(peak - 2,500, 50,100)` | `equity <= floor` |
| - | - | - | - | - |
| 1 - open | 51,000 | 51,000 | min(48,500, 50,100) = 48,500 | false |
| 2 | 50,400 | 51,000 | min(48,500, 50,100) = 48,500 | false |
| 3 | 49,600 | 51,000 | min(48,500, 50,100) = 48,500 | false |
| 4 | 48,900 | 51,000 | min(48,500, 50,100) = 48,500 | false |
| 5 | 48,600 | 51,000 | min(48,500, 50,100) = 48,500 | false - \$100 of equity room left |

**What the system does.**

1. Nothing. No tick reaches the floor, so there is no breach: no status change, no flatten, no cancel. The step down in current balance at the last point is the trader closing the position, not the engine flattening it.
2. Holds the floor at 48,500 for the whole path. It does **not** follow equity down, and it does **not** move up, because no new equity high was made.
3. Keeps accepting orders. The account ends the session with equity \$100 above its floor, which is close - but "close" is not a state the system has. The only question it asks is `equity <= floor`.
4. Keeps trailing. If equity later makes new highs the floor steps up with them, and it stops moving for good only once peak equity reaches \$52,600 and the floor lands on the \$50,100 ceiling. From that point on the account behaves like a Static one.
5. Does **not** let the ceiling bind yet. The `min` is still evaluated on every tick - the ceiling is not a branch that switches on later - but 48,500 is the smaller number, so it changes nothing. With locking on and the floor still at 48,500, this account behaves exactly like an unlocked trailing account until the two meet.

**Common mistake.** Applying the ceiling as soon as **Lock trailing drawdown** is on. The rule is `floor = min(peak equity - threshold, ceiling)`, so the ceiling can only ever pull the floor **down** to it - it never lifts the floor up to it. An implementation that sets the floor to 50,100 the moment locking is enabled fails this account at the third point, on equity of 49,600, when that equity in fact had \$1,100 of room and the session ends with no breach at all. The same error dressed differently is comparing equity against the ceiling directly: equity spends the last three points of this path below \$50,100, and it means nothing.

## End of day, max drawdown only

**Configuration.** Global drawdown type `End of day` · Global DD threshold \$2,000 · Check daily drawdown **off**.

**Floor.** EOD peak balance - 2,000, where the EOD peak balance is the highest **closing** balance the account has reached. It is frozen for the whole session and still checked on every tick; at the close it moves up, but only on a new closing high, and it never moves down. ([how this works](https://tbignite.mintlify.site/drawdown-and-failure.md#end-of-day))

### E1 · The frozen floor is still checked live, and it fails at 11:00

![E1](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/E1.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=539d0caa1b77534703665c50fb763abd)

E1 - The frozen floor is still checked live, and it fails at 11:00.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | End of day |
| Global DD threshold | \$2,000 |
| Check daily drawdown | Off |

Day 1 ends flat, so its closing balance and its closing equity are the same number: \$51,000. That closing balance sets the EOD peak balance to \$51,000, and the floor is measured from there: \$51,000 - \$2,000 = **failure threshold \$49,000**. That threshold is fixed for the whole of day 2.

**What happens.** Day 2 opens flat at \$51,000 - balance \$51,000, equity \$51,000, the same number because nothing is open. The trader puts on a position that moves against them and holds it, so the loss stays unrealized: the balance sits at \$51,000 all morning and never crosses the floor. Equity, which carries the open loss, slides through \$50,200 and \$49,400 and reaches \$48,900 at 11:00 AM. The market then recovers through the afternoon, and on that price path alone the session would have ended at \$51,300 - but the account was flattened on the 11:00 tick and held nothing after it, so it never traded that recovery.

**The check.** On every tick, `current equity <= failure threshold`. Balance is not the input, which is the whole point of this scenario - here the balance never goes near the floor:

| Time | Current balance | Current equity | Failure threshold | Result |
| - | - | - | - | - |
| 09:30 | 51,000 | 51,000 | 49,000 | false |
| 11:00 | 51,000 | **48,900** | 49,000 | **true → fail** |
| 16:00 | 51,300 | 51,300 | 49,000 | never evaluated - already failed |

**Rows after the breach show where the market went, not where the account went.** The account was flattened at 11:00 and held nothing afterwards, so it never had those values. They are listed only because an implementation that evaluates on the closing balance would read them.

**What the system does.**

1. Fails the account at 11:00 AM, on the tick where equity reaches \$48,900. The balance is still \$51,000 at that instant and is not what is checked. Status → `FAILED`.
2. Flattens all open positions and cancels all working orders. That realizes the loss the \$51,000 balance had not yet reflected, and on a fast flatten the fills can land below the \$48,900 equity that triggered the breach. Neither figure changes the verdict - the breach is the touch, not the fill price.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$48,900.00 has reached or fallen below the failure threshold of \$49,000.00, so trading is no longer allowed on this account.
4. Does **not** run the close-of-session update `eod_peak_balance = max(eod_peak_balance, closing_balance)` for this account. There is no next session for a recomputed floor to apply to.
5. Treats the 11:00 AM breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** Evaluating this account on its closing balance passes it, because the line ends at \$51,300. It failed at 11:00 AM on equity and held nothing afterwards, so \$51,300 is a closing balance it could never actually have reached. Two things follow: the account must not be reported as passing, and the EOD peak balance must not move up to \$51,300 either - that figure was never a real closing balance for this account. The second mistake is reading `End of day` as "checked at the end of the day": the anchor is what moves once a day, while the \$49,000 threshold is evaluated on every tick from the open.

### E2 · Only the closing balance moves the floor, never an intraday high

![E2](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/E2.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=78a731fa8a867e79c9bf5a7e2f87b13f)

E2 - Only the closing balance moves the floor, never an intraday high.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | End of day |
| Global DD threshold | \$2,000 |
| Check daily drawdown | Off |

The highest closing **balance** the account has ever reached is \$50,000, so the EOD peak balance - the anchor the floor is measured down from - is \$50,000. `50,000 - 2,000` = **Failure threshold \$48,000**. That threshold is frozen for this whole session, and it is checked live against **equity** on every tick.

**What happens.** The session opens flat at \$50,000, so balance and equity are the same number. The trader opens a position that runs into profit: **equity** climbs to \$50,400 and peaks at \$50,750 around midday, while **Current balance** stays at \$50,000 - the entire \$750 gain is unrealized. The position then gives most of it back: **equity** \$50,300 with **balance** still \$50,000, the position still open. The trader closes it for a \$200 realized loss, and the session ends flat with **balance and equity both at \$49,800**.

**The check.** Two separate things happen in a session, and only one of them can move the anchor.

First, on every tick, `current equity <= failure threshold`:

| Point | Balance | Equity | Threshold | `equity <= threshold` |
| - | - | - | - | - |
| Open | 50,000 | 50,000 | 48,000 | false |
| Morning | 50,000 | 50,400 | 48,000 | false |
| Midday | 50,000 | **50,750** | 48,000 | false |
| Afternoon | 50,000 | 50,300 | 48,000 | false |
| Close | 49,800 | 49,800 | 48,000 | false |

The session's equity low is \$49,800, a full \$1,800 clear of the \$48,000 threshold. Nothing here is ever close.

Then once, at the close, the EOD peak balance is updated - and the closing balance is the only value offered to that comparison:

| Candidate | Amount | What it is | Used? |
| - | - | - | - |
| Intraday high | 50,750 | Equity, unrealized | No - not a balance, and not a close |
| **Closing balance** | **49,800** | Balance, realized | Yes - `max(50,000, 49,800)` = 50,000, unchanged |

**What the system does.**

1. Leaves the account trading normally. **Equity** never reaches the \$48,000 threshold at any point in the session, so there is no breach of any kind - nothing fails and the session is not ended early.
2. At the close, compares the closing **balance** of \$49,800 with the stored EOD peak **balance** of \$50,000 and keeps the larger. The peak stays \$50,000.
3. Carries the Failure threshold into the next session unchanged at \$48,000. It does not move up - the close was not a new closing high - and it does not move down, because a losing close never lowers the peak.
4. Never offers the \$50,750 **equity** high to that comparison. An End-of-day account that is **flat at the close** samples the realized **balance** at the close and at no other moment. (A swing account may hold a position across the boundary, so its carry reads closing **equity** instead - see [W1](https://tbignite.mintlify.site/drawdown-scenarios.md#swing-accounts).)
5. Opens the next session with a start-of-day **balance** of \$49,800. Day N's closing balance is always day N+1's starting balance, and because the account is flat at the boundary, opening balance and opening equity are the same \$49,800.

**Common mistake.** Feeding the session's high-water **equity** into the end-of-day update. That sets the peak to \$50,750 and the Failure threshold to `50,750 - 2,000` = \$48,750, \$750 higher than the rules allow - and in a later session it fails a trader whose **equity** is \$48,700 while they are comfortably inside their real limits. The \$50,750 was unrealized: it never reached **Current balance**, so no reading of balance contains it. The error is not symmetric, either. The opposite slip - letting the losing close of \$49,800 pull the peak **balance** down to \$49,800 - would drop the Failure threshold to \$47,800 and hand the trader \$200 of room they never earned.

### E3 · A losing close never lowers the floor, so five losing days still clear it

![E3](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/E3.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=00ca6487760d966186962d922ba625e2)

E3 - A losing close never lowers the floor, so five losing days still clear it.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | End of day |
| Global drawdown threshold | \$2,000 |
| Check daily drawdown | Off |

Day 1 closes at \$51,000 in balance. The account is flat at the close, so closing equity is the same \$51,000, and it is the highest closing balance the account has reached. That makes the EOD peak balance (the anchor the floor is measured down from) \$51,000, and the floor is `51,000 - 2,000` → **Failure threshold \$49,000**.

**What happens.** The next four sessions are all losing ones. The account is flat at every close, so each closing balance is also that session's closing equity: \$50,700, \$50,300, \$49,900, and \$49,500 on day 5. No closing balance is above \$51,000, so no close is a new high. The anchor moves only at a close, so the floor it produces holds the same value for the whole session; that value is still checked on every tick of every session in between - its value is fixed, its enforcement is not. Equity never reaches \$49,000 on any of the five days, so nothing breaches: day 5 closes \$500 clear of the floor and the account is still trading.

**The check.** At each close, `eod_peak = max(stored peak, closing balance)` - the realized balance, because a non-swing account is flat at the close, so here that closing balance is also the closing equity; and on every tick of every session, `equity <= failure threshold`:

| Day | Closing balance (= equity, flat) | New closing high? | EOD peak balance | Failure threshold | `equity <= threshold` |
| - | - | - | - | - | - |
| 1 | 51,000 | yes | 51,000 | 49,000 | false |
| 2 | 50,700 | no | 51,000 | 49,000 | false |
| 3 | 50,300 | no | 51,000 | 49,000 | false |
| 4 | 49,900 | no | 51,000 | 49,000 | false |
| 5 | **49,500** | no | 51,000 | **49,000** | false - no breach on any day |

The Failure threshold column is the point of the example: it reads 49,000 on all five days. It is never re-derived from the latest closing balance as 48,700, then 48,300, 47,900, 47,500.

**What the system does.**

1. Leaves the EOD peak balance at 51,000 through every losing close - `max(51,000, 50,700)` is 51,000, and so on down the column. The Failure threshold stays \$49,000 for all five sessions, so each losing day leaves the account with less room than the day before: day 2 opens with \$2,000 of balance above the floor, day 3 with \$1,700, day 4 with \$1,300, and day 5 with \$900. The room shrinks because the balance falls while the threshold does not.
2. Never fails the account. The lowest equity on this run is day 5's close at \$49,500, \$500 above the \$49,000 Failure threshold, so `equity <= threshold` is false on every tick of all five sessions. No status change is written, nothing is flattened, no order is cancelled or rejected, and the account keeps trading - for the rest of day 5 and into the next session. Status stays `ACTIVE`.
3. Still tests equity, not the closing balance, in between those closes. The five values above are closes, where this account happens to be flat; the check itself runs on every tick and includes unrealized P\&L, so an open loser mid-session counts in full against the \$49,000 floor even on a day whose close never goes near it. A fixed floor is not an unchecked one.
4. Runs no daily check at all. `Check daily drawdown` is off, so the daily branch never executes: there is no daily floor in existence to reach, and no soft-breach outcome is available on this account. Nothing here can set `DONE_FOR_DAY` - and that is the engine's trading state for a soft daily breach in any case, not a value you can look up in the Accounts grid, where a soft-breached account still reads as Active.
5. Opens day 6 with the floor still at \$49,000. The close-of-session update runs at every close and leaves the EOD peak balance where it was - `max(51,000, 49,500)` is 51,000, because a losing close cannot lower the peak. The floor is not recomputed down to 47,500. Day 6 starts with day 5's closing balance of \$49,500, which is \$500 of equity room, not a fresh \$2,000.

**Common mistake.** Assigning rather than comparing - `peak = closing balance` instead of `peak = max(peak, closing balance)` - walks the floor down with the account: 48,700 after day 2, then 48,300, 47,900, and 47,500. Built that way, day 5 trades against a floor of 47,900 rather than 49,000, and day 6 opens against 47,500 - \$1,500 below the real floor, on an account whose balance has already given back \$1,500 of its \$2,000 allowance. The account survives on this run either way, which is exactly why the bug is easy to ship: it shows up first as room the rules never granted, and only bites on some later session that slides into the gap between the two floors. The second error is `<` in place of `<=`. It does not bite here, because no closing equity lands exactly on 49,000, but it is the same class of mistake: the check is `equity <= threshold`, so equity landing exactly on the floor is a breach, not a near miss.

### E4 · Banked profit moves the floor up, one closing high at a time

![E4](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/E4.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=76e5788feaaff199be72f4dd69d0ad1f)

E4 - Banked profit moves the floor up, one closing high at a time.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | End of day |
| Global DD threshold | \$2,000 |
| Check daily drawdown | Off |
| Daily drawdown amount | Ignored - the flag above gates it |

Day 1 closes with a balance of \$51,000. The account is flat at the close, so that is also its closing equity. That close sets the EOD peak balance - the anchor the floor is measured down from - to \$51,000:

`51,000 - 2,000 = 49,000` → **Failure threshold \$49,000**

From there the anchor is `max(stored peak, that session's closing balance)`, applied once per session, at the close.

**What happens.** Five winning sessions in a row. The account is flat at every close, so each closing balance is also the closing equity: \$51,000, \$51,400, \$51,700, \$51,900, \$52,000. Every close is higher than the one before it, so every close after day 1 is a new closing high and moves the anchor - and with it the failure threshold - up on the day it happens. No close is ever below the stored peak, so the anchor never has to carry over unchanged into the next session.

**The check.** The anchor update runs once per session, at the close:

| Day | Closing balance | Stored EOD peak before | `max(...)` after | Failure threshold from that close |
| - | - | - | - | - |
| 1 | \$51,000 | - | \$51,000 | \$49,000 |
| 2 | \$51,400 | \$51,000 | **\$51,400** | **\$49,400** |
| 3 | \$51,700 | \$51,400 | **\$51,700** | **\$49,700** |
| 4 | \$51,900 | \$51,700 | **\$51,900** | **\$49,900** |
| 5 | \$52,000 | \$51,900 | **\$52,000** | **\$50,000** |

The threshold in the last column is the one the *next* session trades against, held fixed from open to close: the \$49,400 set by day 2's close is what day 3 trades against the whole way, whatever equity does in between. The chart plots each day's threshold as it stands *after* that day's close, so the \$49,700 line drawn at day 3 is the floor day 4 will inherit, not the one day 3 traded under.

Held fixed is not the same as unchecked. The floor's value is held fixed for the session, while the account itself trades normally and is checked on every tick: the live test runs underneath all of it - `current equity <= failure threshold`, on equity, on every tick, never on the balance - and is false throughout. Measured against the floor each session actually inherited from the previous close - \$49,000, \$49,400, \$49,700 and \$49,900 - the closing equity on days 2 to 5 clears it by \$2,400, \$2,300, \$2,200 and \$2,100 respectively. Against the same-day post-close threshold the chart draws, the gap is a flat \$2,000 every day, because on a run of new highs the close and the threshold it sets move together.

**What the system does.**

1. Runs the anchor update exactly once per session, at the close. Never intraday, and never twice in a session. An intraday high, realized or unrealized, must never move the anchor.
2. Keeps the larger of the stored peak and the closing balance, so the floor rises by exactly the amount the close cleared the previous peak by: day 5's closing balance of \$52,000 clears day 4's stored peak of \$51,900 by \$100, and the failure threshold moves \$49,900 → \$50,000.
3. Uses the closing balance **net of that session's commissions**. A gross figure drifts from the real balance and puts the anchor, and every threshold derived from it, in the wrong place from that day on.
4. Writes no status change. No failure threshold is reached on any of the five days, so nothing sets `FAILED` and no failure reason is recorded - the account stays Active and trades again each following session, under the raised threshold. Nor does the engine ever enter its `DONE_FOR_DAY` trading state here: with Check daily drawdown off there is no daily floor in play at all, so the daily rule is never evaluated - not evaluated and left untouched. (`DONE_FOR_DAY` is the engine's own trading state in any case, not a value you can look up in the Accounts grid; a soft-breached account still reads as Active there.)
5. Carries day N's closing balance into day N+1 as the start-of-day balance - \$52,000 going into day 6, against a failure threshold held fixed at \$50,000 for that session.

**Common mistake.** Deferring the update: leaving the floor at \$49,000 through days 2, 3 and 4 because none of those closes is the highest the account will ever reach. Each close is compared against the stored peak on the day it happens, so day 5 opens with the failure threshold already at \$49,900, not \$49,000. A firm that defers hands the trader \$900 more equity room on day 5 than the rules allow, and a check against the real engine disagrees on every one of those days.

### E5 · A midday balance high is ignored, so the floor is 48,800 not 49,500

![E5](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/E5.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=4be512616df70e2be67840c2990821a4)

E5 - A midday balance high is ignored, so the floor is 48,800 not 49,500.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | End of day |
| Global drawdown threshold | \$2,000 |
| Check daily drawdown | Off |

The highest closing balance the account has reached is \$50,000, so the EOD peak balance (the anchor the floor is measured down from) is \$50,000 → **Failure threshold `50,000 - 2,000` = \$48,000**. That threshold stays fixed for the whole session - it is only recalculated at the close.

**What happens.** The session opens flat at \$50,000, so balance and equity are the same number. The trader closes winners through the morning and banks the profit for real: **Current balance** climbs to \$50,700, then peaks at \$51,500 around midday. The account is flat at each of those points, so equity reads the same number - this is a genuine **realized** high, not an open-position mark. The afternoon gives part of it back, to a balance and equity of \$51,200, and the session ends flat with a **closing balance of \$50,800** and closing equity of \$50,800.

**The check.** Two separate things happen in a session, and only one of them can move the floor. First, on every tick, `current equity <= failure threshold`:

| Moment | Balance | Equity | Threshold | Result |
| - | - | - | - | - |
| Open | 50,000 | 50,000 | 48,000 | false |
| Morning | 50,700 | 50,700 | 48,000 | false |
| Midday | 51,500 | 51,500 | 48,000 | false |
| Afternoon | 51,200 | 51,200 | 48,000 | false |
| Close | 50,800 | 50,800 | 48,000 (before the close) | false |

The account is flat throughout, so balance and equity never diverge, and the lowest equity of the session is the \$50,000 open - \$2,000 clear of the threshold. The close is checked against 48,000, not 48,800 - the tick check runs first and the anchor update runs after it, which is why the chart shows the threshold stepping up only at the very end of the session. Then once, at the close, the EOD peak balance is updated. Three values on this account look like candidates for that update, and only one of them qualifies:

| Candidate | Amount | Moves the EOD peak balance? |
| - | - | - |
| Peak realized balance (midday) | 51,500 | No - a real balance high, but not a *closing* balance |
| Peak equity for the session | 51,500 | No - Peak equity anchors a Trailing account; an End-of-day account never reads it |
| **Closing balance** | **50,800** | **Yes - `max(50,000, 50,800)` = 50,800** |

Next session's Failure threshold: `50,800 - 2,000` = **\$48,800**. Anchoring on the midday **balance** of 51,500 instead gives `51,500 - 2,000` = \$49,500 - \$700 too high.

**What the system does.**

1. Never fails or pauses the account this session. Equity's lowest reading is the \$50,000 open, so `current equity <= failure threshold` is false on every tick.
2. Samples the balance at the close, and only at the close. The closing balance of \$50,800 is the one value offered to the comparison; the \$51,500 balance is not, even though it was fully realized and the account was flat when it printed.
3. Sets the EOD peak balance to 50,800 - `max(50,000, 50,800)` = 50,800 - and with it the next session's Failure threshold to \$48,800.
4. Still records \$51,500 as **Peak realized balance** on the account. That field is shown on [Account details](https://tbignite.mintlify.site/account-details.md) and anchors no drawdown type at all.
5. Opens the next session with a start-of-day balance of \$50,800 against a Failure threshold of \$48,800.

**Common mistake.** Anchoring on **Peak realized balance** because it and **EOD peak balance** both contain the word "peak". It puts the next session's floor at \$49,500 instead of \$48,800 and fails accounts that were never in danger: next session, a trader whose equity dips to \$49,400 is still \$600 above the real threshold of \$48,800, and the wrong anchor fails them there. Three fields on the same account sound alike - **Peak equity**, **Peak realized balance** and **EOD peak balance** - and only **EOD peak balance** anchors an End-of-day account. See [the three peak values](https://tbignite.mintlify.site/drawdown-and-failure.md#three-values-that-sound-alike).

## Static with a daily limit

**Configuration.** Global drawdown type `Static` · Global DD threshold \$2,000 · Check daily drawdown **on** · Daily drawdown \$1,000 · Soft breach **on**.

**Floor.** Two floors run at once: the **Failure threshold**, fixed at 50,000 - 2,000 = **\$48,000** for the life of the account, and a **daily floor** at start-of-day balance - 1,000, recomputed every session. Max drawdown is tested first on every tick; the daily floor is tested only if the account has not already failed. ([how this works](https://tbignite.mintlify.site/drawdown-and-failure.md#two-floors-which-one-stops-the-trader-first))

### SD1 · The daily limit ends the session; the account trades again next open

![SD1](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/SD1.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=8e5483e8e7ec71f0f67e7e37ecf9f51e)

SD1 - The daily limit ends the session; the account trades again next open.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Static |
| Global DD threshold | \$2,000 |
| Check daily drawdown | On |
| Daily drawdown | \$1,000 |
| Soft breach | On |
| Initial balance | \$50,000 |
| Start-of-day balance | \$50,000 |

Initial balance \$50,000 → **Failure threshold \$48,000** (50,000 - 2,000), fixed permanently.
Start-of-day balance \$50,000 → **daily floor \$49,000** (50,000 - 1,000), recomputed every session.
The floor reached first today is the higher of the two: `max(48,000, 49,000)` = **\$49,000**, the daily floor.

**What happens.** Fresh account, first session. Equity falls through the session: \$50,000 → \$49,700 → \$49,400 → \$49,150 → \$49,000. Balance stays at \$50,000 the whole way, because the losing position is still open - the entire \$1,000 loss is unrealized. The daily check counts unrealized P\&L, so the account is measured on equity and is stopped at equity \$49,000 even though its realized balance never moved.

**The check.** Two floors, evaluated in a fixed order on every tick - max drawdown always first:

| # | Check | At equity \$49,000 | Result |
| - | - | - | - |
| 1 | `equity <= Failure threshold` | `49,000 <= 48,000` | false - no max-drawdown breach |
| 2 | Is Check daily drawdown on? | yes | go on to the daily floor |
| 3 | `equity <= daily floor` | `49,000 <= 49,000` | **true → daily breach** |
| 4 | Is Soft breach on? | yes | close out for the session, do not fail |

Row 3 in the engine's own form is `daily_total_pnl <= -1,000`, and `daily_total_pnl` here is \$0 realized plus -\$1,000 unrealized, less \$0 commissions. So `-1,000 <= -1,000`: the same test firing at the same instant.

**What the system does.**

1. Closes the account out for the rest of the session. Status → `DONE_FOR_DAY`, **not** `FAILED`.
2. Flattens all open positions and cancels every working and pending order - identical to a hard breach. The chart's last point is the breach itself, so it still shows balance \$50,000; the flatten that follows is what realizes that \$1,000 loss.
3. Rejects new orders for the rest of the session. The stated reason is the daily drawdown limit: a daily drawdown of \$1,000.00 against an allowed \$1,000.00.
4. Reactivates at the next session open (6:00 PM EST for futures) and recomputes the daily floor from the new start-of-day balance.
5. Leaves the Failure threshold untouched at \$48,000 - a daily breach never moves it. The session's low in equity, \$49,000, stayed \$1,000 clear of it.
6. Ends the trading session for this account **without failing it**. The flatten and cancel should leave nothing open. If any position or order does survive, it changes nothing in either direction - it does not let the account keep trading this session, and it does not turn the pause into a failure. The status stays `DONE_FOR_DAY`, and the account reactivates at the next session open.

**Common mistake.** Three things get built wrong here. The comparison is `<=`, so equity landing exactly on \$49,000 **is** a breach; a `<` leaves equity sitting on the limit with nothing fired. The daily test runs on equity, which includes unrealized P\&L - on this chart the realized balance never left \$50,000, so an implementation that tests the daily limit against balance never fires at all and lets the session run past its limit. And a soft breach flattens exactly as hard as a hard breach; only what happens *next* differs, so building soft as "warn and carry on" is wrong.

### SD2 · Deep in profit, the session still ends after a 1,000 loss

![SD2](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/SD2.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=8ac792d9e9c4948cde0e86c6068078ac)

SD2 - Deep in profit, the session still ends after a 1,000 loss.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Static |
| Global DD threshold | \$2,000 |
| Check daily drawdown | On |
| Daily drawdown | \$1,000 |
| Soft breach | On |

Initial balance \$50,000 → **Failure threshold \$48,000**, fixed permanently. A Static floor is measured down from the Initial balance, and the Initial balance never changes, so profit never moves it.
Start-of-day balance \$60,000, after \$10,000 of banked profit → **daily floor \$59,000** for this session only.

**What happens.** The account opens the session \$10,000 up: balance \$60,000, equity \$60,000, flat with nothing open. It takes one losing position. Equity slides through the session - 59,750, then 59,500, then 59,250 - and reaches **\$59,000 equity**. **Current balance never moves off \$60,000** - the whole \$1,000 loss is unrealized. The Failure threshold sits \$11,000 below the equity at that moment, and is never approached.

**The check.** Two floors, evaluated in a fixed order on every tick - max drawdown always first:

| # | Check | At 59,000 equity | Result |
| - | - | - | - |
| 1 | `equity <= Failure threshold` | `59,000 <= 48,000` | false - continue |
| 2 | Is Check daily drawdown on? | yes | continue |
| 3 | `equity <= daily floor` | `59,000 <= 59,000` | **true → daily breach** |
| 4 | Is Soft breach on? | yes | pause, do not fail |

**What the system does.**

1. Pauses the account for the rest of the session, on the tick where equity reaches \$59,000 - balance is still \$60,000 at that instant. Status → `DONE_FOR_DAY`, **not** `FAILED`. The account has not failed.
2. Flattens all open positions and cancels all working orders - identical to a hard breach.
3. Rejects new orders for the rest of the session, stating that the account hit its daily drawdown limit, at a daily drawdown of \$1,000.00 against an allowed \$1,000.00.
4. Reactivates at the next session open (6:00 PM ET for futures) and recomputes the daily floor from the new start-of-day balance. The flatten realizes the open \$1,000 loss, so barring slippage the session closes with a **balance** of \$59,000 and tomorrow's daily floor is \$58,000 - the cap follows the account down as well as up.
5. Leaves the Failure threshold at \$48,000. It is measured down from the \$50,000 Initial balance, so the \$10,000 of banked profit widened the max-drawdown room to \$12,000 from the \$60,000 start-of-day balance, and did nothing at all to the daily allowance, which is \$1,000 on every session for the life of the account.
6. Ends the trading session for this account **without failing it**. The flatten and cancel should leave nothing open - no position, no working order. If any position or order does survive, it changes nothing in either direction: it does not let the account keep trading this session, and it does not turn the pause into a failure. The status stays `DONE_FOR_DAY`, and the account reactivates at the next session open.

**Common mistake.** Computing the daily floor from the Initial balance instead of the start-of-day balance. `50,000 - 1,000` would put it at \$49,000 and let this account's equity fall \$11,000 in one session before anything fired. The daily floor is re-derived from the **balance** the session opened with, so it rises with the account: at a start-of-day balance of \$60,000 the trader can still only lose \$1,000 of equity in that session, and no more. The reverse error is just as common - assuming a profitable account has bought itself a wider daily allowance. Profit widens only the distance to the Failure threshold.

### SD3 · Near the Failure threshold, the account fails instead of pausing

![SD3](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/SD3.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=4583f46605027af2c5e56b8eb635764c)

SD3 - Near the Failure threshold, the account fails instead of pausing.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Static |
| Global drawdown threshold | \$2,000 |
| Check daily drawdown | On |
| Daily drawdown | \$1,000 |
| Soft breach | On |

Initial balance \$50,000 → **Failure threshold \$48,000**, fixed permanently.
Start-of-day balance \$48,800, after earlier losing sessions → **daily floor \$47,800** - \$200 *below* the Failure threshold, so it can never be the floor reached first.

**What happens.** The account opens the session flat, with a balance of \$48,800 and no position, so equity opens at the same \$48,800 - only \$800 above its Failure threshold. A position is opened and goes against it. The balance holds at \$48,800 through the whole slide: every dollar of it is unrealized, so equity is the only value that moves. Equity falls through the session - \$48,600, then \$48,400, then \$48,200 - and reaches \$48,000. At that moment the day's loss is \$800, all of it unrealized, against an allowed daily drawdown of \$1,000: the daily floor at \$47,800 in equity has not been reached, and never will be. The flat balance line ends on that breach tick, before the flatten fills, which is why it never steps down.

**The check.** Two floors, evaluated in a fixed order on every tick - max drawdown always first:

| # | Check | At equity 48,000 | Result |
| - | - | - | - |
| 1 | `equity <= Failure threshold` | `48,000 <= 48,000` | **true → max-drawdown breach, stop here** |
| 2 | Is Check daily drawdown on? | never reached | the tick ended at step 1 |
| 3 | `equity <= daily floor` | never reached | `48,000 <= 47,800` would be false anyway |
| 4 | Is Soft breach on? | never reached | Soft breach is daily-only; it cannot apply |

**What the system does.**

1. Fails the account on the tick where equity reaches \$48,000. Account status → `FAILED`. That is permanent, and it is the value the CRM Accounts grid shows from that tick onward.
2. Flattens all open positions and cancels all working and pending orders. That flatten realizes the \$800 that was unrealized a moment earlier, so barring slippage the account is left with a balance of about \$48,000 - but the failure was decided by the touch, not by the price the flatten filled at.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$48,000.00 has reached or fallen below the Failure threshold of \$48,000.00, so trading is no longer allowed on this account.
4. Does **not** run the daily branch on that tick, and does **not** consult Soft breach. Soft breach governs the daily floor only, and no daily outcome can downgrade a max-drawdown failure to a pause. Had the daily floor been reached first, Soft breach would have set the trading state to `DONE_FOR_DAY` and let the account resume next session. That is the engine's state, not a value you can look up in the Accounts grid - a soft-breached account still reads as Active in the CRM - so it is not a status you can filter the grid for, and it is not what happens here.
5. Does **not** reactivate at the next session open. There is no next session for a failed account, so no daily floor is recomputed and the Failure threshold stays at \$48,000.
6. Treats the \$48,000 equity breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** Telling this trader - or a risk dashboard - that they have \$1,000 of room today. They have \$800 of equity room, and giving it up fails the account rather than pausing it. The room for the session is start-of-day balance minus the **higher** of the two floors: `48,800 - max(48,000, 47,800) = 800`. Whenever the start-of-day balance is within one Daily drawdown of the Failure threshold, the daily floor sinks beneath it and the soft breach can no longer fire first. And landing exactly on the line counts: `48,000 <= 48,000` is true, so equity that stops precisely at the Failure threshold fails the account.

## Trailing with a daily limit

**Configuration.** Global drawdown type `Trailing` (intraday) · Global DD threshold \$2,500 · Check daily drawdown **on** · Daily drawdown \$1,000 · Soft breach **on**. Start-of-day balance \$50,000 in every case.

**Floor.** Two floors that move relative to each other **during** the session: the Failure threshold is peak equity - 2,500 and steps up on every new equity high, while the daily floor is fixed at 50,000 - 1,000 = **\$49,000** until the next session open. The higher of the two stops the trader first, so a gain of more than `2,500 - 1,000 = 1,500` above the session open puts the Failure threshold on top - and that one fails the account permanently. ([how this works](https://tbignite.mintlify.site/drawdown-and-failure.md#when-the-daily-limit-stops-being-the-first-floor-reached))

### ID1 · No new high: the daily limit pauses the account instead of failing it

![ID1](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/ID1.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=79c498025693e0e3c1d431aaff177756)

ID1 - No new high: the daily limit pauses the account instead of failing it.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Trailing (intraday) |
| Global DD threshold | \$2,500 |
| Check daily drawdown | On |
| Daily drawdown | \$1,000 |
| Soft breach | On |

Peak equity opens the session at \$50,000 → **Failure threshold \$47,500**, and it steps up on every new equity high, unrealized profit included.
Start-of-day balance \$50,000 → **daily floor \$49,000**, fixed for this session and recomputed at the next session open. The daily floor therefore starts \$1,500 above the Failure threshold (`2,500 - 1,000`), and only a new equity high can narrow that gap.

**What happens.** The session opens flat at \$50,000 - no position, so balance and equity are the same number. The trader takes a position that never goes green: equity prints \$49,800, \$49,500, \$49,200 and reaches \$49,000. No equity tick ever prints above \$50,000, so peak equity stays where the session opened and the Failure threshold never moves off \$47,500 - \$1,500 below the daily floor for the whole path. Current balance sits at \$50,000 the entire way, the breach tick included: the position is still open, so the full \$1,000 loss is unrealized equity, and the daily total counts it in full.

**The check.** The daily floor is fixed for the session, and the Failure threshold would move only on a new equity high - there is none:

| Tick | Equity | Current balance | Peak equity | Failure threshold | Daily floor | Result |
| - | - | - | - | - | - | - |
| 1 | 50,000 | 50,000 | 50,000 | 47,500 | 49,000 | both false |
| 2 | 49,800 | 50,000 | 50,000 | 47,500 | 49,000 | both false |
| 3 | 49,500 | 50,000 | 50,000 | 47,500 | 49,000 | both false |
| 4 | 49,200 | 50,000 | 50,000 | 47,500 | 49,000 | both false |
| 5 | **49,000** | 50,000 | 50,000 | 47,500 | **49,000** | **daily floor reached** |

Two floors, evaluated in a fixed order on every tick - max drawdown always first:

| # | Check | At equity 49,000 | Result |
| - | - | - | - |
| 1 | `equity <= Failure threshold` | `49,000 <= 47,500` | false - continue |
| 2 | Is Check daily drawdown on? | yes | continue |
| 3 | `equity <= daily floor` | `49,000 <= 49,000` | **true → daily breach** |
| 4 | Is Soft breach on? | yes | pause, do not fail |

**What the system does.**

1. Pauses the account for the rest of the session, on the tick where equity reaches \$49,000. Status → `DONE_FOR_DAY`, **not** `FAILED`.
2. Flattens all open positions and cancels all working **and pending** orders - identical to a hard breach. Nothing is left resting on the account.
3. Rejects new orders for the rest of the session, stating that the account hit its daily drawdown limit: equity of \$49,000.00 against the \$50,000.00 start-of-day balance is a daily drawdown of \$1,000.00 against an allowed \$1,000.00.
4. Reactivates at the next session open (6:00 PM ET for futures) and recomputes the daily floor from the new start-of-day balance. The flatten realizes that \$1,000 loss, so the balance settles at \$49,000 and the next session's daily floor is \$48,000.
5. Leaves the Failure threshold at \$47,500 and peak equity at \$50,000. A daily breach moves neither, so next session the daily floor is still the higher of the two - but by only \$500 (daily floor 48,000 against Failure threshold 47,500), not the \$1,500 of this session, because the balance fell to \$49,000 while peak equity stayed at \$50,000. The pause is still standing in front of permanent failure at that open, and a gain of \$1,500 above it removes it: equity \$50,500 lifts the Failure threshold to \$48,000, level with the daily floor, so a single tick then trips both and max drawdown is evaluated first - the same-tick double breach of ED3.
6. Ends the trading session for this account **without failing it**. The flatten and cancel should leave nothing open - no position, no working order, no pending order. If any position or order does survive, it changes nothing in either direction: it does not let the account trade again this session, and it does not turn the pause into a failure. The status stays `DONE_FOR_DAY`, and the account reactivates at the next session open.

**Common mistake.** Two implementations break here. Building the daily total from realized P\&L only: nothing on this path is realized - Current balance is still \$50,000 on the breach tick and the whole \$1,000 sits in an open position as unrealized equity - so a realized-only total reads \$0, the daily branch never fires, and the \$1,000 limit goes unenforced. The daily total is measured on equity against the start-of-day balance, never on realized P\&L alone. The second error is writing the comparison as `<` rather than `<=`: equity landing exactly on 49,000 **is** the breach, and `<` misses it at precisely the value the limit exists to catch.

### ID2 · Down only 600 on a 1,000 daily limit, and the earlier profit fails it

![ID2](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/ID2.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=96d92e31ad8e11887982c36f6e3ec305)

ID2 - Down only 600 on a 1,000 daily limit, and the earlier profit fails it.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Trailing (intraday) |
| Global DD threshold | \$2,500 |
| Check daily drawdown | On |
| Daily drawdown | \$1,000 |
| Soft breach | On |

Peak equity is a stored lifetime high, never re-derived from where a session happens to open. This account has never printed above \$50,000, so peak equity is \$50,000 → **Failure threshold** 50,000 - 2,500 = **\$47,500**, and it steps up on every new equity high, unrealized profit included.
Start-of-day balance \$50,000 → **daily floor** 50,000 - 1,000 = **\$49,000**, fixed for this session and recomputed at the next session open.
The daily floor starts \$1,500 above the Failure threshold, and `Global DD threshold - Daily drawdown = 2,500 - 1,000 = 1,500` is exactly the gain in equity above the session open that closes that gap.

**What happens.** The session opens flat at \$50,000, so Current balance and equity are the same number. A position runs into profit and equity prints \$50,900, then \$52,000 - up \$2,000 above the open, \$500 more than the \$1,500 that closes the gap. Peak equity follows every tick up, so the Failure threshold rises with it - \$48,400, then **\$49,500**, which is now *above* the daily floor of \$49,000. None of that gain is banked: Current balance has not moved off \$50,000, because the whole gain is unrealized in an open position. Equity then gives it all back - \$51,200, \$50,200, \$49,400. At equity \$49,400 the trader is down \$600 on the day, still \$400 clear of the daily floor, and \$100 below a Failure threshold that the trader's own profit put there. Current balance moves only on that last tick, to \$49,400, when the flatten realizes the loss.

**The check.** The Failure threshold is not a constant on a trailing account - it moves during the session, and here it overtakes the daily floor at tick 3:

| Tick | Equity | Current balance | Peak equity | Failure threshold | Daily floor | Result |
| - | - | - | - | - | - | - |
| 1 | 50,000 | 50,000 | 50,000 | 47,500 | 49,000 | both false |
| 2 | 50,900 | 50,000 | 50,900 | 48,400 | 49,000 | both false |
| 3 | 52,000 | 50,000 | 52,000 | **49,500** | 49,000 | both false - the Failure threshold is now the higher floor |
| 4 | 51,200 | 50,000 | 52,000 | 49,500 | 49,000 | both false |
| 5 | 50,200 | 50,000 | 52,000 | 49,500 | 49,000 | both false |
| 6 | **49,400** | 50,000 at the check, 49,400 once the flatten fills | 52,000 | **49,500** | 49,000 | **Failure threshold reached** |

The ordered checks on tick 6 - max drawdown always first:

| # | Check | At equity 49,400 | Result |
| - | - | - | - |
| 1 | `equity <= Failure threshold` | `49,400 <= 49,500` | **true → fail, stop here** |
| 2 | Is Check daily drawdown on? | not reached | the daily branch never runs |
| 3 | `equity <= daily floor` | `49,400 <= 49,000` would be false anyway | never evaluated |

**What the system does.**

1. Fails the account on the tick where equity reaches \$49,400. Status → `FAILED`.
2. Flattens all open positions and cancels every working and pending order. Nothing is left on the account: no position, no resting order, no partial exposure.
3. Rejects every order submitted afterwards. The stated reason is the max-drawdown breach - the account's equity of \$49,400.00 has reached or fallen below the Failure threshold of \$49,500.00, so trading is no longer allowed on this account.
4. Does **not** run the daily branch. Max drawdown is evaluated first and stops the tick, so `Soft breach` never gets a vote - and it could not have rescued this account in any case, because it applies to the daily floor only.
5. Does **not** pause, and must never state a resume time. A max-drawdown breach is terminal: there is no next session for this account and no reactivation.
6. Leaves the day's loss at \$600 of an allowed \$1,000. The daily total - realized plus unrealized, net of commissions - never reached the limit, and that changes nothing.
7. Treats the breach on the \$49,400 equity tick as final. The flatten and cancel should leave the account holding nothing - no open position, no working or pending order. If anything does survive, it does not reopen the question: the account had already failed at that moment, so no later fill, position, or balance movement is evaluated against it or can change the outcome.

**Common mistake.** Treating the Failure threshold as a value fixed for the session. On a trailing account it steps up during the session on every new equity high, and unrealized profit counts - an implementation that samples the threshold at the open tests equity of \$49,400 against \$47,500, finds nothing wrong, and misses a failure that has already happened. The planning version of the same error is assuming the daily floor is reached first all day because it started \$1,500 higher: compare the gain in equity above the start-of-day balance against `Global DD threshold - Daily drawdown` (here \$1,500). Once peak equity is more than \$1,500 above the start-of-day balance, the Failure threshold is the higher of the two floors, the soft breach no longer stands in front of it, and the next breach ends the account permanently.

### ID3 · A smaller gain pauses the account for the day instead of failing it

![ID3](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/ID3.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=5fe64cc39447bed750458bb56645cc19)

ID3 - A smaller gain pauses the account for the day instead of failing it.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Trailing (intraday) |
| Global DD threshold | \$2,500 |
| Check daily drawdown | On |
| Daily drawdown | \$1,000 |
| Soft breach | On |

Peak equity opens the session at \$50,000 → **Failure threshold \$47,500**, and it steps up on every new equity high, unrealized profit included.
Start-of-day balance \$50,000 → **daily floor \$49,000**, fixed for the session. The gap between the two floors is \$1,500 (`2,500 - 1,000`), so the daily floor stays the higher of the two for as long as the equity gain above the session open stays under \$1,500.

**What happens.** The session opens flat at \$50,000 - no position, so Current balance and equity are the same number. A position runs into profit and equity prints \$50,600, then \$51,000: a \$1,000 gain, every dollar of it unrealized, and \$500 short of the \$1,500 that would close the gap between the floors. Peak equity follows equity up to \$51,000, so the Failure threshold rises to \$48,100 and then \$48,500 and stays there - still \$500 below the daily floor. The position then reverses and equity prints \$50,400, \$49,700, \$49,000. The daily floor is reached with the Failure threshold still \$500 underneath it. Nothing is realized on the way down: Current balance holds \$50,000 through every tick, and only the flatten brings it to \$49,000.

**The check.** The Failure threshold moves during the session, but not far enough to overtake the daily floor:

| Tick | Equity | Current balance | Peak equity | Failure threshold | Daily floor | Result |
| - | - | - | - | - | - | - |
| 1 | 50,000 | 50,000 | 50,000 | 47,500 | 49,000 | both false |
| 2 | 50,600 | 50,000 | 50,600 | 48,100 | 49,000 | both false |
| 3 | 51,000 | 50,000 | 51,000 | 48,500 | 49,000 | both false - the daily floor is still the higher one |
| 4 | 50,400 | 50,000 | 51,000 | 48,500 | 49,000 | both false |
| 5 | 49,700 | 50,000 | 51,000 | 48,500 | 49,000 | both false |
| 6 | **49,000** | 50,000 → 49,000 on the flatten | 51,000 | 48,500 | **49,000** | **daily floor reached** |

The ordered checks on tick 6 - max drawdown always first:

| # | Check | At equity 49,000 | Result |
| - | - | - | - |
| 1 | `equity <= Failure threshold` | `49,000 <= 48,500` | false - continue |
| 2 | Is Check daily drawdown on? | yes | continue |
| 3 | `equity <= daily floor` | `49,000 <= 49,000` | **true → daily breach** |
| 4 | Is Soft breach on? | yes | pause, do not fail |

**What the system does.**

1. Pauses the account for the rest of the session, on the tick where equity reaches \$49,000. Status → `DONE_FOR_DAY`, **not** `FAILED`.
2. Flattens all open positions and cancels every working and pending order - identical to a hard breach.
3. Rejects new orders for the rest of the session. The stated reason is the daily one: the account hit its daily drawdown limit - \$1,000.00 of daily drawdown against an allowed \$1,000.00 - so no further trading is allowed for the remainder of this session, and it resumes at the next session open.
4. Reactivates at that next session open (6:00 PM EST for futures). The flatten realizes the \$1,000 loss, so barring slippage the session closes with a Current balance of \$49,000, and the next daily floor is recomputed from that start-of-day balance as \$48,000.
5. Leaves the Failure threshold at \$48,500 and peak equity at \$51,000. A daily breach moves neither, and neither ever moves down.
6. Opens the next session with the two floors swapped: Failure threshold \$48,500 against a daily floor of \$48,000. The higher of the two is now the Failure threshold, so the account starts that session with \$500 of equity between its \$49,000 open and the floor that stops it first, and with no pause standing in front of that floor - the next breach is a terminal failure, exactly as in ID2.
7. Ends the trading session for this account **without failing it**. The flatten and cancel on the \$49,000 equity tick should leave nothing open - no position, no working or pending order. If any position or order does survive, it changes nothing in either direction: it does not let the account trade again this session, and it does not turn the pause into a failure. The status stays `DONE_FOR_DAY`, and the account reactivates at the next session open.

**Common mistake.** Re-seeding peak equity from the new start-of-day balance at the session open. Peak equity is the highest equity the account has ever reached and it never resets: after this pause the peak is still \$51,000 and the Failure threshold is still \$48,500, and re-seeding from the \$49,000 opening balance would drop the threshold to \$46,500 - \$2,000 too low, on an account whose real room is \$500 of equity. The second error is reading "it paused today" as "it pauses again tomorrow": recompute both floors at every session open and compare them, because the pause moved the daily floor down to \$48,000 while leaving the Failure threshold at \$48,500. And at the exact boundary - a \$1,500 equity gain, peak equity \$51,500 - the two floors coincide at \$49,000, so a single tick trips both; max drawdown is evaluated first, so that account is `FAILED`, not `DONE_FOR_DAY`.

## End of day with a daily limit

**Configuration.** Global drawdown type `End of day` · Global DD threshold \$2,000 · Check daily drawdown **on** · Daily drawdown \$1,100 · Soft breach **on**. The account is flat at the close, so nothing is carried overnight.

**Floor.** Two floors, and both are fixed before the first order of the session: the Failure threshold at EOD peak balance - 2,000, frozen until the close, and the daily floor at start-of-day balance - 1,100, rebuilt at every session open. Whichever of the two sits higher is the one the trader reaches first. ([how this works](https://tbignite.mintlify.site/drawdown-and-failure.md#two-floors-which-one-stops-the-trader-first))

### ED1 · The daily floor stops the session first, and the account does not fail

![ED1](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/ED1.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=7d3beb9cd0e28c299da181df34aa9326)

ED1 - The daily floor stops the session first, and the account does not fail.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | End of day |
| Global DD threshold | \$2,000 |
| Check daily drawdown | On |
| Daily drawdown | \$1,100 |
| Soft breach | On |
| Auto-flatten before market close | On - the account is flat at the close, not swing |

The highest closing balance the account has ever made is \$50,000, so the EOD peak balance (the anchor the floor is measured down from) is \$50,000 → **Failure threshold 50,000 - 2,000 = \$48,000**, frozen for the whole session.

This session opens at a balance of \$50,000 → **daily floor 50,000 - 1,100 = \$48,900**, rebuilt at every session open. Both numbers are fixed before the first order goes in, and the daily floor is the higher of the two by \$900 - so it is the one the trader reaches first.

**What happens.** The session opens at a balance of \$50,000 with nothing open, so equity is the same \$50,000. The trader puts on a position that drifts against them all day: equity is \$49,700 at 11:00, \$49,400 at 13:00, \$49,100 at 14:30, and reaches \$48,900 at 15:45. The realized balance never moves off \$50,000 - the whole \$1,100 loss is unrealized, sitting in the open position. That is why the Current balance line on the chart is flat all session while the equity line falls.

**The check.** Equity is `balance + unrealized P&L`, so the open loss counts in full on every tick, and every tick is measured against both floors. All figures below are dollars:

| Time | Balance | Equity | Loss on the day | Failure threshold | Daily floor | Result |
| - | - | - | - | - | - | - |
| 09:30 | 50,000 | 50,000 | 0 | 48,000 | 48,900 | passes both |
| 11:00 | 50,000 | 49,700 | 300 | 48,000 | 48,900 | passes both |
| 13:00 | 50,000 | 49,400 | 600 | 48,000 | 48,900 | passes both |
| 14:30 | 50,000 | 49,100 | 900 | 48,000 | 48,900 | passes both |
| 15:45 | 50,000 | **48,900** | **1,100** | 48,000 | 48,900 | **daily floor reached** |

At 15:45 the two floors are evaluated in a fixed order - max drawdown always first:

| # | Check | At an equity of 48,900 | Result |
| - | - | - | - |
| 1 | `equity <= Failure threshold` | `48,900 <= 48,000` | false - continue |
| 2 | Is Check daily drawdown on? | yes | continue |
| 3 | `equity <= daily floor` | `48,900 <= 48,900` | **true → daily breach** |
| 4 | Is Soft breach on? | yes | pause, do not fail |

**What the system does.**

1. Records a daily-drawdown soft breach on the tick where equity reaches \$48,900. Status → `DONE_FOR_DAY`, **not** `FAILED`. The account has not failed.
2. Flattens all open positions and cancels all working orders - identical to a hard breach. That flatten realizes the \$1,100 that was unrealized a moment earlier, so the account holds nothing and finishes the session with a balance of about \$48,900; flat, its equity is that same number.
3. Rejects any new order for the rest of the session, with the daily drawdown limit as the stated reason - a daily drawdown of \$1,100.00 against an allowed \$1,100.00.
4. Reactivates at the next session open - 4:00 AM EST for a stock account trading the 4:00 AM to 4:00 PM EST session shown here, 6:00 PM EST for futures - and recomputes the daily floor from the new start-of-day balance. After a closing balance near \$48,900 that is `48,900 - 1,100 =` **\$47,800** - not the \$48,900 daily floor that was in force today.
5. Leaves the Failure threshold untouched at \$48,000. A daily breach never moves it, and the EOD peak balance stays at \$50,000 because a closing balance of about \$48,900 is not a new closing high - that anchor only moves up.
6. Ends the trading session for this account at 15:45 **without failing it**. The flatten and cancel should leave nothing open - no position, no working order. If any position or order does survive, it changes nothing in either direction: it does not let the account keep trading this session, and it does not turn the \$48,900 pause into a failure. The status stays `DONE_FOR_DAY`, and the account reactivates at the next session open.

**Common mistake.** Two implementations go wrong here. The first carries today's daily floor of 48,900 into the next session instead of rebuilding it from the new start-of-day balance; the daily floor has to be recomputed at every session open, and after a closing balance near \$48,900 it is \$47,800. The second lets that losing closing balance move the EOD peak balance down, which would drop the Failure threshold to \$46,900 and hand the trader \$1,100 of room they never earned. The end-of-day anchor moves only upward, and only on a new closing high.

### ED2 · The daily limit is never reached, and the account fails permanently

![ED2](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/ED2.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=5932e5e1468ca05eff9d6aa832b381a5)

ED2 - The daily limit is never reached, and the account fails permanently.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | End of day |
| Global DD threshold | \$2,000 |
| Check daily drawdown | On |
| Daily drawdown | \$1,100 |
| Soft breach | On |
| Auto-flatten before market close | On - the account is flat at the close, not swing |

The EOD peak balance - the highest **closing balance** the account has reached, and the anchor the failure threshold is measured down from - is still \$50,000, because a losing close never lowers it → **Failure threshold 50,000 - 2,000 = \$48,000**, fixed for the whole session and tested against equity on every tick.

This session opens at a **balance** of \$49,000 → **daily floor 49,000 - 1,100 = \$47,900**, rebuilt at every session open. This time the Failure threshold is the higher of the two, by \$100, so it is the one the trader reaches first - and a max-drawdown breach has no pause form, whatever `Soft breach` is set to.

**What happens.** A later session on the same account. Its highest closing balance is still \$50,000, but \$1,000 of that has been given back on earlier days, so this session opens at a balance of \$49,000. The trader holds one losing position all session: equity is \$48,800 at 11:00, \$48,600 at 13:00, \$48,300 at 14:30, and \$48,000 at 15:45. The balance never leaves \$49,000 - the entire \$1,000 loss is unrealized, sitting in that open position, which is why the Current balance line on the chart is flat while the equity line falls. Measured on equity, the day is down \$1,000: \$100 short of the \$1,100 daily allowance, and \$100 above the daily floor at 47,900, which is never reached.

**The check.** Equity is `balance + unrealized P&L`, and the day's loss is measured on that same equity basis, so the open loser counts in full on every tick. Both floors were fixed before the first order went in, so which one is reached first was knowable at the open:

| Time | Balance | Equity | Loss on the day | Failure threshold | Daily floor | Result |
| - | - | - | - | - | - | - |
| 09:30 | 49,000 | 49,000 | 0 | 48,000 | 47,900 | passes both |
| 11:00 | 49,000 | 48,800 | 200 | 48,000 | 47,900 | passes both |
| 13:00 | 49,000 | 48,600 | 400 | 48,000 | 47,900 | passes both |
| 14:30 | 49,000 | 48,300 | 700 | 48,000 | 47,900 | passes both |
| 15:45 | 49,000 | **48,000** | 1,000 | **48,000** | 47,900 | **Failure threshold reached** |

At 15:45 the two floors are evaluated in a fixed order - max drawdown always first:

| # | Check | At equity 48,000 | Result |
| - | - | - | - |
| 1 | `equity <= Failure threshold` | `48,000 <= 48,000` | **true → fail, stop here** |
| 2 | Is Check daily drawdown on? | not evaluated | the account has already failed on this tick |
| 3 | `equity <= daily floor` | `48,000 <= 47,900` would be false | never evaluated |
| 4 | Is Soft breach on? | not evaluated | Soft breach governs the daily floor only |

**What the system does.**

1. Fails the account at 15:45, on the tick where equity reaches 48,000. Landing exactly on the threshold is a breach - the comparison is `<=`, so equal counts. Status → `FAILED`.
2. Flattens all open positions and cancels all working orders. That flatten realizes the \$1,000 that was unrealized a moment earlier, so the account is left holding nothing and its closing balance lands near \$48,000. The flatten holds for a minimum of about 6 seconds, or until every position is confirmed closed, whichever is longer, and the fills can leave the closing balance below \$48,000 - that moves the balance, not the verdict. The breach is the touch at 15:45, not the price the flatten filled at.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$48,000.00 has reached or fallen below the failure threshold of \$48,000.00, so trading is no longer allowed on this account. Both figures are specific to this account: the equity is its live equity on the breach tick, and the failure threshold is derived - never stored - as `EOD peak balance - Global DD threshold`, using this account's own phase configuration. Neither is a hardcoded drawdown amount.
4. Never runs the daily branch. Max drawdown is checked first and returns there, so the day's \$1,000 equity loss against an allowed \$1,100 is never tested - and a daily rule that did not run cannot put the engine into `DONE_FOR_DAY`, the trading state it sets on a soft daily breach. Note the difference between the two tokens: `FAILED` is an account status and is what the CRM Accounts grid shows for this account from 15:45 onwards, whereas `DONE_FOR_DAY` is the engine's own state, not a value you can look up in the Accounts grid - a soft-breached account still reads as Active there. Nothing here reaches that state anyway.
5. Sets no resume time and does not reactivate at the next session open. `Soft breach` is on, but it governs the daily floor and nothing else.
6. Does no end-of-day roll-forward. The EOD peak balance stays at \$50,000 and the Failure threshold stays at \$48,000 - a close near 48,000 is no new closing high, and in any case a failed account has no next session for either number to govern.
7. Treats the 15:45 breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** Two errors live here. The first is reading "Soft breach on" as "this account pauses instead of failing": Soft breach is daily-only, and nothing rescues a max-drawdown breach. The second is inferring safety from the daily number - the trader stayed inside the \$1,100 daily allowance and the account still failed permanently. Which floor is reached first is two subtractions done at the open: compare `G = EOD peak balance - start-of-day balance` (two balances: 50,000 - 49,000 = 1,000) against `H = Global DD threshold - Daily drawdown` (two configured amounts: 2,000 - 1,100 = 900). The daily floor is the higher of the two, and therefore the one that stops the trader first, only while `G` is smaller than `H`. Here G exceeds H by exactly the \$100 that separates the Failure threshold at 48,000 from the daily floor at 47,900.

### ED3 · One gap crosses both floors, and the account fails instead of pausing

![ED3](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/ED3.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=c371409836df68672777c491e2030edb)

ED3 - One gap crosses both floors, and the account fails instead of pausing.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | End of day |
| Global DD threshold | \$2,000 |
| Check daily drawdown | On |
| Daily drawdown | \$1,100 |
| Soft breach | On |
| Auto-flatten before market close | On - the account is flat at the close, not swing |

The same account and the same session open as ED2, down a different path. The EOD peak balance (the anchor the floor is measured down from) is \$50,000 → **Failure threshold 50,000 - 2,000 = \$48,000**, frozen until the close. The session opened at a balance of \$49,000 → **daily floor 49,000 - 1,100 = \$47,900**. The Failure threshold is the higher of the two by \$100, and both are fixed for the session.

**What happens.** By 14:00 the trader has closed out \$400 of losses, so the balance is \$48,600 and equity is \$48,600 as well, with nothing riding on it. A new position goes on and equity drifts to \$48,550, then \$48,500; the balance holds at \$48,600, so the position is \$100 down on paper and both floors are still clear. Then one tick does everything: a release gaps the market, the open position's loss deepens from \$100 to \$900, and equity moves from \$48,500 straight to \$47,700 with nothing in between. The balance never leaves \$48,600, so the whole \$900 is unrealized. That single equity tick sits below the Failure threshold at 48,000 **and** below the daily floor at 47,900, at the same instant.

**The check.** Failure threshold 48,000 and daily floor 47,900, both fixed all session and both measured on equity:

| Time | Balance | Equity | Loss on the day (equity) | Result |
| - | - | - | - | - |
| 14:00 | 48,600 | 48,600 | 400 | above both floors |
| 14:20 | 48,600 | 48,550 | 450 | above both floors |
| 14:30 | 48,600 | 48,500 | 500 | above both floors |
| 14:31 | 48,600 | **47,700** | **1,300** | **below both floors on one tick** |
| 14:32 | 48,600 | 47,700 | 1,300 | not evaluated - the account failed at 14:31 |

The order is what settles it, and it does not change because both fired together:

| # | Check | At equity 47,700 | Result |
| - | - | - | - |
| 1 | `equity <= Failure threshold` | `47,700 <= 48,000` | **true → fail, stop here** |
| 2 | Is Check daily drawdown on? | not evaluated | the account has already failed |
| 3 | `equity <= daily floor` | `47,700 <= 47,900` is true, but is never tested | the daily branch does not run |
| 4 | Is Soft breach on? | not evaluated | a pause can never override a failure |

**What the system does.**

1. Fails the account at 14:31, on that one tick. Status → `FAILED`, never `DONE_FOR_DAY`.
2. Flattens all open positions and cancels all working orders. The flatten holds for a minimum of about 6 seconds, or until every position is confirmed closed, whichever is longer - and on a move like this the fills can land worse than the 47,700 equity that triggered it, leaving a closing balance below 47,700. That changes the closing balance, not the verdict.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$47,700.00 has reached or fallen below the failure threshold of \$48,000.00, so trading is no longer allowed on this account.
4. Produces no daily-limit outcome at all. The day's loss measured on equity is \$1,300 against an allowed \$1,100, which would have been a daily breach on its own, but the max-drawdown check runs first and returns, so `DONE_FOR_DAY` is never written and no session suspension is recorded.
5. Sets no resume time. The account does not come back at the next session open, and no later recovery in the market un-fails it.
6. Treats the 14:31 breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** The wrong implementation tests the daily rule first, or tests both and lets the last result win. Either one writes `DONE_FOR_DAY` over a permanent failure and brings the account back at the next session open - the most expensive ordering bug in this rule set. Two supporting points get built wrong alongside it. The daily loss limit is not a stop loss: the flatten it triggers takes seconds to fill, so it cannot catch equity on the way past the 47,900 daily floor and cannot rescue an account whose equity has already reached its Failure threshold. And this precedence is not an artifact of the daily floor sitting below the Failure threshold in this example - on a session like ED1, where the daily floor is the higher of the two, a single equity tick through both still fails the account, because max drawdown is checked first regardless of which floor sits higher.

## Daily limit: hard, and disabled

**Configuration.** Variations on the two daily-limit toggles, **Check daily drawdown** and **Soft breach**, over a \$50,000 account with a Global DD threshold of \$2,000 and therefore a **Failure threshold of \$48,000**.

**Floor.** **Check daily drawdown** decides whether the daily floor is tested at all; **Soft breach** decides whether reaching it pauses the account for the session or fails it permanently. ([how this works](https://tbignite.mintlify.site/drawdown-and-failure.md#daily-loss-limit))

### DH1 · With Soft breach off, the daily limit fails the account for good

![DH1](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/DH1.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=f6a02dccca2fb969447e9ae9f7ffc635)

DH1 - With Soft breach off, the daily limit fails the account for good.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Any of the three - Static, Trailing, or End of day |
| Global DD threshold | \$2,000 |
| Check daily drawdown | On |
| Daily drawdown | \$1,000 |
| Soft breach | **Off** |

This is a fresh account in its first session, so no anchor has ever moved up above 50,000: Static measures down from the \$50,000 initial balance, Trailing from peak equity, End of day from the highest closing balance, and on a first session all three sit at the same reference value of 50,000 - the anchor the floor is measured from. Equity only falls today, so it never sets a new high either and no anchor moves. Initial balance \$50,000 → **Failure threshold \$48,000**. Start-of-day balance \$50,000 → **daily floor \$49,000**, recomputed every session.

**What happens.** The account opens the session flat at \$50,000 - balance and equity are the same number - and holds one losing position the whole way down. Equity slides 50,000 → 49,700 → 49,400 → 49,150 and reaches **\$49,000 equity** on the session's last tick. **Current balance never moves off \$50,000** - every dollar of that \$1,000 loss is unrealized, sitting in the open position, and the daily total counts it anyway.

**The check.** Two floors, evaluated in a fixed order on every tick - max drawdown always first:

| # | Check | At equity 49,000 | Result |
| - | - | - | - |
| 1 | `equity <= Failure threshold` | `49,000 <= 48,000` | false - continue |
| 2 | Is Check daily drawdown on? | yes | continue |
| 3 | `equity <= daily floor` | `49,000 <= 49,000` | **true → daily breach** |
| 4 | Is Soft breach on? | **no** | fail, do not pause |

**What the system does.**

1. Fails the account permanently, on the tick where equity reaches \$49,000. Status → `FAILED`, **not** `DONE_FOR_DAY`.
2. Flattens all open positions and cancels every working and pending order - the same flatten a soft breach performs, and the same one a max-drawdown breach performs. Nothing is left on the account. Current balance is still \$50,000 on the breach tick because the flatten's fill is booked after it; where that fill lands is bookkeeping, and B2 shows it does not move the verdict.
3. Rejects every order submitted afterwards, stating that the daily drawdown of \$1,000.00 reached the allowed daily drawdown of \$1,000.00, so trading is no longer allowed on this account. That stated reason carries **no resume time**: a soft breach names the next session open, a failure never does.
4. Does **not** reactivate at the next session open, and does **not** recompute a daily floor for the next session. A failed account has no next session.
5. Ends the account without the Failure threshold ever being touched - equity stopped \$1,000 above it, at \$49,000 equity against a \$48,000 threshold, on a realized balance still showing \$50,000. That is why the drawdown type does not matter in this scenario.
6. Treats the breach on that closing tick as final. The flatten and cancel should leave the account holding nothing - no open position, no working or pending order. If anything does survive, it does not reopen the question: the account had already failed at \$49,000 equity, so no later fill, position, or balance movement is evaluated against it or can change the outcome.

**Common mistake.** Three ways this gets built wrong. **Soft breach off is not the same as Check daily drawdown off**: the master switch decides whether the daily floor is tested at all, and Soft breach only decides what a breach of it does, so turning Soft breach off makes the rule harsher, never absent. **The daily total includes unrealized P\&L**: the realized balance never leaves \$50,000 here, so a daily total computed from realized P\&L alone sits at zero all session and never fires. And the status is exactly `FAILED`, the same value a max-drawdown breach sets - only the stated reason differs, so a handler that maps every `FAILED` account to the max-drawdown reason states the wrong floor, and one that reuses the soft-breach text hands a permanently failed account a resume time it will never have.

### DD1 · Check daily drawdown off means the stored daily amount does nothing

![DD1](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/DD1.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=540db13bb2e8a3781c0fbb7e395ba70e)

DD1 - Check daily drawdown off means the stored daily amount does nothing.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Any of the three - Static, Trailing, or End of day |
| Global drawdown threshold | \$2,000 |
| Check daily drawdown | **Off** |
| Auto-flatten before market close | **Off** - swing phase, so the losing position is still open at the close and the loss stays unrealized |
| Daily drawdown | \$1,000 - stored on the phase, never enforced |
| Soft breach | Never consulted - the daily branch does not run |
| Start of session | Balance \$50,000, equity \$50,000 - the account is flat at the open, so both are the same number |

This is a fresh account, so no anchor has ever moved up above 50,000, and equity only falls in this session, so it never sets a new high either - all three drawdown types therefore measure down from the same reference value of 50,000, the anchor the floor is measured from. Anchor \$50,000 → **Failure threshold \$48,000**, the only live floor on this account, and equity is the value tested against it. The stored \$1,000 would put a daily floor at \$49,000, and the chart draws that level as a dashed reference line so you can watch equity pass straight through it - but with **Check daily drawdown** off that level is informational only: it is never compared against equity and never enforced.

**What happens.** A fresh account opens the session at \$50,000 in both balance and equity, and holds one losing position all session. Equity falls 50,000 → 49,500 → **49,000** → 48,600 and closes the session at an equity of **\$48,300**. Equity passes through 49,000, the level the stored \$1,000 would have produced, without anything happening, and keeps falling for two more ticks. **Current balance never moves off \$50,000 for the whole session** - the whole \$1,700 loss is still unrealized at every tick above, and with **Auto-flatten before market close** off nothing closes the position at the bell, so every figure the floor is tested against here is equity, not balance.

**The check.** With the master switch off there is only one floor, and it is tested against equity on every tick:

| # | Equity | Balance | `equity <= 48,000` (Failure threshold) | Is Check daily drawdown on? | Result |
| - | - | - | - | - | - |
| 1 (open) | 50,000 | 50,000 | false | no - the daily floor is never compared | continue |
| 2 | 49,500 | 50,000 | false | no | continue |
| 3 | **49,000** | 50,000 | false | no | continue - straight through the stored level |
| 4 | 48,600 | 50,000 | false | no | continue |
| 5 (close) | **48,300** | 50,000 | false | no | no status change - the account is never paused, flattened, or failed |

**What the system does.**

1. Nothing at all. No status change, no flatten, no cancellation, no rejected order - the account is still live and trading right through to the close, with its losing position open and unrealized, equity \$48,300 against a balance of \$50,000. Nothing evaluated after the close re-scores the session, and nothing resets: a losing session lifts no anchor whichever type is configured, so the position carries into the next session with the same \$48,000 Failure threshold still live against it - and because this is a swing phase, that floor is checked around the clock, not only while the session is open.
2. Never evaluates the daily branch. With **Check daily drawdown** off, the daily floor is never compared against equity and never enforced, whatever amount the phase carries. **Soft breach** is never reached either, because nothing reaches the branch that reads it, and the engine sets no `DONE_FOR_DAY` trading state - only a soft daily breach produces that. It is the engine's own state in any case, not a value you can look up in the Accounts grid: the CRM shows a soft-breached account as Active.
3. Still evaluates the Failure threshold on every tick, against equity. It is the only drawdown rule that can fail this account, and closing equity of \$48,300 finished \$300 above it - a further \$300 of unrealized loss, taking equity to \$48,000, would have failed the account permanently, because the comparison is `equity <= 48,000` and landing exactly on the floor is a breach, not a near miss.
4. Leaves the \$1,000 **Daily drawdown** amount exactly where it is on the phase. It becomes live the instant somebody turns **Check daily drawdown** on, with no other edit.

**Common mistake.** Reading the stored amount instead of the flag. The \$1,000 is right there in the phase configuration and a daily floor of \$49,000 is trivially computable from it - but computing it is not the same as enforcing it. An implementation that fires on the stored amount stops this account at tick 3, two ticks before the close: equity lands exactly on 49,000, `49,000 <= 49,000` is true, and the position is flattened and the account either paused for the day or failed depending on how **Soft breach** is set - on an account that is meant to go on trading. Read **Check daily drawdown** first, and treat the amount as meaningless until it is on. The second error is the opposite one: reading "no daily limit" as "no limit". The Failure threshold is live the entire time, and this account closed with equity \$300 away from it. The third is deriving the Failure threshold from the start-of-day balance instead of from the type's own anchor. That shortcut happens to give \$48,000 here only because the account is fresh; on a Trailing account whose peak equity, or an End of day account whose peak closing balance, had already moved up above \$50,000 in an earlier session, the anchor and the floor with it sit higher, and this same equity path can breach.

### DD2 · A daily limit equal to the Global DD threshold still pauses the account

![DD2](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/DD2.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=3ccf5f976280a66f9a1aab9f7427ad42)

DD2 - A daily limit equal to the Global DD threshold still pauses the account.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Static |
| Global DD threshold | \$2,000 |
| Check daily drawdown | On |
| Daily drawdown | \$2,000 - set equal to the Global DD threshold, intending "no daily limit" |
| Soft breach | On |

Initial balance \$50,000 → **Failure threshold \$48,000** of equity, fixed permanently. A Static account measures down from the Initial balance - the anchor the floor is measured from - so banking profit never moves it. The account has since made \$10,000, so its start-of-day balance for this session is \$60,000 → **daily floor \$58,000** (60,000 − 2,000), recomputed at every session open from the balance the account starts that session with. The two floors are now \$10,000 apart.

**What happens.** The account opens the session flat at \$60,000 - balance and equity the same number, \$12,000 of equity clear of its Failure threshold - and takes one losing position. Equity falls 60,000 → 59,500 → 59,000 → 58,500 and reaches **\$58,000**. **Current balance never moves off \$60,000**: the whole \$2,000 loss is unrealized, and the daily rule counts it anyway.

**The check.** Two floors, evaluated in a fixed order on every tick - max drawdown always first:

| # | Check | At equity 58,000 | Result |
| - | - | - | - |
| 1 | `equity <= Failure threshold` | `58,000 <= 48,000` | false - continue |
| 2 | Is Check daily drawdown on? | yes | continue |
| 3 | `equity <= daily floor` | `58,000 <= 58,000` | **true → daily breach** |
| 4 | Is Soft breach on? | yes | pause, do not fail |

**What the system does.**

1. Pauses the account for the rest of the session with equity at \$58,000, \$10,000 above its Failure threshold. Status → `DONE_FOR_DAY`, **not** `FAILED`.
2. Flattens all open positions and cancels all working orders. The flatten and cancel are identical to a hard breach; only what happens afterwards differs.
3. Rejects new orders for the rest of the session, stating that the account hit its daily drawdown limit, at a daily equity loss of \$2,000.00 against an allowed \$2,000.00.
4. Reactivates at the next session open (6:00 PM EST for futures) and recomputes the daily floor from the new start-of-day balance. The flatten realizes the \$2,000 open loss, so barring slippage the account ends the session flat at \$58,000 - balance and equity the same number - and tomorrow's daily floor is \$56,000. The cap follows the account down as well as up.
5. Leaves the Failure threshold untouched at \$48,000 of equity. A daily breach never moves it, and on a Static account nothing ever does.
6. Ends the trading session for this account **without failing it**. The flatten and cancel should leave nothing open - no position, no working order. If any position or order does survive, it changes nothing in either direction: it does not let the account keep trading this session, and it does not turn the pause into a failure. The status stays `DONE_FOR_DAY`, and the account reactivates at the next session open.

**Common mistake.** Expressing "this product has no daily limit" by setting **Daily drawdown** equal to the **Global DD threshold**. On a Static account the Failure threshold is measured from the Initial balance and never moves, while the daily floor is measured from that session's start-of-day balance and climbs with the account, so the moment the account is in profit the daily floor sits above the Failure threshold and becomes the floor equity reaches first. Here it closed the account out for the session \$10,000 early. It is easy to miss because on a **Trailing** account that is still trailing, the same two equal amounts really are inert - the Failure threshold sits at or above the daily floor at every moment, so max drawdown is always reached first, or on the same tick, where a hard breach wins. Once **Lock trailing drawdown** has frozen the threshold at its ceiling, that stops being true: a locked account behaves like a Static one, so the same trap returns the moment it is in profit. On a 50K account whose floor has locked at a \$100 offset, the Failure threshold is stuck at \$50,100 of equity while a \$60,000 start-of-day balance puts the daily floor at \$58,000 - exactly the live \$2,000 cap this scenario warns about. Lock offsets are set per firm, and sometimes per challenge - anywhere from \$0 upward - so read **Max trailing DD limit** from the phase configuration rather than assuming a value, and read **Lock trailing drawdown** to know whether the ceiling applies at all. Test the intent on a profitable Static account, not a flat trailing one. The only way to switch the daily rule off is **Check daily drawdown** off (see DD1), and a valid phase keeps **Daily drawdown** strictly under the **Global DD threshold** unless that switch is off - this configuration satisfies neither and should be caught in configuration review.

## Breach mechanics

**Configuration.** Any drawdown type - Static, Trailing, or End of day · Global DD threshold set so the Failure threshold lands at \$49,000 · Check daily drawdown **off**, so the max-drawdown floor is the only one live and every breach in this section is unambiguously hard.

**Floor.** \$49,000 throughout, from whichever anchor - the Initial balance, Peak equity, or EOD peak balance the floor is measured down from - the type supplies. These scenarios are about the tick that reaches it and what happens next, not about where the number came from. ([how this works](https://tbignite.mintlify.site/drawdown-and-failure.md#the-breach-is-the-touch))

### B1 · Reaching the floor fails the account, and no later rally undoes it

![B1](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/B1.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=00c2906fff9eb2b8179b04fd61a84b17)

B1 - Reaching the floor fails the account, and no later rally undoes it.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Any - Static, Trailing, or End of day |
| Lock trailing drawdown | Off - with the lock on, a trailing floor is additionally capped at `Initial balance + Max trailing DD limit`, which changes the number the floor lands on but nothing about the mechanics below |
| Global DD threshold | Any value that puts the Failure threshold at \$49,000 |
| Check daily drawdown | Off - only the max-drawdown floor is live |
| Soft breach | Does not apply - it is daily-only, and can never soften a max-drawdown breach |

Every type derives the floor the same way: `Failure threshold = anchor - Global DD threshold`, where the anchor is the reference value the floor is measured down from, and where - on a trailing account with the lock on - the result is additionally capped at the lock ceiling. With the lock off, as configured here, all three land on **\$49,000**: Static from a \$50,000 initial balance with a \$1,000 threshold, End of day from a \$51,000 EOD peak balance with a \$2,000 threshold, or Trailing from a \$51,500 peak equity with a \$2,500 threshold. Nothing in this session makes a new high, so the floor holds at \$49,000 all day whichever type produced it. B1 is about the tick that reaches it, so the type behind the number changes nothing below.

**What happens.** The session opens flat at \$50,500 - with nothing open, balance and equity are the same number. The trader takes a position and it moves against them: equity \$49,600 at 10:15, then equity \$48,900 at 11:00 - through the floor, not onto it. **Current balance is still \$50,500** at that moment: the \$1,600 loss is entirely unrealized, and it is that unrealized loss that breaches the account. From 11:00 the account held no position and no order. Everything the chart plots after 11:00 - the equity line and the balance line both - is the market's path, not this account's: had the position been left to run, equity would have been back to \$49,800 by 13:00 and \$50,600 by 14:30, and the day would have closed at \$51,200. None of those are numbers this account could reach.

**The check.** On every tick, `equity <= Failure threshold`:

| Time | Current balance | Equity | Failure threshold | Result |
| - | - | - | - | - |
| 09:30 | 50,500 | 50,500 | 49,000 | false |
| 10:15 | 50,500 | 49,600 | 49,000 | false |
| 11:00 | 50,500 | **48,900** | 49,000 | **true → fail** |
| 13:00 | - | 49,800 | 49,000 | never evaluated - already failed |
| 14:30 | - | 50,600 | 49,000 | never evaluated - already failed |
| 16:00 | - | 51,200 | 49,000 | never evaluated - already failed |

The dashes are not missing data. This account's own balance after the flatten is **\$48,900** - the \$50,500 it was carrying, less the \$1,600 the flatten realized (before any slippage on the fills) - so, exactly like B2, it ends below the \$49,000 floor. That is expected and is not a second breach. The \$50,500 and \$51,200 the chart plots on the balance line after 11:00 belong to the same counterfactual account as the equity line.

**What the system does.**

1. Fails the account at 11:00, on the tick where equity reaches \$48,900. Status → `FAILED`. The failure is stamped at that tick - not at the close, and not when the last liquidation fill comes back.
2. Flattens all open positions and cancels all working and pending orders. The flatten holds for about 6 seconds, or until every position is confirmed closed, whichever is longer, and nothing can be submitted during that window.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$48,900.00 has reached or fallen below the failure threshold of \$49,000.00, so trading is no longer allowed on this account.
4. Reads both numbers in that reason off this account: the equity on the breaching tick, and the Failure threshold derived from its own phase as `anchor - Global DD threshold`, capped by the lock ceiling on a locked trailing account. Neither is a fixed drawdown amount, and neither may be hardcoded.
5. Gives no resume time. A max-drawdown breach is terminal, so a "suspended until…" phrasing is wrong here - that wording belongs only to a soft daily breach, and this account has no daily rule running at all.
6. Treats the 11:00 breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** Three implementations get this wrong, and all three fail in the same direction - they let the recovery count.

* **Evaluating on the closing value** passes the account outright: the counterfactual line closes at \$51,200 on both equity and balance, well clear of the \$49,000 floor. The account failed at 11:00 and held nothing afterwards, so that close is a number it could never reach. Its own balance at the close is \$48,900.
* **Evaluating on balance instead of equity** misses the breach for a second, independent reason. Current balance was \$50,500 at 11:00 and never went near \$49,000 - the open position's \$1,600 unrealized loss did all the damage. The low that matters is the **equity** low.
* **Replaying the tape in a backfill job** and marking the account to it credits the account with a rally it could not have taken part in. Once the breach fires the replay has to stop for that account: the flatten at 11:00 removed every position, so no price after 11:00 is its P\&L.

### B2 · The close-out fills below the floor, but the account failed at the floor

![B2](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/B2.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=a214d16ec632d757defec962456bb29d)

B2 - The close-out fills below the floor, but the account failed at the floor.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Any - Static, Trailing, or End of day |
| Global DD threshold | Any value that puts the Failure threshold at \$49,000 |
| Check daily drawdown | Off - only the max-drawdown floor is live |
| Soft breach | Does not apply - it is daily-only, and can never soften a max-drawdown breach |

Same derivation as B1: `Failure threshold = anchor - Global DD threshold`, the anchor being the reference value the floor is measured down from, and it lands on **\$49,000** whichever of the three types produced it - Static from a \$50,000 initial balance with a \$1,000 threshold, End of day from a \$51,000 EOD peak balance with a \$2,000 threshold, Trailing from a \$51,500 peak equity with a \$2,500 threshold. What is different here is what the chart plots after the breach: in B1 every point past the breaching tick is the market's path - the account held nothing - while here the last two points are the flatten itself filling, real fills seconds apart at prices worse than the marks.

**What happens.** The session opens flat at \$49,600 - equity and Current balance the same number, nothing open. The trader takes a position and it moves against them: equity \$49,300 while **Current balance stays \$49,600** (the position \$300 in the red, unrealized), then equity reaches exactly **\$49,000** - the floor to the cent, Current balance still \$49,600, so the position is \$600 in the red. That tick is the breach, and the flatten starts on it. The liquidation is not instant: it takes real seconds to fill, and those fills land below the marks, so Current balance prints \$48,600 and then settles at **\$48,400** once the last contract is out. That extra loss is real - the position was genuinely still there when the floor was reached, and its realized loss is what walked the balance down. The account finishes flat at \$48,400, equity and balance the same number - \$600 below the floor that triggered the flatten.

**The check.** On every tick, `equity <= Failure threshold`:

| Tick | Moment | Current balance | Equity | Failure threshold | Result |
| - | - | - | - | - | - |
| 1 | Flat at the open | 49,600 | 49,600 | 49,000 | false |
| 2 | Position 300 down, still open | 49,600 | 49,300 | 49,000 | false |
| 3 | Position 600 down, still open | 49,600 | **49,000** | 49,000 | **true → fail** - equal counts |
| 4 | Flatten fills landing | 48,600 | 48,600 | 49,000 | not evaluated - already failed |
| 5 | Last fill in, account flat | 48,400 | 48,400 | 49,000 | not evaluated - already failed |

On ticks 4 and 5 Current balance and Equity are the same number, so each plotted point is a post-fill mark - nothing open is being valued at either instant. The liquidation completed across the few seconds after tick 3, and because those fills landed below the \$49,000 mark the realized balance walked down to \$48,600 and then \$48,400 rather than settling at the floor. Ticks 4 and 5 are **seconds** after tick 3, not hours; the chart plots them on the same session axis, which makes them look like the rest of the afternoon.

**What the system does.**

1. Fails on tick 3, where equity equals 49,000 exactly. Status → `FAILED`. The comparison is `equity <= threshold`, so landing on the number is a breach, not a near miss.
2. Flattens all open positions and cancels all working and pending orders, holding for about 6 seconds or until every position is confirmed closed, whichever is longer. The fills that print on ticks 4 and 5 are this flatten completing.
3. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$49,000.00 has reached or fallen below the failure threshold of \$49,000.00, so trading is no longer allowed on this account. The equity in that reason is the value **on the breaching tick**, not the \$48,400 the account settled at.
4. Does **not** fire a second time on the \$48,600 or \$48,400 marks - where equity and Current balance are the same number. The account is already `FAILED`, the check does not run on it again, so there is no second flatten and no second stated reason.
5. Leaves the ending balance where the fills put it. \$48,400 against a \$49,000 floor is an ordinary result on a fast move - not a deeper breach, not a correction to make, and not a broken account.
6. Treats the tick-3 breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** Four here, and every one of them comes from reading the wrong number, or reading it twice.

* **Taking the failing equity from the account after the flatten settles** puts \$48,400 into the stated reason instead of \$49,000. The reason then check against neither the chart nor the threshold arithmetic. Capture equity on the breaching tick, at the moment the comparison turns true.
* **Re-running the check on the post-liquidation state** produces a second breach on the \$48,600 or \$48,400 mark: duplicate failure records, duplicate rejection reasons, and in the worst version a second flatten fired at an account with nothing left to close.
* **Suppressing or reversing the breach because the balance ended below the floor**, on the theory that a fill that bad must be an error. It is expected. A floor is a monitoring threshold that triggers a flatten, not a stop loss - nothing about it guarantees an exit at the level.
* **Alerting on "Current balance below the Failure threshold" as an invalid state.** It is normal, and it will page someone in every fast market. The state that genuinely is invalid is a **working or pending order still live on a breached account** - that one is a bug in the flatten and worth investigating.

### B3 · A position that outlives the flatten does not change the verdict

![B3](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/B3.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=357bf54cebea54e046c9fa484d5fa6bb)

B3 - A position that outlives the flatten does not change the verdict.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Any - Static, Trailing, or End of day |
| Global DD threshold | Any value that puts the Failure threshold at \$49,000 |
| Check daily drawdown | Off |

The Failure threshold is \$49,000 for the whole session, from whichever anchor the chosen type supplies - initial balance, peak equity, or EOD peak balance. The number is the same for all three types, so the anchor does not matter here; what matters is the tick that reaches \$49,000 and everything after it. With `Check daily drawdown` off, the max-drawdown floor is the only line in play, and reaching it fails the account permanently.

**What happens.** The account opens the session at \$50,200 with more than one position already open; balance and equity are level at that figure. Equity slides through the morning - \$49,600, then \$49,000 at 11:00 AM - while the realized balance stays at \$50,200, because nothing has been closed and the whole \$1,200 loss is still unrealized. The \$49,000 touch fails the account. The flatten fires and closes the losing positions, realizing \$900 of that loss, so the balance settles at \$49,300 - but **one position survives the flatten** and is still open at the close. That survival is an anomaly, not trading: see step 5. The position then recovers, and equity climbs to \$49,400, \$50,000, and \$50,500. When the platform closes it out at the end of the day it realizes \$1,200, so the balance ends at \$50,500 as well, \$1,500 above the failure threshold. None of this is the trader acting - from 11:00 AM the account rejects every order submitted to it.

**The check.** The comparison is `equity <= Failure threshold`, run on every tick until the breach and never again:

| Time | Balance | Equity | Threshold | Result |
| - | - | - | - | - |
| 09:30 (open) | 50,200 | 50,200 | 49,000 | false |
| Mid-morning | 50,200 | 49,600 | 49,000 | false |
| 11:00 | 50,200 → 49,300 | **49,000** | 49,000 | **true → fail** |
| 13:00 | 49,300 | 49,400 | 49,000 | not evaluated - already failed |
| 15:00 | 49,300 | 50,000 | 49,000 | not evaluated - already failed |
| 16:00 (close) | 49,300 → 50,500 | 50,500 | 49,000 | not evaluated - already failed |

At 11:00 the value compared is **equity**, \$49,000, while the realized **balance** is still \$50,200 - the flatten then settles the balance to \$49,300 on that same tick. Because the comparison is `equity <= threshold`, equity landing exactly on \$49,000 is a breach, not a near miss. After 11:00 the two columns differ by the surviving position's open P\&L: \$49,300 balance against \$49,000 equity is that position \$300 down, and at 15:00 the same pair, \$49,300 against \$50,000, is that position \$700 up. They meet again only at the close, when it is closed out.

**What the system does.**

1. Fails the account at 11:00 AM, on the tick where equity reaches \$49,000 - while the realized balance is still \$50,200. Status → `FAILED`.
2. Flattens the open positions and cancels all working and pending orders. Closing the losing ones realizes \$900 and settles the balance at \$49,300.
3. Rejects every order the trader or their strategy submits afterwards. The stated reason is the breach itself - the account's equity of \$49,000.00 has reached or fallen below the failure threshold of \$49,000.00, so trading is no longer allowed on this account. It carries no resume time, because a max-drawdown breach has none. The platform's own liquidation of the stray position is not one of those orders.
4. Records the failure at 11:00 AM, with the equity and the threshold as they stood at that instant. That record is the authoritative one - check to it, not to any later balance.
5. Treats the 11:00 AM breach as final. The flatten and cancel must leave the account holding nothing - no open position, no working order, no partial exposure. The position that survived here is an invalid state and a bug in the flatten, never a legitimate trade and never approved behaviour: expect the platform to close it, and if it is still showing, flatten it by hand from the Accounts grid; if that does not clear it either, raise it with the Tickblaze team. Its P\&L is nonetheless real money and really does move the balance - that is how the account reaches \$50,500, above its own failure threshold - but none of it is evaluated. The account had already failed at that instant, so no later fill, position, or balance movement is measured against the threshold. It can neither un-fail the account nor fail it a second time.

**Common mistake.** Reading this account's state from its closing balance. It ends the day with a balance of \$50,500 - \$1,500 clear of the threshold - and looks perfectly healthy, yet it failed five hours earlier at 11:00 AM. A check that reads the end-of-day snapshot passes an account that is already `FAILED`; check to the recorded failure at 11:00 AM instead. The same error in reverse is treating the surviving position's recovery as evidence the breach was a false alarm. That position should never have been open at all - a flatten bug to investigate, not a legitimate trade - and its profit, real as it is, lands on an account that had already failed and is never evaluated against the threshold.

> [!NOTE]
>
> **A failure with no trading behind it is not one of these.** If an account shows as **Failed** but has no trades, no positions and no orders at all, it never moved its equity, so it never reached its threshold. Check [Account events](https://tbignite.mintlify.site/account-details.md) first - it may have been failed **manually**, which is deliberate. If nothing there explains it, the account can be reactivated. See [A failure on an account that never traded](https://tbignite.mintlify.site/drawdown-and-failure.md#a-failure-on-an-account-that-never-traded).

## Swing accounts

**Configuration.** **Auto-flatten before market close = off**, which is what makes an account swing. Swing is not a fourth drawdown type: it sits on top of `Static`, `Trailing`, or `End of day` and changes only how that type's floor is evaluated and carried across the overnight boundary. The swing examples below all run **Check daily drawdown off**, so these accounts have one floor, not two - and that matches every swing product in use today, which all run **max drawdown only**. See [swing accounts and the daily limit](https://tbignite.mintlify.site/drawdown-and-failure.md#swing-accounts-and-the-daily-limit) before configuring the combination.

**Floor.** Whichever floor the base type gives, checked on equity around the clock, including overnight, and, on `End of day`, carried at the session boundary on closing **equity** rather than on the realized closing balance. ([how this works](https://tbignite.mintlify.site/drawdown-and-failure.md#swing-accounts))

### W1 · An open position at the close raises tomorrow's floor by its profit

![W1](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/W1.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=f323b50faf46893e9b0ca33e23ec69f3)

W1 - An open position at the close raises tomorrow's floor by its profit.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | End of day |
| Global drawdown threshold | \$2,000 |
| Check daily drawdown | Off |
| Auto-flatten before market close | Off - this is what makes the account swing |

The EOD peak balance (the anchor the floor is measured down from) stands at \$50,000 going into this session, so the **Failure threshold is \$48,000** for the whole session. The closing tick is still checked against \$48,000; the threshold only moves once the close has run and the anchor has carried. On a swing account that anchor is carried across the session boundary on the **closing equity**, not on the realized closing balance.

**What happens.** The trader holds a long position into the session close and does not close it - with Auto-flatten before market close off, the account is allowed to carry it. The position gains into the close and equity climbs \$50,000 → \$50,300 → \$50,600 → \$50,800. None of that is realized: **Current balance sits at \$50,000 the entire time.** At the close the position is still open and \$800 in profit, so closing equity is \$50,800. The position is still held, and equity is still \$50,800, when the next session opens (6:00 PM EST for futures).

**The check.** Two separate things run here: the failure check, on every tick, and the anchor carry, once, at the close.

| Moment | Balance | Equity | Failure threshold | `equity <= threshold` |
| - | - | - | - | - |
| Day 1, position open | 50,000 | 50,000 | 48,000 | false |
| Day 1, +300 unrealized | 50,000 | 50,300 | 48,000 | false |
| Day 1, +600 unrealized | 50,000 | 50,600 | 48,000 | false |
| Session close | 50,000 | **50,800** | 48,000 *(the carry below then raises it to 48,800 for the next session)* | false |
| Next session open | 50,000 | 50,800 | **48,800** | false |

The chart plots each value as it stands *after* that point's update, so at the close it draws the anchor at 50,800 and the floor at 48,800 - the pair the next session inherits, not the pair the closing tick was measured against.

The carry, at the close only:

| # | Step | Value |
| - | - | - |
| 1 | Is a position open at the boundary? | yes - so the carry reads equity |
| 2 | Closing equity | 50,000 balance + 800 unrealized = **50,800** |
| 3 | New EOD peak balance | the higher of 50,000 and 50,800 = **50,800** |
| 4 | New Failure threshold | 50,800 - 2,000 = **\$48,800** |

**What the system does.**

1. Does not fail the account anywhere on this path. Equity never reaches the Failure threshold, so `equity <= threshold` is false on every tick, nothing is set to `FAILED`, and the account stays `ACTIVE`. Nor can it pause: **Check daily drawdown** is off, so there is no daily floor in play at all and the daily branch is never evaluated.
2. Leaves the position open across the boundary and cancels nothing. Auto-flatten before market close is off, so there is no forced liquidation at the close.
3. At the close, moves the EOD peak balance up to \$50,800 - the closing **equity**, which includes the open position's \$800 of unrealized profit. A flat-at-close account never faces this question - it holds nothing at the boundary, so its closing balance and its closing equity are the same number. The ambiguity exists here only because a position is still open, and it is resolved on equity.
4. Recomputes the Failure threshold once, to 50,800 - 2,000 = \$48,800, and uses \$50,800 as the next session's starting basis. Day N's closing value is day N+1's opening value, and on a swing account that value is equity.
5. Keeps evaluating `equity <= 48,800` right through the overnight, not only once the market reopens. The threshold holds one value between closes, but it is checked on every tick around the clock - its value is fixed, its enforcement is not.
6. Does **not** move the threshold down at any later close. Had the position been \$800 *down* at the boundary instead, closing equity would be \$49,200 - not a new high - so the EOD peak balance would stay \$50,000 and the Failure threshold stay \$48,000.

**Common mistake.** Carrying the realized closing balance on a swing account. That leaves the EOD peak balance at \$50,000 and the Failure threshold at \$48,000, hands the account \$800 of room it should not have, and lets it survive a next-day equity dip to \$48,700 that should have failed it - `48,700 <= 48,800` is true against the correct floor. The second trap is reading this as a contradiction of [E2](https://tbignite.mintlify.site/drawdown-scenarios.md#end-of-day-max-drawdown-only), where an intraday high does not move the anchor. It is not: \$50,800 is the closing **equity** the session actually **closed** at, not an unrealized equity high reached at 11:00 and given back. An unrealized high that is gone before the boundary still moves nothing - what counts is the value standing at the boundary. One configuration detail to read rather than assume: some firms carry the anchor on the higher of closing balance and closing equity rather than on closing equity alone. Both give \$50,800 here because the open position is in profit; the two differ only when the boundary position is at a loss, and the failure check stays on equity either way.

### W2 · An overnight loss fails the account before the next session opens

![W2](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/W2.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=20874b3a3faed53bb82c9c71496aeca9)

W2 - An overnight loss fails the account before the next session opens.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | End of day |
| Global drawdown threshold | \$2,000 |
| Check daily drawdown | Off |
| Auto-flatten before market close | Off - this is what makes the account swing |

The EOD peak balance (the anchor the floor is measured down from) stands at \$50,000, so **floor = EOD peak balance − \$2,000 = \$50,000 − \$2,000 = \$48,000** - the **Failure threshold is \$48,000**. The account is carrying a position across the close, so the anchor is taken from *closing equity*: equity at the close is \$50,000, `max(50,000, 50,000)` is 50,000, and the anchor does not move. The floor's value is fixed for the session, and on a swing account it stays in force right through the overnight as well - the value does not change, but it is checked on every tick, around the clock.

**What happens.** The trader carries a short across the session close with the realized balance at \$50,000. Nothing is realized while the position is held, so **Current balance holds at \$50,000 through the whole slide** - every dollar of the move is unrealized, and equity is the only value that changes. The short runs against them through the overnight session: equity falls \$49,500 → \$48,900 → \$48,300 → \$47,900, a \$2,100 unrealized loss against the flat \$50,000 balance. At \$47,900 in equity the account breaches and is flattened. The market keeps moving after that - it would have carried equity back to \$48,200 overnight and to \$48,600 by the next session open (6:00 PM ET for futures) - but the account was flat from the breach instant, so that later line is the market's path, not the account's.

**The check.** One floor only - Check daily drawdown is off, so the daily branch never runs at all. The test is `equity <= failure threshold`, measured on equity, on every tick, including through the overnight session:

| Moment | Equity | Failure threshold | `equity <= threshold` |
| - | - | - | - |
| At the close | 50,000 | 48,000 | false |
| Overnight | 49,500 | 48,000 | false |
| Overnight | 48,900 | 48,000 | false |
| Overnight | 48,300 | 48,000 | false |
| Overnight | **47,900** | 48,000 | **true → fail** |
| Overnight | 48,200 - market, not the account | 48,000 | not evaluated - already failed |
| Next session open | 48,600 - market, not the account | 48,000 | not evaluated - already failed |

The last two rows are counterfactual. From the \$47,900 touch onward the account held nothing, so those figures are what equity *would have* read had the position still been open. That is why the chart draws both the equity line and the Current balance line dashed to the right of the breach point.

**What the system does.**

1. Fails the account on the overnight tick where equity reaches \$47,900, in the overnight session, hours before the trader is back at the screen. `47,900 <= 48,000` is true, so status → `FAILED`.
2. Flattens all open positions and cancels all working and pending orders at that instant - not deferred to the next open. The flatten holds for a minimum of about 6 seconds, or until every position is confirmed closed, whichever is longer, and the fills can land below 48,000. That flatten realizes the \$2,100 that was unrealized a moment earlier, so barring slippage the balance lands near \$47,900. The balance therefore leaves \$50,000 at the breach - the flat \$50,000 line drawn past the breach point belongs to the same counterfactual tail as the equity line, not to the account. Either way the fill price moves the closing balance, not the verdict: the breach was the touch at \$47,900 in equity.
3. Rejects every order submitted afterwards. Each rejection carries the breach as its reason - equity of \$47,900.00 against a failure threshold of \$48,000.00 - and no further order is accepted on the account. Both figures are specific to this account: the equity is its live equity on the breach tick, and the failure threshold is derived, never stored, as `EOD peak balance − Global drawdown threshold`.
4. Runs no daily check and states no daily reason. Check daily drawdown is off on this account, so the daily branch has no threshold to evaluate. There is consequently no soft-breach path here: a soft daily breach would have set the trading state → `DONE_FOR_DAY`, which is the engine's state, not a value you can look up in the Accounts grid - the CRM still shows such an account as Active. Nothing can set it with the daily rule switched off, and a max-drawdown breach has no pause form in any case.
5. Does not fall back to a realized-only figure outside the main session. Current balance was \$50,000 for the whole slide and never crossed anything; the \$2,100 that failed this account was an entirely unrealized swing in equity.
6. Does not re-evaluate the recovery to \$48,200 overnight and \$48,600 at the next session open. Those points are the market's path, not the account's - the account had already failed at the \$47,900 equity touch and held nothing from that instant, so nothing after it is measured against the floor.
7. Treats the \$47,900 overnight equity breach as final. A breached account must be fully flat, with every open position closed and every working and pending order cancelled. A position or resting order still showing after the breach is an invalid state and a bug in the flatten, not a legitimate position - investigate it. It does not change the outcome: the breach was the touch at \$47,900 in equity, so no later fill, position, or balance movement is measured against the floor or can reopen the question.

**Common mistake.** Two wrong implementations, both erring in the same direction. Evaluating a swing account only during session hours skips this breach entirely; the account then presents at the next open with equity of \$48,600 - clear of the floor - and looks like it never breached. Evaluating on the realized balance misses it too, because the balance never left \$50,000 while the position was held. On a swing account the check is `equity <= failure threshold`, continuously, including overnight.

### W3 · An overnight gain raises the floor, and falling back fails the account

![W3](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/W3.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=1b883791b49170333431ce3781fbca39)

W3 - An overnight gain raises the floor, and falling back fails the account.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Trailing (intraday) |
| Global DD threshold | \$2,500 |
| Lock trailing drawdown | Off |
| Check daily drawdown | Off |
| Auto-flatten before market close | Off - this is what makes the account swing |

Peak equity (the anchor the floor is measured down from) is the highest equity the account has ever reached, updated on every tick and including unrealized profit. Going into the close it is \$50,000, so 50,000 - 2,500 → **Failure threshold \$47,500**. On a swing account the peak keeps updating right through the overnight - there is no session reset. With `Lock trailing drawdown` off there is no ceiling either, so the threshold can climb without limit as equity makes new highs.

**What happens.** The trader carries a long across the session close with the realized balance at \$50,000, and nothing is realized overnight. Overnight the position gains: equity reaches \$50,900, lifting peak equity to \$50,900 and the threshold to \$48,400, then reaches \$52,000, lifting peak equity to \$52,000 and the threshold to **\$49,500**. The position then gives the gain back - equity \$51,000, then \$49,400. The threshold stays at \$49,500 the whole way down. Equity is still \$49,400 at the next session open, because after the breach the flatten realizes the balance at \$49,400 and the account holds nothing.

**The check.** Peak equity is recomputed first on every tick, then `equity <= threshold` is tested against the threshold it produces:

| Moment | Equity | Peak equity | Failure threshold | `equity <= threshold` |
| - | - | - | - | - |
| At the close | 50,000 | 50,000 | 47,500 | false |
| Overnight | 50,900 | 50,900 | 48,400 | false |
| Overnight | 52,000 | **52,000** | **49,500** | false |
| Overnight | 51,000 | 52,000 | 49,500 | false |
| Overnight | **49,400** | 52,000 | 49,500 | **true → fail** |
| Next session open | 49,400 | 52,000 | 49,500 | never evaluated - already failed |

**Current balance** is \$50,000 on every row until the breach, because the entire round-trip is unrealized. Equity is the value being compared, and equity is what reaches 49,400.

**What the system does.**

1. Moves peak equity up on overnight ticks, on unrealized profit the trader never banked. \$52,000 is the highest equity the account reached, and it sets the threshold at 52,000 - 2,500 = \$49,500.
2. Does **not** move the threshold back down when equity falls to \$51,000. Peak equity is a running maximum and only ever rises.
3. Fails the account on the overnight tick where equity reaches \$49,400. Status → `FAILED`.
4. Flattens the long and cancels all working and pending orders at that instant.
5. Rejects every order submitted afterwards. The stated reason is the breach itself - the account's equity of \$49,400.00 has reached or fallen below the failure threshold of \$49,500.00, so trading is no longer allowed on this account.
6. Does **not** require the account to be far down to do it: on the tick that fails it, equity is only \$600 below the \$50,000 the trader carried into the night, and they placed no order all night. The threshold rose to meet them.
7. Applies no session reset to the peak. Trailing plus swing is the tightest combination these settings allow - a supported configuration, though End of day is the more common pairing with swing.
8. Treats the overnight breach as final - nothing that survives the flatten changes the outcome. See [a position that outlives the flatten](https://tbignite.mintlify.site/drawdown-and-failure.md#a-position-that-outlives-the-flatten).

**Common mistake.** Freezing the peak at the session close and resuming the trail at the next open inverts the result: peak equity would stay \$50,000, the threshold \$47,500, and this account would survive the night instead of failing. There is no overnight freeze of the peak on a trailing account whose positions are allowed to stay open - it keeps trailing around the clock. The other error is tracking the peak on realized balance: **Current balance** was \$50,000 all night, so a balance-based peak never moves, never lifts the threshold to \$49,500, and never fails anything here.

### W4 · A fixed floor never moves, yet it still fails the account overnight

![W4](https://mintcdn.com/tbignite/a_HuvRSRGCAuRzpO/images/scenarios/W4.png?fit=max\&auto=format\&n=a_HuvRSRGCAuRzpO\&q=85\&s=362f86748682dcaa2b5dee1847393153)

W4 - A fixed floor never moves, yet it still fails the account overnight.

**Setup**

| Field | Value |
| - | - |
| Global drawdown type | Static |
| Global DD threshold | \$3,000 |
| Check daily drawdown | Off |
| Auto-flatten before market close | Off - this is what makes it a swing account |

Initial balance \$50,000 − \$3,000 = **Failure threshold \$47,000**, fixed for the life of the account. The floor is measured down from the initial balance, and the initial balance never changes, so a static swing account has nothing to carry across the session boundary.

**What happens.** The trader carries an open position through the session close; at that moment the realized balance is \$50,000 and equity is \$50,000. Because **Auto-flatten before market close = Off**, the position is not closed out at the session boundary. It rides across it and keeps being marked to the market all night, so its unrealized P\&L keeps moving the account's equity while the trader is away from the screen. Equity falls \$48,800 → \$47,600 → \$46,800. The whole move is unrealized, so it shows up in equity while the **realized balance reads \$50,000 right up to the breach** - nothing is realized until the breach fires and the flatten closes the position.

The market keeps going after that, back through \$47,900 and up to \$49,000 by the next session open. Those last two points are **counterfactual**: the account was flattened at \$46,800 and held nothing from that tick onward, so they are the market's path, not the account's. They are drawn dashed on the chart for exactly that reason.

**The check.**

| Moment | Equity | Failure threshold | `equity <= threshold` |
| - | - | - | - |
| At the close | 50,000 | 47,000 | false |
| Overnight | 48,800 | 47,000 | false |
| Overnight | 47,600 | 47,000 | false |
| Overnight | **46,800** | 47,000 | **true → fail** |
| Overnight (counterfactual) | 47,900 | 47,000 | never evaluated - already failed, and holding nothing |
| Next session open (counterfactual) | 49,000 | 47,000 | never evaluated - already failed, and holding nothing |

**What the system does.**

1. Fails the account on the overnight tick where equity reaches \$46,800. Status → `FAILED`.
2. Flattens the position and cancels all working orders at that moment. Nothing is left on the account - no open position, no resting order, no partial exposure - so from \$46,800 onward the account holds nothing at all. The flatten realizes the loss, so the balance stops reading \$50,000 there: it settles at whatever the liquidation actually fills, near the \$46,800 that triggered the breach. The flatten holds for about six seconds, or until every position is confirmed closed, and on a fast move those fills can land worse than the floor - which changes the closing balance, never the verdict.
3. Rejects every new order the trader submits afterwards. The stated reason is the breach itself - the account's equity of \$46,800.00 has reached or fallen below the failure threshold of \$47,000.00, so trading is no longer allowed on this account.
4. Never moves the threshold. \$47,000 on day one and \$47,000 on every day after: no peak to track, no close to sample, no carry to compute. Swing changes exactly one thing on a static account - **when** the check runs, never **where** the floor sits. The floor is live around the clock, which is why an overnight move can breach the account before the next session ever opens.
5. Treats the \$46,800 overnight breach as final. Nothing at or after the touch is evaluated against the account, and nothing at or after the touch can change the outcome. Because the flatten leaves the account holding nothing, equity **would have** recovered to \$47,900 and then \$49,000 by the next open only in the sense that the market recovered - the account was not on that path and could never actually have reached those numbers. And if a live account ever does show an open position or a working order after a breach event, treat it as a bug in the flatten to investigate, not as legitimate trading: the recorded failure stands regardless, and any P\&L a stray position throws off moves the balance without putting the outcome back in question.

**Common mistake.** Reading the last point and passing the account. Equity there is \$49,000, comfortably clear of \$47,000 - and it is irrelevant twice over. The account failed hours earlier at \$46,800, and it was flat from that instant, so \$49,000 is where the market got to, not where the account got to. The dashed \$50,000 balance line past the breach tick is the same counterfactual: the flatten realized the loss at \$46,800, so the real balance never carried \$50,000 into the morning. A swing account is judged on its overnight equity low, never on its state at the next open. It is also worth being explicit that "static swing" is not a contradiction: `Static` decides where the floor sits, swing decides when it is checked, and a fixed floor is still a floor that can be touched at 3 a.m., on a position nobody is watching.

> [card] [Back to the rules](https://tbignite.mintlify.site/drawdown-and-failure.md)
>
> The one rule, which phase fields control it, and the charts behind every example here.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.