Toll Booth Trading
Covered Call

Covered Call Rolling

High-level summary of the Toll Booth covered call position rolling process.

What the “roll positions” function does

  • Time gate: If the current time is after market close, it exits without doing anything.
  • Which positions it considers: Gathers option positions already marked “ready to roll,” tries items with the fewest prior roll attempts first, and avoids multiple items for the same underlying/expiration in one pass.
  • First position processing:
  • Logs and increments the position’s roll-attempt counters and sets the related trade’s “ready to roll” flag to true for this attempt.
  • Asks the trade to build the best available roll order candidate. Three outcomes:
    • 1) Returns a “not ready” reason: record the reason on the position and move on.
    • 2) Returns a candidate but final order-readiness fails: record “order resource not ready” and move on.
    • 3) Returns a fully ready order: place it, then reset the position’s roll-ready flags (general, spread, non-spread) to false.

How the trade-level “should roll” selector works

Pre-checks
  • User-level switches must allow rolling (user not “closing-only” and “should place rolling orders” is true).
  • The trade or its position must be marked ready to roll.
Build the roll template
  • The trade constructs a roll template (“roll-ready resource”). If the template is missing or says it shouldn’t roll, return a reason and stop.
Try candidates in order
  • Prefer pushing the short leg further OTM using progressively smaller strike-distance attempts, with larger steps for high-priced underlyings when appropriate.
  • As a last resort near expiration, try a same‑strike calendar roll. For “preserve equities” accounts, DTE alone can be sufficient; otherwise also require the position not be too far OTM.
First viable candidate wins
  • For each candidate, attempt to build a new order from the template. If the roll-order “not-open-ready” checks pass, return that order immediately; otherwise, try the next candidate.
  • If no candidate yields a ready order, return a concise “no viable” reason.

How the “ready to roll” flag is set

Set during the “reconcile position” workflow. The option‑specific roll readiness phase includes:

Global gates
  • User allowed to place rolling orders.
  • Standard contract format only.
  • Expiration housekeeping aligned with last-known state.
  • Long-leg OTM thresholds avoid blocking later logic.
  • No active rolling orders opening.
  • No underlying trading halt.
Spread branch
  • Requires active spread partner and standard format.
  • Early-ready for near expiry with imminent earnings, or if extrinsic is too low.
  • Not ready if rolled within a recent time window.
  • Short leg close enough; exclude very long DTE.
  • Skip rolling if already a winner beyond a threshold.
  • Very fresh positions are skipped.
Single-leg branch
  • Only short positions qualify; long‑only do not roll.
  • Same‑expiration netting prevents rolling when longs exceed shorts of the same type.
  • Early‑ready if near expiry with imminent earnings, or short puts with very low extrinsic.
  • Not ready if rolled within the last day or if brand new.
  • Not ready if expiration exceeds the “roll forward” limit.
  • Early‑ready if short‑call upside risk crosses threshold.
  • Skip if essentially worthless (below minimum mark).
  • Cooldown windows and far OTM guards.
  • Don’t roll single‑leg if a nearby spread partner exists.
  • Precedence: if diagonal close-ready is true, non-spread roll-ready is blocked.

Roll order “not-open-ready” checks

Basic validity and conflicts
  • Existing position has at least 1 contract available.
  • No overlapping active orders on the same symbols.
  • Intended quantity valid and non‑zero.
  • Both legs (new and existing) complete and consistent.
  • Trade not “do not close”; option data not known bad.
Roll direction sanity
  • Calls roll to equal or higher strikes; puts roll to equal or lower strikes.
Covered call economics
  • Expected net credit must at least compensate a simple carry‑cost over the new time period.
  • For rolls, require the candidate’s annualized theoretical return to meet a configured minimum and improve on the existing short; also require minimum net credit.
Long/short consistency
  • Prevent unintentionally inverting side (e.g., opening short into a long‑only position).
Active‑order de‑duplication
  • If there’s already a rolling‑related active closing order, don’t start another.
Non‑spread add‑ons (single‑leg only)
  • Net credit positive and above a minimum.
  • Position explicitly flagged “ready to roll (single‑leg)” or override set.
  • Respect same‑expiration netting rules again.
  • “Should roll” true on both existing and new legs.
  • Do not single‑leg if part of a spread.
  • Block same‑strike calendar if not close enough to expiration.

