The Workspace (/analysis) is where your live session comes together: the aggregated equity curve,
a KPI strip, and a vertical funnel into every analysis module.
Each strategy is a daily P/L series. In the default fixed regime the portfolio curve is built by summing the weighted daily P/L across strategies, then accumulating it on top of the initial capital:
portfolio_daily_pl(d) = Σ weight_i × strategy_i_daily_pl(d)
equity(d) = initial_capital + cumulative_sum(portfolio_daily_pl up to d)
This is additive (P/L dollars are summed), not compounded — so the shape of the curve comes directly from your trades, and the initial capital sets the baseline they build on.
Strategies can also be switched, one by one, to dynamic sizing (risk- or margin-based per-trade contracts); fixed and sized legs mix freely in the same portfolio. The composition rules — daily risk budget, compounding, margin — are detailed in Weights, sizing & capital.
Per-strategy curves too
Alongside the combined curve, each strategy has its own equity line (its weighted P/L — or its sized realized P/L — on the same capital base), so you can see who contributes what. Its metrics — the rail tooltip and the detail panel (Sharpe, CAGR, Max DD, win rate…) — are measured on that same real equity, so they reflect the active weight, dynamic sizing and compounding, not a standalone one-contract figure. With compounding on, a leg's contract count follows the whole account, so its per-strategy metrics depend on the rest of the book and shift as you change the other strategies. An excluded strategy is measured on its own (single-leg build) since it isn't part of the portfolio.
A dynamically-sized leg under compounding is sized against the whole account (its contracts grow with total capital), so its percentages — drawdown, volatility, VaR/CVaR, CAGR, return — are measured on the capital it actually risks (the running account), not on the fixed starting capital: otherwise the leg's real dollar swings, divided by the small initial base, would blow past −100% and read as nonsense. Its dollar figures (net P/L, max drawdown in $) stay the real contribution. Under fixed sizing or with compounding off nothing changes — the equity stays on the initial capital base.
The left rail lists every strategy in the current session. Below the Add / Details actions, a master toggle (Enable all / Disable all) shows or hides every strategy at once.
The tabs at the top of the rail choose which composition you are working on: Current is the live session, and each variant is a parallel scenario. Everything described in this section — rows, groups, sorting, adding, detail panels — works identically on a variant's tab, writing to that variant and leaving your live session untouched.
The Add action opens a menu rather than jumping straight to a file picker. Load CSV sits at the top to import a new file; below it the menu offers what you have already saved — the strategies in your library and any saved backtests from Research — so you can drop one into the current session in a single click. When you have nothing saved yet the menu simply points you to Load CSV. Either way the chosen strategy is appended to the session you are already working in; entries already in the portfolio are marked and cannot be added twice.
The menu stays short as your library grows. Up to eight saved entries it lists them all; beyond that it lists only the ones you used most recently, so it never turns into an endless scroll.
Its last line, Browse the library…, opens the full picker (it is there as soon as you have two saved entries): the same search, tag filters and sort keys as the Library module, each row carrying its period, source and summary metrics, plus tick boxes — pick several strategies and they all enter the portfolio in one go, in one recalculation.
The master toggle's checkbox mirrors the overall state — filled when all are visible, a dash when only some are, empty when none are; the visible/total count in the section header updates accordingly.
Each row has inline controls:
×/% toggle switches the strategy between fixed contracts and
dynamic sizing. In fixed mode the ± stepper sets the weight (its P/L multiplier). In sizing
mode the stepper is replaced by a compact criteria chip (e.g. 2% · SL 100%); clicking it —
or switching to % — opens the criteria panel: basis (risk or margin), stop loss (% of premium or
$ per contract), per-trade Cap %, optional min/max contracts. The panel commits atomically:
nothing recomputes until you press Apply.$ chip opens a panel to subtract manual commissions + slippage from that
strategy's P/L (for gross exports with no costs baked in). Toggle it on, pick a basis (per
contract, per trade, or per day — only the ones the strategy's data supports are enabled) and enter
round-turn dollars per unit. When active the chip shows the total (e.g. $4.50/ct) and the net P/L
flows into every metric. It commits atomically on Apply. See
Metrics · manual costs.Click anywhere on a strategy's row to select it — the row lights up with an accent bar down its left edge. Hold Cmd/Ctrl and click to add or remove individual rows from the selection, or hold Shift and click to take the whole range between the row you last clicked and this one. A counter above the list shows how many rows are selected, with a Clear action; clicking empty space in the list clears it too.
While one or more rows are selected, a change you make to contracts, the sizing regime and its criteria (Cap %, stop loss, margin, min/max) or manual costs on any selected row is applied to every selected row in a single step. This is the fast way to, say, set the same Cap % or the same per-contract commission across a group of strategies at once.
Only the parameters you actually changed are written. The sizing and cost panels open pre-filled with the values of the row you clicked, but those values are just what the panel is showing you — they are not the edit. If you select three strategies, open the sizing panel and set Max contracts to 10, that is the only thing that lands: every strategy keeps its own Cap %, its own stop loss and its own regime. Three cues make the scope readable before you commit:
Two knobs travel in pairs, because the engine reads them that way: the stop loss in % and in $ are alternative forms of the same stop (the dollar amount wins when both are set), so touching either writes both. The same goes for the margin source and its manual value.
Switching a strategy from fixed contracts to dynamic sizing is the one case where a partial edit makes no sense: a fixed-contract leg has no sizing configuration to preserve, so it receives the whole panel as its new configuration. Selected strategies that are already sized are unaffected by that — they still only get what you touched. The footer says how many rows are in that situation.
In the costs panel, Apply to all is deliberately different: it is a uniform pose, and it forces the complete cost configuration onto every strategy in the session, selection or not.
Deleting works on the selection too. The trash button on a selected row removes every selected strategy, in one step: the button's tooltip says so before you click it, and the confirmation names the count and lists them — Delete 3 strategies? — so you can check the selection is the one you meant before it goes. It is a single action in the Timeline, so one undo brings the whole block back. The trash on a row that is not selected still removes only that row, and leaves the selection alone.
Selecting a row is not the same as showing it: it never changes visibility (use the dot, or the master Enable / Disable all toggle, for that), and the weekday dots stay per-row. Apart from the trash described above, interacting with a row's own controls (the dot, the sizing or cost chip, the weekday dots, rename) acts on that control alone and leaves the selection untouched.
The order of the rail is yours, and it is saved with the portfolio: the chart legend, the detail panel and the composition sheet of a PDF export all follow it. (The strategy table under the charts keeps its own column sorting — that is a table, and its headers are the way you sort it.)
There are two ways to set it, and they work on the same single order:
S2 comes before S10), contracts, CAGR, Sharpe, max drawdown,
drawdown p95, number of trades or start date. Clicking the same criterion again flips the
direction. Strategies with no data for a criterion — a daily-equity export has no trade count — sort
to the bottom rather than to the top. If the current order already matches a criterion the button
lights up and the menu marks it, so you can read how the list is sorted without opening anything.Sorting is an action, not a mode: it rewrites the order once and leaves you free to fine-tune it by dragging. That is also why the highlight disappears the moment you move a row by hand — the list no longer matches any criterion, and saying otherwise would be a lie.
With groups in play, sorting works inside each sleeve: the sleeves keep their own order and never interleave, which is exactly how the rail draws them. Dragging is the one gesture that crosses that line — where you drop a row decides both its position and which sleeve it belongs to, in a single step.
The sleeves themselves are reorderable too, and it is a separate gesture: grab the handle that appears on a group header when you hover it, and drop the sleeve where it should sit. The whole frame moves with its contents, and the order of the strategies inside it never changes. Without a mouse, ⋯ → Move the group up / down and Alt + ↑/↓ on a focused group header do the same thing.
Note
Reordering never changes a single number: the portfolio is a sum, and a sum has no order. It does not change the colours either — each strategy and each sleeve keeps the colour it was given when it first appeared, so moving rows or frames around never repaints the equity and drawdown charts.
When a book grows past a handful of strategies, the rail can group them into named sleeves — "Iron Condors", "Verticals", "Overnight" — each with a single size knob.
There are three ways to build one, and they all end in the same place:
Group in the rail header — always available. It opens a panel that first asks where the strategies should go: a new group, or one of the sleeves you already have (each shown with its current member count). Then tick the strategies and confirm. The same panel opens from a group's ⋯ → Edit strategies with that sleeve already chosen.
The ticks are always the sleeve's final composition: ticking a strategy that sits in another group moves it (the row says so), and unticking a member takes it out — the way to remove a single strategy without dissolving the whole group.
Select and group — click a row, then Cmd/Ctrl-click to add rows or Shift-click to take a
range, and press the same Group button. It reads the context: with rows selected it groups them
straight away (the button shows the count, so you can tell before clicking), with nothing
selected it opens the panel. One button, one place to look.
Drag a row onto a group header to move it in — it lands at the top of that sleeve — or drop it between two loose rows to take it out. Dropping between two members of a sleeve does both at once: it joins the sleeve and takes that position. Dragging a row that is part of a selection moves the whole selection. (Drag and drop needs a mouse — on touch, use the panel.)
The group appears as a header row with its members indented underneath.
The stepper on the group header scales the exposure of every strategy inside it at once. It is
a multiplier, not a rewrite: the individual weights are left untouched, so the ratios inside the
group stay exactly as you set them, and returning the knob to 1 restores the starting
configuration exactly.
Concretely, with strategy A at 2 contracts and B at 3, a group set to 2 trades them as 4 and 6 — the
2:3 balance is preserved. Rows in a scaled group show the effective value next to the editable one
(2 → 4), so the number you read is always the one that actually trades, while the stepper keeps
editing the base.
What the knob multiplies depends on each member's regime, because the size lever is different:
On dynamically-sized legs the multiplier is approximate
For a sized strategy, a knob at 2 roughly doubles the exposure but not exactly the contracts: the count is
truncated to whole contracts, and the daily risk budget, the min/max contract bounds and the margin
cap can all bite. On fixed-contract legs the multiplication is exact.
An effective allocation above 100% of capital is capped at 100% and the sizing diagnostics below the charts say which strategy was clamped, so a knob that has stopped multiplying never passes silently.
The group header also carries:
1, their exposure returns
to the base value.Groups are part of the portfolio recipe: they are saved with it, frozen into variants, carried by the shareable CSV, and undoable from the Timeline. A strategy belongs to at most one group, and groups do not nest.
Hovering a group's name opens the same panel a strategy gets: the sleeve's equity and drawdown sparklines plus its Sharpe, CAGR, win rate, max drawdown and DD p95 — so you can ask "is this sleeve pulling its weight?" without unfolding it.
Double-clicking the name goes further and opens the group's detail panel: the cumulative equity and drawdown charts of the whole sleeve, the full institutional metric set (Sortino, Calmar, volatility, profit factor, k-ratio, VaR/CVaR, drawdown durations, daily statistics) and the list of its member strategies. It mirrors the per-strategy detail panel field for field, so a sleeve and a strategy can be read side by side.
Renaming a group lives in its ⋯ menu, alongside the other sleeve actions.
The sleeve's equity is the sum of its visible members' contributions. Hiding a strategy takes it out of its group exactly as it takes it out of the portfolio, and a fully hidden group has no equity to measure (the panel says so rather than showing zeros).
A contribution, not a standalone
With compounding on, each member is sized against the whole account, so a group's metrics describe what that sleeve contributed to this book — not what it would have done on its own. They therefore move when you change the other strategies. This is the same convention as the per-strategy metrics described at the top of this page.
A group already reads like a strategy. ⋯ → Merge into one strategy makes it one: the sleeve's curve becomes a new, independent strategy in the rail, which you can then save to the library, rename, weight, compare, export, or carry into another portfolio like any other leg.
The new strategy carries the group's daily P/L exactly as the sleeve reports it — the visible members, with their weights, the group's size knob, any dynamic sizing, the manual costs and the weekday filters already applied. Its Sharpe, CAGR, drawdown and win rate therefore match the numbers the group header was showing, to the last decimal. Costs are not re-applied on top: they are already inside the series.
The panel asks the one question that changes the session:
Either way it is a single entry in the Timeline, so one undo puts the whole sleeve back, members and frame included.
A merge is a snapshot
From the moment it exists, the merged strategy is a fixed daily series: it no longer follows the members' knobs, and changing the group afterwards does not change it. Two consequences worth knowing before you press:
Only the visible members are merged, since they are what makes the sleeve's numbers. Muted members are therefore never deleted: consolidating leaves them in the session, ungrouped.
Once the session has a group, a groups button joins strategies and portfolio above the equity chart — the three sit in the order they aggregate: strategy → sleeve → portfolio. Turning it on draws each sleeve's cumulative equity on the equity chart and its drawdown on the drawdown chart, so you can see how the blocks of the book move against each other instead of reading fifteen individual lines.
Group lines are solid and thicker than the per-strategy ones, and use their own colours — the same ones that mark the sleeve in the rail — so the two levels never get confused. They follow everything else on the chart: the time range, dollars/percent mode and align starting capital (each sleeve rebases with its own regime, proportional only when it contains dynamically-sized legs under compounding). Hovering a sleeve highlights its equity and its drawdown together.
Which levels are on is remembered: turn on strategies, walk over to Metrics or Monte Carlo and come back, and the chart is still drawn the way you left it — the choice survives reloads and new sessions too, since it is how you read a book rather than part of any one portfolio. A remembered groups choice simply lies dormant in a book with no sleeves and lights up again as soon as one exists.
The correlation matrix can also switch to one row per group, which is where sleeves pay off most on a large book.
Groups vs. multi-selection
They complement each other. Selection is the throwaway gesture: pick any rows, apply one change to all of them, done. A group is the durable version: a name, a place in the rail, and a knob that stays. Use selection for a one-off edit across unrelated strategies, a group for a sleeve you will keep tuning.
Once at least one strategy uses dynamic sizing, a Sizing control appears in the workspace header with the portfolio-level parameters (daily risk budget, compounding — see Weights, sizing & capital), plus the sizing diagnostics under the KPI strip. The charts card always carries a Trades band — the complete portfolio trade log — for every portfolio, fixed or sized (see below).
The band at the top of the chart card has four primary cells, each with a headline value and a small context subline underneath:
Everything is recomputed live as you change weights, capital or filters. The full table with formal definitions is on the Metrics page.
By default the band describes the whole history — even when strategies have different inception dates, so a book where one strategy runs from 2020 and others join in 2022 is measured across the full span (the earlier stretch is not silently dropped). To read the figures for a framed period instead, turn on align starting capital and pick a window (see below): the band then recomputes every figure over that window alone, and a small framed-period marker appears above the cells.
Under the KPI band, whenever the allocation engine has something to say, sits a single line: a short summary — Sizing · 7 at the contract cap · 1 at the contract floor · 340 trades reduced by the margin cap — and a Details link. It is deliberately one line: those constraints qualify the figures right above them, so the fact that they exist has to be visible at a glance, while the explanations belong in a panel rather than in front of the chart.
The line's tone tells you whether it needs you:
Details opens the diagnostics panel, in three blocks:
The wanted → taken pair is the size capital and the daily risk budget had allocated, next to the
size the limit allowed — 47 → 10 says at a glance what the cap did. From it comes the P/L
effect: the trade's outcome at the allowed size minus its outcome at the wanted size, carrying the
same manual-cost convention as the P/L column. It is signed: negative means the limit cost you,
positive means it saved you — a cap biting on a losing trade avoids loss, which is often exactly why
it is there. The per-strategy figure in the table is the exact sum of its trades' figures, so the
drill-down reconciles with the summary by construction.
It is not the P/L you would have made
The effect is arithmetic trade by trade, not a re-simulation. Under compounding a different size would have changed the account, and therefore every later size; and a bigger size would have been trimmed harder by the margin cap. Read it as the order of magnitude of what the limit moved — not as an alternative result you can bank on by raising the cap.
For the same reason the effect attributed to a limit stops at the limit: when the margin cap trims a trade further, that extra slice stays in the reduced-trades list with its own excluded P/L, so nothing is counted twice.
The risk column pairs the dollar risk with its share of the capital at that moment — it is what makes the floor's message checkable, since that message claims the risk exceeds the declared Cap %.
In the Trades band, a trade whose size was decided by a declared limit carries a small amber dot next to its contract count, with the reason on hover — the signal sits on the number that motivates it.
Switch the analysis mode between:
The log toggle above the chart (a logarithmic Y axis, useful when the curves span several orders of magnitude) applies to dollars mode only. In percent mode the plotted value is a return that starts at 0 and can sit at or below break-even, and a logarithmic axis has no position for zero or negative numbers — so those points would drop out and the lines would fragment. The toggle is therefore disabled in percent mode; switch to dollars for a clean log view. This is most visible with percentage sizing and compounding, where the curves linger near break-even.
Whenever the session has unsaved work, the status bar shows a quiet draft saved · hh:mm next to the session name. That is the autosave: every change is mirrored into a draft on your account within a couple of seconds, so closing the tab or a backend restart never costs you the work — reopen the app and you are back exactly where you were, still flagged as unsaved.
Two things it deliberately does not do:
If you open the app from another browser — where the session id isn't stored locally — the draft shows up under Resume on the dashboard as an in progress card, alongside your saved portfolios and backtests. Full details in Core concepts.
When the portfolio you loaded lives in a shared space, the workspace behaves the same in every respect but one: you take a turn on that portfolio while you work on it. If someone else holds it, a band appears above the workspace saying who and for how long, with Take control.
Nothing is blocked by a turn: it warns so you find out before doing the work twice. What actually protects the work is the save itself, which is refused if someone saved in the meantime and offers you Reload or Save as a copy.
Your draft stays private either way. Autosave never writes into the space.
The New session button at the top right of the workspace header (next to Export) starts over from scratch. It opens a short menu, because new work does not only arrive as CSV — pick where the new session comes from:
Whatever you choose becomes a brand-new session: the current one is discarded and replaced, its draft is discarded with it, and the variants registry is emptied — every variant is a snapshot of the portfolio you are replacing, so keeping them would leave another portfolio's curves overlaid on the new one, with the metric deltas measured against them. Saved portfolios and saved strategies in your library are untouched: that is where work you want to keep belongs.
Because that replaces whatever is on the desk, if the current session has unsaved work (a raw upload, or a saved portfolio with changes), it asks whether to save it before continuing. The same dialog tells you how many variants are about to go, when there are any:
When the current session is already a saved portfolio with no pending changes, there is nothing to save, so it opens the new session directly. To add strategies to the existing session instead of replacing it, use Add in the strategies rail; to refresh an existing portfolio with an updated CSV while keeping its customisations, use Update data.
The Library header carries its own New portfolio button. That one is a different gesture: it files a new portfolio into the library from CSVs without touching the session you have open.
The drawdown panel under the equity chart normally draws one coral curve: the portfolio's decline from its running peak. Turn on the strategies toggle above the chart — the same one that splits the equity into a line per strategy — and the drawdown splits with it, into one band per strategy, in that strategy's colour.
Each band is that strategy's P/L since the portfolio's current peak. This is an exact decomposition, not an approximation. On any day the portfolio drawdown is its equity minus its running peak; portfolio equity is initial capital plus the sum of the strategies' contributions; and the capital cancels in the difference. So, day by day:
Read it as who is digging the hole. A band below zero is a strategy losing ground since the peak. A band above zero is a strategy that made money while the book was underwater, offsetting the others — which is why the panel can extend above the zero line when that happens.
The coral portfolio curve follows the portfolio toggle, exactly like the aggregated equity above it, so the two toggles compose:
With the total hidden the bands do not change meaning: they are still measured from the portfolio's peak and still sum to the book's drawdown. It is simply not drawn.
Hovering gives the total first, then each strategy's contribution, deepest first, with its share of the drawdown. Those shares can exceed 100% when some strategies offset: a book where one leg digs 130% of the hole while another fills 30% of it back is telling you something the aggregate curve alone cannot. Above the panel, a badge names the worst day in the window — its date, the portfolio drawdown, and the three deepest contributors.
Contribution, not standalone drawdown
A band is not the strategy's own drawdown. It is measured from the portfolio's peak, not the strategy's, so a strategy that peaked on a different day reads differently here than it does on its own. That is the point: this panel answers how much of this decline each strategy is responsible for. For the drawdown a strategy has against its own peak, hover its row in the rail.
The panel follows the rest of the chart: the range selector, dollars or percent, and align starting capital (with align on, the peak resets to the start of the window and the bands reset with it).
Below the drawdown sits a bar histogram of the margin employed — how much capital the portfolio ties up as broker margin, one bar per trading day (days with no trades leave a gap). The bars share the same date axis as the equity and drawdown above, so you can line up a margin spike with what the account was doing. For each day it sums the margin requirement of the trades opened that day (margin is committed when a trade opens) across the visible strategies, scaled by each strategy's weight (the same weighting that builds the equity), so doubling a strategy's weight doubles the margin it contributes:
margin(d) = Σ weight_i × margin_requirement_i(trades opened on day d)
For strategies in dynamic sizing the contribution is the allocated one instead —
contracts × per-contract margin per trade, on the same open-date convention.
Two threshold guides overlay the bars, both referenced to that day's equity (falling back to the initial capital when the day's equity is missing or non-positive): a dashed amber line at 80% — the safety threshold — and a solid red line at 100% — the hard limit, since margin above the account's equity means the broker could not have carried those positions and the day would not have been tradable. In dollars mode the guides are curves that follow the equity (80% and 100% of each day's account value, drawn as steps); in percent mode they collapse to the horizontal 80 and 100 lines. The Y axis always extends to the 100% guide, so the gap between the bars and the limit is readable at a glance. Bars are tinted by state: violet when utilisation is at or below 80%, amber between 80% and 100%, red above 100%; the tooltip adds the utilisation rate (in dollars mode) and a matching note when a day crosses either threshold.
The chart shows the thresholds; the sizing engine can also enforce them. With the margin cap active (80% by default, set per session from the workspace header), the day's sized trades are evaluated in open-time order against the margin in force at that moment — including what is still tied up by positions opened on earlier days and not yet closed — and a trade whose required margin would push the total above the cap is reduced to the maximum contracts the remaining margin allows at that moment, down to 0, meaning the trade is simply not opened; the P/L of the trimmed part is excluded from the calculation. Min 1 contract does not override this: the floor is a size preference, the cap is account capacity — see Weights & capital. The sizing diagnostics under the charts then carry the reduced-trades list — date, strategy, open time, planned and final contracts, required margin, the margin already committed at that moment, the day's limit and the excluded P/L — so you can audit exactly what the cap trimmed. Bars above a threshold therefore come from fixed-contract strategies (whose size is yours) or from days whose non-reducible margin — fixed legs plus positions carried over — the cap could not resolve; details in Weights & capital.
A small badge pinned to the top-right shows the median and mean margin across the trading days in view — the typical amount of capital tied up when the book is on — plus a legend for the two threshold guides and, when any day in view exceeds 100%, a red counter with the number of such non-tradable days. Idle days are excluded from the median/mean (they would drag the median to zero); the badge recomputes as you change the time range.
It reads straight from the trade-level data (the Margin Req. column of Option Omega exports, and any
margin column the mapping engine kept from
a per-trade CSV), so it appears only when your strategies carry that column — otherwise the panel shows a
quiet no margin data note. It follows the same range selector as equity and drawdown (all three move
together) but ignores align starting capital, since margin is a physical amount of capital
committed, not a running P/L. In dollars mode it is the margin in account currency; in percent
mode it is the utilisation rate — margin as a percentage of that day's equity — so you can read
at a glance how much of the account is locked up at each moment. The denominator is the day's equity,
not the initial capital: with compounding on, contract counts (and margin) grow with the account, and
dividing by the initial capital would inflate the rate as the account grows instead of measuring the
actual share of capital in use.
Above the chart, the range selector narrows the equity and drawdown views to a window — both charts always move together. The presets are 1M, 3M, 6M, YTD, 1Y and ALL (the whole history). Each is counted back from the last data point, not from today. The active window is echoed in the card header, next to the title (for a custom window, as its date range).
The custom button (calendar icon) opens a small picker with a from and to date, so you can frame any exact span. Both bounds are inclusive and clamped to the session's available dates; leave one side untouched to extend the window to the first (or last) point. A date typed by hand outside that span (a stray year, or a from later than the to) is pulled back to the nearest available date — the picker warns you and corrects the field, so the window can never end up empty. Picking any preset again clears the custom window.
On its own the range is a pure zoom: every figure in the app keeps reading the full history. Turn on align starting capital (see below) and the range becomes the portfolio's reading calendar instead — the KPI band, the Metrics ledger, the Monthly P&L grid, the Weekday breakdown, the per-strategy register and Strategy comparison all recompute over the framed window alone. The range and the checkbox reset (to ALL, unticked) whenever you load a different portfolio or restore a variant.
By default the range selector only zooms into a window: the equity still carries the profit and loss accumulated before the window, so a curve framed on the last 6 months can start far above the initial capital. The align starting capital checkbox changes that — it replays the selected window as if every strategy had begun trading at its first day.
Concretely, when the checkbox is ticked each curve (the aggregated portfolio, the per-strategy lines, the benchmark and any pinned variant) is rebased so that:
What does not re-scope: the strategy rail and its detail modal, which stay on the full history on purpose — they describe the strategy you own, not the period you are inspecting.
Scroll past the chart and the checkbox goes with it, so a screen full of figures would be left with no date on it. From the first deep-dive section down, a slim period bar stays pinned under the navigation and answers the only question that matters there — which period are these numbers about? It has two faces:
With no range selected there is nothing to declare and the bar does not appear. On the standalone module pages, where each page is one module and there is no chart to disagree with, the same statement appears as a band above that module's figures instead.
The rebase asks one question, and asks it of every strategy separately: had the account been k times smaller, would this trade have returned k times less?
initial_capital ÷ equity(window start).The rebased curve is then the sum of those re-anchored contributions:
equity(d) = initial_capital + Σ over legs k × [ equity_leg(d) − equity_leg(window start) ]
That is not a third regime — it is the two classic ones written once. With every leg proportional the
formula collapses to the plain multiplicative rebase initial_capital × equity(d) ÷ equity(start);
with none, to the additive shift equity(d) − equity(start) + initial_capital.
Why per leg and not one rule for the whole portfolio. In a mixed book the two parts have to move differently. Applying a single rule to everything scaled the fixed part down along with the rest — measured error up to 52%, worst precisely when the fixed strategies dominate and one small sized leg flips the whole portfolio into the proportional regime. Recomposing leg by leg brings that to about 1%; what is left is cross-compounding (a sized leg sizes on capital that includes the fixed legs' profits), which only a full re-simulation of the window would close. As a bonus the per-strategy lines now add up to the aggregate curve, which under the old single rule they did not.
Contract limits change k, and not by a simple on/off. For a leg carrying a max contracts cap or
a min contracts floor, k is not assumed — it is recomputed from the sizes. For every trade in
the window the engine kept the size the capital wanted before the limits; that wanted size is scaled by
the factor, the limits are re-applied exactly as the engine applies them, and k is the ratio of the
resulting sizes to the real ones. Manual costs charged per trade or per day are fixed amounts and
keep the leg at k = 1.
Recomputing matters because the two limits behave in opposite directions, so reading them as a flag gets both wrong:
Measured on a floor that only bit during the first months, with the window on the free stretch: judging from the whole history overstated the period's profit by +588%, and judging only from whether the limit bit inside the window understated it by −83%. Recomputing the sizes closes both.
The margin cap changes k too, whenever fixed legs hold margin. The cap's limit is a percentage of
the day's capital, so it shrinks with a smaller account — but the margin committed by fixed-contract
legs is a number of dollars and does not shrink at all. At reduced capital that constant base eats a
larger share of the limit, so the cap bites earlier than a proportional reading suggests. The
recomputation therefore re-applies the cap as well, against the room the smaller account would really
have had:
room(f) = f × (day's limit − sized margin already committed) − fixed-leg margin
With no fixed-leg margin the room scales exactly by the factor and this changes nothing — that is the case where treating the cap as invariant was correct. With a fixed base it does: measured on a hybrid book with a binding cap, the framed period was reported up to +76% above a re-simulation of the same window; re-applying the cap brings that to about +11%, the remainder being the constant-factor approximation described below. As in the engine, the min contracts floor is no exception — against margin the question is whether the room exists, not what size you would prefer.
Group ("sleeve") lines and per-strategy lines use the same factors, and the chart is served those very factors by the server rather than guessing them, so every curve, the KPI band, the metrics, the monthly grid and the trades ledger describe the same period.
What this cannot do
The factor is constant across the window, while a rebased account would have compounded its own way inside it. The approximation is excellent when the position size does not explode within the period (1–3% in realistic books) and degrades when it does — on a synthetic window where the size multiplies by sixty, the residual is about 30%. Only re-simulating the window trade by trade would remove it. A binding cap is reported in the sizing diagnostics, naming the strategy and how many trades it limited — a Contracts column sitting flat on the cap is normal, and this says so out loud.
It works with every preset, the custom window and ALL (on ALL it is effectively a no-op, since the window already starts at the beginning of the history). Each pinned variant is recomputed over the same window by the same engine — leg by leg, with its own factors — so its curve and its metrics sit on the same calendar as Current instead of on its whole history. On the equity curve this is a display rebase; the Trades band instead re-anchors its running capital to the window start (and, for dynamically-sized legs, re-simulates the sizing from there), so its contracts, P/L and progressive capital reflect an account that truly began there.
What it answers
"How would the portfolio have gone if I had started from this point in history?" Pick YTD, 6M or any custom span, tick the box, and read the equity and drawdown as a fresh start from there.
The benchmark toggle above the equity chart overlays a buy & hold market curve, so you can
read your portfolio against the broad market. When active, a small switch lets you choose between two
deliberately different references (the active one is labelled price only / total return):
^GSPC), price only: it ignores dividends.It is a fair, same-starting-point comparison:
capital × price(d) / price(start).(price(d) / price(start) − 1) × 100.For SPX the price is the index's daily close; for SPY it is the dividend-adjusted close (total return). The data is daily (no intraday), sourced from Yahoo Finance. It refreshes automatically: the app keeps the series cached and re-fetches it on first use each day, so the line is always aligned to the last closed trading session. Prices only exist on trading days, so weekends and holidays carry the last value forward (the line stays flat, it does not drop to zero). With every strategy hidden, the benchmark still plots on its own over the session's date range.
SPX is price, SPY is total return
The whole point of offering both: SPX shows price appreciation only, while SPY reinvests dividends. Comparing them tells you how much of the market's return came from dividends.
At the bottom of the charts card two collapsible bands complete the picture:
Rolling · moving windows — the distribution of returns over fixed-length sliding windows (1w, 2w, 1m, 3m, 6m, 1y — counted in operative days, i.e. days with non-zero P/L), with best/worst window paths. Available for every portfolio, fixed or sized; with compounding on, each window's base is its starting equity, otherwise the initial capital.
Trades · portfolio trade log — the complete trade log of the portfolio, always available
for every portfolio (fixed, sized or hybrid): one row per trade, from every strategy, in
chronological order. Each row carries its date, strategy, time, premium, contracts and realized
P/L, and a capital column: the account's realized capital at the moment that trade
opened — initial capital plus the P/L of the trades already closed by then. A position still
open is not cash, so it does not appear there; on an all-intraday book the two readings coincide by
the end of each day, on a multi-day book they do not. When at least one trade spans more than a
session the log also shows a closed column: that is the date the trade pays, the date its P/L
lands on the curve and in the metrics, and the day its margin is released. The premium is the per-contract premium of the
structure, printed as a magnitude followed by its direction — 935.00 db for a debit paid,
305.00 cr for a credit collected — the same reading as the trade log in Research. The signed figure of the source file (credit positive, debit negative)
is what the CSV export writes: there a number must stay a number. An em-dash means the file carried
no premium for that trade (daily-only series). Next to the P/L sits P&L / ct, the P/L of a
single contract: contracts × P&L / ct reproduces the row's P/L (net of any
manual costs), which is how you check a row at a glance. It matters because
in Option Omega CSVs the P/L column is the total of the position, not the per-contract figure —
the engine divides it by No. of Contracts and reasons per contract from there, so a size cap of 3
yields three times this number, not three times the CSV cell. Dynamically-sized legs add the two sizing-only columns —
the stop and the risk — while fixed legs, whose size is your multiplier, show an em-dash there;
their contract count is the trade's real contracts times the fixed multiplier and their P/L is the
trade's real P/L. The committed margin column is not sizing-only: margin is tied up the same
way whether the size was chosen dynamically or fixed, so the column appears whenever any trade in the
book carries margin data. When the whole portfolio is fixed the stop and risk columns are hidden,
but the margin column stays as long as the CSVs carry a margin figure; only a fixed book with no
margin data at all collapses to the essential set (date, strategy, time, premium, contracts, P/L and
capital). The margin column shows the margin the trade commits — final contracts × per-contract margin for both sized and fixed legs (em-dash when the trade carries no margin data); a trade
reduced by the margin cap is highlighted in amber, and the planned size with the full required
margin sits in the reduced-trades
list in the sizing diagnostics (the cap only trims dynamically-sized legs, never fixed ones).
A trade the cap excluded outright — no free margin left for even one contract — shows a ⊘ on its
zeroed contract count: it is the trade that never happened, so it belongs where the size is read, not
in the margin column it no longer occupies. A trade whose size was decided by a
declared contract cap or floor instead carries a small amber dot beside its contract count, with
the reason on hover.
Beside the per-trade margin, the cumulative margin column answers a different question: how much of the account is tied up at that moment. It is the portfolio's committed margin right after that trade opens — positions still open from previous days, plus everything that entered today up to that time — so it fills up as the session goes on and empties as positions close. It is also the figure the margin cap compares against its limit: when the column reaches the ceiling, the trades below it are the ones that come back reduced or excluded. Fixed legs count from their own execution time, not from the opening bell — a position entering at 15:30 does not take room away from a trade at 09:35 — so the printed figure is exactly the one the cap evaluated, mixed books included.
The log is scoped to the chart's calendar: it follows the range selector above, showing the trades that close inside the visible window — the same convention the metrics use, so the P/L in the list and the P/L in the panel above it are the same number (on ALL it spans the whole history). The trade count and the CSV export track the same window; the export always writes the close date, even when the table hides the column.
When align starting capital is on together with a window, the ledger is brought back to the
initial capital at the window start, following the very same convention as the curve above it and
the KPI band — the list must tell the story of the chart it sits under, not a parallel one. Each row
therefore carries its own leg's factor, the same one the curve uses: a fixed-contract row is left
alone, a proportional dynamically-sized row is rescaled by initial capital ÷ equity at the window start. Mixed books get both, side by side in the same list.
Whichever factor applies, one rule holds on every row: a row never mixes two scales. Contracts,
P/L, risk and margin move together by the same ratio, so contracts × P/L per contract always
reproduces the row's P/L (net of manual costs) and margin per contract stays the true one. That is
the only way a ledger can be read at all.
A note above the table says which regime is active. The running capital tracks the rebased curve within a day of it: the curve is anchored to the equity at the close of the window's first day, while the ledger also lists the trades opened on that day.
Because a large book can run to dozens of pages, the list carries a timeline scrubber above it (shown once there is more than one page): the bar spans the whole visible period, with year or month gridlines, and the highlighted band marks where the current page sits in time. Click or drag on the bar to jump straight to the page for that moment (arrow keys and Home/End work too when it is focused), instead of stepping page by page. Each page also shows its date span next to the row range in the footer, so you always know which slice of history you are looking at.
The Workspace scrolls through linked sections — Metrics, Correlations, Monthly P&L, Weekday, per-strategy detail and the head-to-head strategy comparison — with the sidebar tracking where you are. Heavier modules (Charts, Monte Carlo) have their own pages.
Next: tune the mix with Weights, sizing & capital.