VEEMANDocs
DocumentationSupportOpen Dashboard

Getting started

  • Introduction
  • Quick start
  • Core concepts

Importing data

  • Supported formats
  • How import works
  • Splitting a file
  • Troubleshooting

Building your portfolio

  • Workspace & equity
  • Weights & capital
  • Weekday filter
  • Keyframes
  • Currencies & FX
  • Library
  • Strike guard
  • Variants & comparison
  • History (undo/redo)
  • Shared spaces

Analytics

  • Metrics reference
  • Charts (deep-dive)
  • Monthly P&L
  • Correlations
  • Comparison
  • Monte Carlo
  • Equity Control
  • Optimization
  • IBKR reconciliation
  • Veeman AI

Research

  • Research overview
  • Define
  • Composing a backtest
  • How the engine trades
  • Results & archive
  • Parameter study
  • Rewind
  • Tactics
  • Indicators

Reference

  • Keyboard & command palette
  • Exporting data
  • Settings

Technical

  • Architecture
  • API reference
  • Security
  • Your data & privacy
  • Risk disclosure
← PreviousLibraryNext →Variants & comparison

Strike guard

A broker account holds one position per contract. If two strategies in the same account both sell the SPX 6000 put expiring today, they are not two positions: they are one, twice as large, and neither strategy can close its half on its own. If one sells that put while the other buys it, the two orders cancel out and neither strategy has the trade it was backtested on.

Backtests don't know about each other, so a portfolio of backtests can count trades that could never have lived together in one account. The strike guard finds those collisions among the Veeman backtests of a portfolio and the strategies imported from a file whose trade log lists the legs. It asks you what each strategy should do when a strike it needs is already taken, and re-runs those strategies with your answer. The portfolio then uses the re-run strategies. The original backtests in the Research archive and the imported files never change.

Two strategies are enough, of either kind: a portfolio made only of imported strategies is checked the same way.

When two strategies collide

Two positions collide when they hold the same contract at the same minute:

  • same underlying, same expiration, same strike and same type (put or call). A different expiration, strike or type is a different contract, so it never collides;
  • the other strategy's position is already open when this one enters, from its entry minute up to and including its exit minute. Two orders on the same contract in the same minute are already a problem in a real account, so that minute counts;
  • a strategy's own positions never collide with each other (it can hold the same strike twice, as its backtest already did).

Only what the portfolio actually trades holds strikes. A trade the portfolio doesn't take, or takes at 0 contracts, isn't in the account: it holds nothing, and its entry has nothing to resolve. That is the case when:

  • the strategy is switched off in the rail, or its weekday filter excludes the day;
  • its weight or its group scale is 0;
  • a keyframe switches it off, or sets it to 0 contracts, on that day;
  • dynamic sizing leaves the trade at 0 contracts.

The strike guard reads this from the portfolio's trade list worked out on the original backtests and files. Dynamic sizing depends on the equity, and the strike guard changes the equity, so a later trade that its own shifts push across zero contracts isn't examined again. A position the portfolio takes only in part (dynamic sizing sizes each piece) still holds all its strikes. Positions opened by Tactics adjustments hold their strikes too, but the strike guard doesn't move them (it moves entries, not adjustments) and says so when it happens.

Who keeps the strike

The strategy that entered first keeps it. The one that enters later applies its own rule. When two strategies enter in the same minute, the one higher in the rail keeps the strike: the order you see is the precedence. A strategy inside a group sits where its group sits, so moving a group's frame moves the precedence of everything inside it. You set it by arranging the rail.

The four rules

Every strategy that enters on a taken strike gets one rule, chosen in the strike guard window.

RuleWhat happens at a collision
Shift structureThe whole structure moves one strike step (5 points on SPX), every leg by the same amount, so it keeps its shape and width. It moves first toward the money of the leg that collides (up for a put, down for a call) and, if that is taken too, the other way. If both are taken, the entry is skipped.
Shift legOnly the legs that collide move, one strike step, in the same order (in the money, then out of the money). The other legs stay where they are, so the structure's width can change. A shift that would land a leg on another leg of the same structure is not used.
Skip entryThe strategy doesn't enter.
Ignore strike conflictsNothing happens: the strategy enters on its own strikes, as if there were no strike guard, and the two positions share the contract. Its trades stay exactly as in its backtest or file.

The shift is one step only, and a candidate is accepted only if every leg of the moved structure is free: the strike guard never opens a structure that is half moved. With Shift structure an iron condor moves as a block, and the short put and short call of an iron butterfly stay on the same strike. When a put and a call of the structure collide at the same time, the first of them in the structure decides which way it tries first.

Ignore strike conflicts leaves the collisions in the portfolio on purpose. Use it when the strategies trade in separate accounts, where nothing is netted, or when you want a strategy counted exactly as it was backtested. Nothing is re-run for it, and its positions still hold their strikes: a strategy that enters after it on one of them applies its own rule.

A strategy with no direct collision has no rule to choose. If a shift elsewhere makes it collide later in the same day, it uses Shift structure, the default, and its result says so.

Imported strategies