If all checks pass, the roll template is marked “open‑order‑ready,” enabling order creation.

Final order readiness checks before placement

Pricing integrity
  • Limit prices valid for non‑market orders.
  • “Open spread” premium within configured bounds.
  • No extreme gaps between the closing leg’s limit and current mark.
  • Calculated marks are consistent.
Anti‑crossing/duplication
  • Avoid matching against opposite active orders (any account).
  • No duplicate orders from the same account.
Order structure
  • Order must have legs and each leg must be ready.
If all pass, the order is marked “ready” and can be placed.

Per‑leg readiness checks for rolling orders

  • Leg exists, links to a trade, and has a numeric quantity greater than zero.
  • Closing legs have real position quantity to close.
  • To avoid crossing or duplication, proactively cancel:
    • Opposite‑instruction order legs that would otherwise match.
    • Opposite simple orders that would match.
    • Excess active closing orders that already cover the position quantity.

Putting it all together for a single position

  • During normal market hours, take the first “roll‑ready” option position.
  • Increment attempt counters and temporarily mark the trade as “ready.”
  • Choose the best roll: larger strike moves first, then smaller, finally same‑strike near expiration; stop at the first candidate producing a valid, conflict‑free order.
  • If template checks fail or final order checks fail, record the reason and stop for this position.
  • If everything passes, send the order to the broker API and clear roll‑ready flags to avoid immediate reprocessing.

Additional technical gates and algorithms

Ex‑dividend override (economics)
  • When an ex‑dividend date is near, a roll may proceed even if the expected net credit is below the normal carry‑cost screen, to reduce assignment risk.
Annualized return roll gate
  • Require the candidate roll’s annualized theoretical return to meet a configured minimum.
  • When the existing short leg’s annualized return is known, the candidate must also be at least as good (or satisfy a configured improvement margin).
  • Additionally require a minimum net credit; a general roll minimum applies when no specific covered‑call roll minimum is set.
Retirement‑account last‑unit guard
  • In retirement accounts, rolling can be blocked when only one covered‑call unit remains and another rolling order is already active, to avoid duplicating the last unit.
Spread protection for single‑leg rolls
  • Single‑leg rolls are blocked if they would implicitly break an existing call spread (e.g., when no active short‑call quantity exists in the target structure).
Strike‑step algorithm and high‑price accelerant
  • Rolling attempts use progressively smaller moves further out‑of‑the‑money based on an internal max‑strike‑width policy.
  • For higher‑priced underlyings, the engine tries larger OTM moves earlier in the sequence before falling back to the standard steps.
Same‑strike calendar roll gates
  • Same‑strike rolls are allowed only when the position is near expiration (configurable threshold).
  • For non “preserve‑equities” accounts, also require the short leg to be less than ~4% OTM.
