The strategy: selling implied volatility
The edge in options premium selling is simple to state: implied volatility, what the market prices into options, tends to overstate the move that actually happens. Selling that gap is the structural edge.
The metric that tells you when premium is expensive is IV Rank: where current implied vol sits in its trailing one-year range. (IV_now − IV_low) / (IV_high − IV_low) × 100. At IV Rank 30 you are in the upper third of the historical range. At 80 you are near the annual peak. ACondor only sells when IV Rank meets its engine-specific floor.
Strike selection and the expected move
ACondor selects short strikes by delta, not by arbitrary distance from the money. Delta approximates the probability that an option finishes in-the-money. A 20-delta short strike sits near the edge of the expected move, with roughly an 80% chance of expiring worthless. A 16-delta short strike sits at approximately one standard deviation, with roughly an 84% chance of expiring worthless.
The mechanical engine uses 20-delta shorts, placing the condor around the expected move. The earnings engine goes further: it reads the implied move the options market is pricing for the report and places each short at the further of the 16-delta strike and 1.3× that implied move from the stock price, so the strikes scale with how big a print the market expects. The contraction engine uses 16-delta shorts for higher probability on the faster, shorter cycle.
Getting a fair fill
Entry orders are priced with a concession toward the touch, not submitted at the raw midpoint. ACondor reads the live bid and ask and gives up only as much edge as it takes to trade, which improves fill rates without conceding more than necessary. The same real bid/ask read backs urgent exits: the bot moves its price only as far as the actual market requires, never further than a stale quote would suggest. An order that hasn't found a fill within about 90 seconds is canceled and re-priced against the current market rather than left resting on a stale price.
A close that has to happen follows the market. At each re-pricing step the bot re-reads the live quote for every leg and moves its price toward where the market actually is, bounded by the touch, so a defensive close never sits on the price it was first sent at while the market moves away.
The four engines
Mechanical engine
Sells iron condors 30 to 65 days out when volatility is rich.
- IV Rank floor
- 50
- DTE band
- 30-65
- Short delta
- 0.20
- Wing width
- $10 (5/10/15/20 per account)
- Profit target
- 50% of max
- DTE backstop
- 21
The default engine. It sells iron condors at 30 to 65 DTE on liquid, non-earnings underlyings whenever IV Rank is at or above 50. Monthly expirations are preferred for liquidity.
Closes at 50% of the credit collected, or at 21 DTE regardless if the target is never reached, since the theta-to-gamma tradeoff degrades past that point. The roll ladder may engage when a short strike's delta reaches 0.45 or the underlying moves more than 1.5x the implied move at entry, but for defined-risk iron condors the bot prefers to let it ride or close rather than roll.
Earnings IV-crush engine
Enters before an earnings report, holds through it, closes the morning after.
- IV Rank floor
- 50
- Short strikes
- Further of 0.16Δ and 1.3× implied move
- Wing width
- $10, credit ≥ 1/3 of width
- Selection
- Beta ≤ 1.3, implied move ≤ 8%, calmest first
- Expiry
- ≥ 7 days past the report
- Exit
- Profit target next morning, else standard defense
Enters before an earnings report when IV Rank is at or above 50. Short strikes anchor to the implied move the market is pricing for the report, on 10-point wings, only when the credit is at least a third of the wing. Names that price as true binaries never make the list: beta above 1.3 or an implied move over 8% of the stock price screens a candidate out, and the remaining names are ranked calmest-first.
The chosen expiry sits at least a week past the report. The morning after, a position at its profit target closes immediately to bank the crush; anything else hands off to the same management rules as a mechanical position, delta defense and the roll ladder on a tested side.
Volatility contraction engine
Fires on non-earnings IV spikes and rides the fast mean-reversion back down.
- IV Rank floor
- 80 + confirmed jump
- DTE band
- 7-21
- Short delta
- 0.16
- Exit
- Vol normalized or 3 DTE
Fires on non-earnings IV spikes. The trigger requires both an IV Rank above 80 and a confirmed recent jump, so static high-IV names do not constantly trigger.
Short-dated structures (7 to 21 DTE) ride the fast mean-reversion at a tighter 16-delta for extra probability cushion on the shorter clock. Exit is the first to fire: IV Rank normalizes back below 30, profit target hits, or 3 DTE.
Directional engine
The offensive engine: enters only on a strong directional signal, off by default.
- Default
- Off
- Signal
- News-derived bias or chain skew
- Structure
- Credit-funded debit pair
- Reward:risk floor
- Configurable
- Book share
- Capped, 25% on Robin's accounts
Enters only when a strong directional signal is present: a high-confidence news bias or an explicit chain-skew inference. Prefers credit-funded pair structures, selling a credit spread to subsidize a directional debit. Off by default and operator-enabled. Its share of the book has its own ceiling (15% by default; Robin's accounts run it at 25%), so a losing streak in the offensive engine stays contained.
News gate, all engines
Runs before every engine's own exit rules, on every open position, every cycle.
- High-confidence opposing news (≥ 0.90) closes the position immediately, regardless of loss depth.
- Lower-confidence opposing news (≥ 0.75) reduces the position to half size instead of closing it outright. After a reduce, the bot waits two days before opening a new position on that stock.
- Non-directional structures (mechanical, earnings, contraction) treat both strongly bullish and strongly bearish news as a threat. Directional positions only react to news opposing their own direction, bearish news for a bullish structure, bullish news for a bearish one, so a winning position is never closed by favorable headlines.
Headline-triggered entries
An optional fast path into a trade, on or off per account.
A strong, fresh company headline can open a trade on that symbol right away, ahead of the scheduled scan. The trade still has to pass the same price, risk, and liquidity checks as any other entry and counts toward the per-cycle entry limit. The headline label only says which way the news points; the deterministic entry rules decide whether a trade opens and how big it is. Positions opened this way are managed with the fast-exit profit targets in the exit table below.
The exit state machine
Every open position is evaluated on every cycle. Rules fire in priority order below; the first rule that matches wins.
| # | Rule | Trigger | Action |
|---|---|---|---|
| 1 | Assignment cleanup | A stock leg exists (early assignment occurred) | Close the whole position immediately |
| 2 | News gate | High-confidence opposing news | Close at ≥ 0.90 confidence regardless of loss depth. Reduce by half at ≥ 0.75. Flag only at ≥ 0.60 |
| 3 | Fast exit | News-triggered entries, sliding profit target | 15% within 30 min, 25% within 2h, 35% within 12h |
| 4 | VIX collapse | VIX drops 5+ points since entry and position is profitable ≥ 25% of max | Harvest the IV crush |
| 5 | Expiry flatten | Expiration day after 1:00 PM ET | Close regardless of P&L |
| 6 | Assignment risk (proactive) | ITM short with extrinsic value below $0.10/share | Pulled before assignment |
| 7 | Per-engine rules | None of the above fired | Profit target (50% mechanical/earnings/contraction, 82% directional) → hard stop (off by default) → delta defense (roll ladder) → earnings avoid → DTE backstop |
| 8 | Hold | Nothing fired | Hold through to the next cycle |
Profit-target exits also check market width before firing: if the widest leg is quoted more than 30% wide, the close waits for a tighter market rather than paying that spread. Defensive and must-fill exits, including the news gate and assignment cleanup above, are never delayed by this check.
The roll ladder
When a short strike is tested, its delta reaches 0.45 or the underlying has moved more than 1.5x the implied move at entry, ACondor engages the roll ladder. For undefined-risk structures (strangles), it rolls the tested side out in time and further OTM for a net credit.
For defined-risk structures (iron condors), the wing already caps the loss, so a tested condor with weeks left is defended before it is closed. With more than 21 days to expiration and no abnormal move, the bot rolls for credit or holds, keeping the time and the credit that make the position recoverable. It closes on a tested strike once time is running short, or right away when the strike is genuinely lost: the short at 0.60 delta or more and the underlying past 1.5× the implied move at entry. A vertical roll, bringing the decayed untested side in toward the money for extra credit, is available but off by default.
Risk controls
| Control | Trigger | What happens |
|---|---|---|
| VIX kill switch | VIX ≥ 30 / 35 / 40 by risk profile (35 on Custom) | Halts new entries for the rest of the session |
| Macro halt windows | FOMC or CPI release windows | Halts new entries |
| Intraday risk-off halt | SPY drops 1.5% or VIX jumps 5 points on the day | Halts new entries |
| Control | Trigger | What happens |
|---|---|---|
| Daily loss circuit breaker | -3% / -5% / -7% of NLV by risk profile (realized P&L); -$500 or -5% on Custom | Halts new entries for the session |
| Weekly loss circuit breaker | -6% / -10% / -14% of NLV by risk profile (realized P&L); -$1,500 or -10% on Custom | Halts new entries for the week |
| Sector concentration cap | 2 / 3 / 7 positions per sector by risk profile; bond funds count in their own Fixed Income bucket | Blocks a further same-sector entry |
| Allocation cap | 20% / 35% / 50% of net liq by risk profile (10% on Custom) | Blocks further entries |
| Buying power ceiling | 50% / 70% / 80% of broker buying power by risk profile, including manual positions | Blocks further entries |
| Beta-weighted delta band | Book leans further than 1% of net liq per 1-point S&P move | Only balancing trades are opened |
| Position count cap | Deployable dollars divided by $900; each position counts by its size, never more than one place | Blocks further entries |
| Control | Trigger | What happens |
|---|---|---|
| Per-trade risk cap | 3% / 5% / 8% of NLV by risk profile, never more than $1,000 by default | Candidate is skipped, not resized |
| Volatility risk premium gate | Implied volatility must exceed recent realized volatility | Candidate is skipped |
Daily and weekly loss limits are based on realized P&L, losses from positions actually closed, not open drawdown in positions still held. A volatility spike that reverses within a day or two won't trip a halt on its own; the VIX kill switch and intraday risk-off halt are the controls that respond to market-wide stress directly.
Figures written as three values follow the account's risk profile: Conservative, Balanced, Active. Custom keeps the values you set. The six safety gates (daily loss, weekly loss, VIX, Fed decision days, CPI days, and the intraday risk-off halt) each have their own switch in Settings with the number in force written underneath, and the Overview bar shows whether each one is on, paused because it fired, or switched off. Turning a gate off asks you to confirm first and is recorded, and a switched-off gate still records when it would have fired.
Multi-account architecture
ACondor manages multiple tastytrade accounts simultaneously from a single dashboard. Each account has its own credentials, dry-run toggle, trading-enabled toggle, and per-account config overrides. The scanner runs once; positions and fills are isolated per account number in the database. One bot process handles them all.
Each position row carries at-a-glance status cues: an account chip showing which account and environment (paper or live) it belongs to, an earnings badge when a name is inside its earnings window, and a mark-freshness indicator so a stale quote is never mistaken for a current one.
A paper account is held to the live account's standard. Paper entries pay the same price concession live entries pay, paper rolls can go unfilled, a manual close is queued and filled on the bot's next pass with a fee, and the paper account respects its own buying power. When the broker's test system refuses or times out on a defined-risk paper order, the bot simulates the fill so paper can trade the same expirations live does.
The Parity tab compares every setting on a live account with its paper counterpart and sorts each one: the same, different only because the accounts are different sizes, a declared experiment, or different for no declared reason. Each experiment is written down with the account it runs on, its start date, and its finish line. Once a week the bot gives a verdict per experiment: keep going, ready for the live account, switch it off, or decision due. The verdicts are advice; nothing changes on a live account by itself.
The trading loop resumes on its own after a restart, and the Stop button still stops it. Outside market hours the bot checks in on schedule but skips the market scan, and the Overview shows the cycle as market closed. Only one copy of the bot can trade an account's data at a time; a second copy refuses to start and names the one already running. Asking the dashboard chat to close a position raises the same close request as the Close button, and the trade is booked when the broker fills the order.
Accounting you can check
A premium-selling strategy earns in many small increments, which means friction compounds. Every order records the broker's own fee calculation, commissions plus regulatory and clearing charges, taken from the same validation the broker runs before accepting the trade. Performance is reported gross and net of those fees side by side, so a strategy is never judged on a number it did not actually keep.
Closed trades book from actual fills, never from estimates, and live positions are valued from the broker's own marks. Roll a position and you get two figures, both true: the campaign result since the trade was opened, and the profit on just the legs currently open, which is what your brokerage shows.
If you close one of the bot's positions yourself in tastytrade, it does not sit there as an unresolved row. On its next pass ACondor reads your account's transaction history, finds the fills and fees that actually executed, records the real result, and notifies you that it did.