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.

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 normalized expected return per 30 days ≥ config threshold and an improvement over 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.

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;