A strategy imported from a file takes part when its trade log lists each trade's legs and times: the same detail Rewind replays it from (which files carry it is in Import formats). A strategy imported without that detail, and the trades Rewind can't replay (a calendar, a later expiration, a leg that can't be read), hold no strike and are left out.

The precedence and the rules are the same as for Veeman backtests: the strategy that entered first keeps the strike, whoever designed it, because in one account the broker nets the second order. What changes is how an imported trade applies its rule, since there is no recipe to re-run:

  • Skip entry removes the trade from the portfolio. That is exact: the rest of the file is untouched.
  • Ignore strike conflicts keeps the trade as the file records it, sharing the strike.
  • Shift structure and Shift leg move the strikes as described above and re-price the moved structure on Veeman's data: entered at the file's entry minute, with the file's own costs, and closed at the file's exit minute (or held to expiration, if the file's trade expired). Its P&L is an estimate: the file doesn't say what its strategy would have done on different strikes (a stop could have triggered at another minute). The trade list marks these trades with ≈ before the P/L, Rewind with file ≈, and the strike guard window counts them as shifted with an estimated P&L.
  • A moved strike with no market at the entry minute can't be traded: the entry is skipped, as for a backtest.
  • On a day Veeman's market data doesn't cover, a moved structure can't be priced. The trade stays as the file records it, still sharing the strike, and the message after the run says how many trades are in that case. Skip entry doesn't need market data and works on any day.

The imported file itself never changes. The strike guard sits on top of it: the trades it skips or re-prices, and their effect on the curves, the trade list, the sizing, the margin and the manual costs. Use original trades takes that layer away and the numbers are the file's again. If you refresh the strategy with Update data, the file changes, and its strike guard and its rule are removed: choose its rule again and re-run.

In the strike guard window an imported strategy is labelled from file, and a note reminds you that shifting one of its trades gives an estimated P&L.

Shift or skip

Skipping is exact but drops whole trades, and on a portfolio of strategies built on the same strikes it can take a large share of the P&L away. Shifting keeps the trades, at an estimate. Freeze a variant with one rule, apply the other, and compare them side by side.

What re-running means

When you confirm, Research re-runs the strategies only on the days that have a collision. A Veeman backtest is re-run by the same engine that made it; the trades of an imported strategy are kept, skipped or re-priced as described above. Every other day keeps the saved trades of the original backtest, or of the file, exactly.

  • The rule is applied at the moment the strategy has decided to enter: its entry filters, its premium filter, its sizing and its re-entry wait have all passed on the structure it chose. The shifted structure is priced on the chain at that minute and keeps the same number of contracts; the filters are not checked again on it.
  • A shifted strike that has no market at that minute (not quoted, or no bid on a leg to sell) can't be traded: the entry is skipped and listed as such.
  • With a floating entry window, a skipped entry ends the window: the strategy doesn't try again a minute later. A skipped re-entry ends that day's chain of re-entries.
  • Decisions chain within a day: a shift can free a strike for a later entry, or take one that another strategy wanted. The engine goes through the strategies in rail order and repeats the day until no strategy changes, so the final result has no collision left (apart from those of strategies set to Ignore strike conflicts) and every shift or skip was needed.

The run takes a few seconds and the window shows its progress. You can close the window: the run goes on and the portfolio updates when it ends.

If the dataset was updated

The days that are re-run use today's dataset. If the dataset was updated after a backtest was saved, those days can differ slightly from the archived run for reasons unrelated to the strike guard, and the result tells you so.

In the portfolio

After the run, the strategies that changed carry a shield next to their name in the rail. Hover it for the rule and how many entries were shifted or skipped (for an imported strategy, that the shifted trades have an estimated P&L). The window lists the changes: date, minute, the strikes before and after, and which strategy held them.

  • Metrics, curves, Monte Carlo, sizing and every other module read the re-run strategies.
  • Saving the portfolio keeps the re-run strategies and their rules, and so do variants and the session's autosave. Reopening a saved portfolio shows the same numbers you saved.
  • The backtests in the Research archive and the imported files stay exactly as they were.
  • A strategy set to Ignore strike conflicts keeps its original trades and gets no shield. When every colliding strategy is set to it, the chip at the top of the rail reads Conflicts ignored.
  • To see how the strategies fit together on a given day, open it from the trade log with the calendar button: Rewind shows every position of that day as the portfolio uses them, at the portfolio's sizes, with the shifted strikes and the skipped entries told at their minute. Two positions that share a contract because one of them ignores strike conflicts are both shown, with a note. The single-trade ▶ is off for re-run Veeman strategies, since their trades are no longer the archived ones; on an imported strategy it opens the trade as the portfolio uses it, the moved structure included, at its estimate.

When the portfolio changes

The result belongs to one composition: these strategies, in this order, with these rules, these trading days and these trades taken. Add or remove a strategy, switch one on or off, reorder the rail (a row or a group's frame), change a weekday filter, or change what the portfolio takes (a weight, a group scale, a keyframe or the sizing that brings a trade to or from 0 contracts), and the chip at the top of the rail turns to Strike guard · update. Open it and re-run: the rules you chose are kept. If the change removed every collision, the window offers to restore the original trades instead, without re-running anything.

Update data on Veeman backtests is a change of this kind: their runs are replaced by newer ones, so the re-run no longer applies. The rules stay, and the window offers to open the strike guard and run it again on the new data.

The window opens on its own when a strategy that collides has no rule yet. Not now leaves the portfolio as it is and remembers your answer for that composition; the Strike conflicts chip in the rail reopens the window whenever you want.

Use original trades removes the strike guard: every strategy goes back to its archived backtest or to its file, and the rules are cleared. Applying or removing the strike guard is one step in History, so undo brings back the previous numbers.

Compare with and without

Freeze a variant before applying the strike guard, then pin it next to the live portfolio: the overlay shows what the collisions were worth.