Carry‑cost basis used in roll economics
  • Carry cost over DTE combines financing (share cost × rate ÷ 365) minus daily dividends, multiplied by days to expiration.
  • That cost is compared against strike difference plus expected roll credit (per share × 100). Rolls should not proceed when credit is below carry cost unless the ex‑dividend override applies.
  • For roll vertical opens, when ΔDTE ≥ 120 days a no‑discount multiplier floor is applied to the open‑spread multiplier per config (trading.rollSpreadDteNoDiscount) option.
  • Time‑windowed roll selection
    • Scheduled jobs pre‑filter roll candidates by expiry windows (e.g., today, 3/7/14/30/45/60/120/150/180 days) and percent‑OTM limits before attempting to build and place roll orders.
    Cost‑basis “allow assignment” rule
    • On non‑preferred covered‑call symbols, do not roll when the stock’s average price is below the short‑call strike (favor assignment instead). If excess short calls exist, this rule does not block rolling.

    Process flow diagram

    Visual summary of the covered call rolling workflow described on this page.

    %%{init: {"theme":"base","flowchart":{"curve":"basis"},"themeVariables":{
      "fontFamily":"Inter, Nunito, system-ui",
      "primaryTextColor":"#e5e7eb",
      "primaryColor":"#111827",
      "primaryBorderColor":"#94a3b8",
      "lineColor":"#94a3b8",
      "tertiaryColor":"#0e1729",
      "tertiaryBorderColor":"#22d3ee",
      "edgeLabelBackground":"#00000000"
    }}}%%
    flowchart TB
      A([Start]) --> TG[Time gate]
      TG -->|After market close| OUT[Stop: after market close]
      TG -->|Pass| SEL{Positions ready to roll?}
      SEL -->|No| OUT
      SEL -->|Yes| FP[First position]
      FP --> INC[Increment roll attempts; set trade ready]
      INC --> TPL[Build roll template]
      TPL --> TPLV{Template valid}
      TPLV -->|No| OUT
      TPLV --> TRY[Try roll candidates in order]
      TRY --> CAND{Candidate viable}
      CAND -->|No| NEXT([Outcome: no viable candidate this pass])
      CAND -->|Yes| ORD[Build roll order]
      ORD --> NRR[Not-open-ready checks]
      NRR -->|Fail| OUT
      NRR --> ORC[Final order readiness checks]
      ORC -->|Fail| OUT
      ORC --> LRC[Leg readiness]
      LRC -->|Fail| OUT
      LRC --> PLACE[Place order]
      PLACE --> SUC{Placed successfully}
      SUC -->|Yes| DONE([Outcome: roll order placed; flags cleared])
      SUC -->|No| OUT
    
      classDef step fill:#111827,stroke:#94a3b8,color:#e5e7eb,stroke-width:1px;
      classDef gate fill:#0e1729,stroke:#22d3ee,color:#e5e7eb,stroke-width:1px;
      classDef out fill:transparent,stroke:#94a3b8,color:#cbd5e1,stroke-dasharray:5 3;
    
      class A,TG,SEL,FP,INC,TPL,TPLV,TRY,CAND,ORD,NRR,ORC,LRC,PLACE,SUC,DONE,NEXT step;
      class SEL,TPLV,CAND,SUC gate;
      class OUT out;
                      

    Nearer‑expiry rolls in easing volatility

    When volatility is easing (regime “down”), short options may be pulled forward to nearer expirations under a feature‑gated policy.

    • Regime preference: Applies when Quote.isVolatilityMoverDown is true.
    • Scope: Single‑leg shorts and the short leg of spreads; instruments: short calls and short puts.
    • Windows: Current DTE must be within [7, 60] days; short‑leg percent‑OTM must be within [−2%, +8%] (tighter +6% max for Preserve‑Equities).
    • Pruning: Candidate expirations are restricted to a nearer window: no dates after current DTE; no dates before max(minAfter, currentDte − maxPullForward). A dynamic taper reduces pull‑forward as the short leg moves further OTM.
    • Risk/event guards: Block when earnings are within 7 days, and for covered calls when ex‑dividend is within 7 days.
    • Economics: Let the standard covered‑call roll gate enforce annualized return and net‑credit thresholds; the nearer pre‑pass itself is primarily DTE/percent‑OTM and event‑driven.
    • Cooldown: Respect a 24‑hour cooldown after a recent roll.

    Configuration lives under trading.rollNearer with keys for enablement, OTM/DTE bands, pull‑forward caps, event guards, ROI floor, dynamic taper, and cooldown.

    How “Preserve Equities” affects rolling

    When enabled, the system prioritizes keeping long‑equity exposure and hedging conservatively. This tightens selection and pricing for rolls.

    Candidate selection and pricing
    • Uses tighter delta ceilings for short calls to avoid overly aggressive rolls.
    • Prefers longer days‑to‑expiration on hedging rolls to reduce assignment risk.
    • Applies a premium floor suited for lower‑priced underlyings so rolls remain viable while still conservative.
    Same‑strike calendars near expiry
    • Near expiration, DTE alone can be sufficient to attempt a same‑strike calendar roll.
    • For non‑preserve‑equities accounts, an extra guard requires the short leg not be too far out‑of‑the‑money before attempting same‑strike.
    Risk caps and deltas
    • Stricter upside‑risk caps and lower short‑call delta limits are applied to protect core equity holdings.
    • When other hedges exist (e.g., protective puts), caps are adjusted to avoid over‑hedging.
    Scheduling and readiness
    • Same rolling windows and readiness flags apply; the flag mainly narrows which candidates qualify and how far out they roll.
    • Cost‑basis and “allow assignment” rules still apply; preserve‑equities doesn’t force a roll when assignment is preferable.