Methodology

The bot is fully autonomous: nothing is hand-picked per run. Every decision — which stocks, which direction, which strike and expiration, and whether to fire at all — comes out of the fixed rules below. It runs once each trading morning, about 15 minutes after the open, and posts up to three signals to Discord. On most days no stock passes every check, and the bot posts a short “nothing qualified” digest instead of forcing a trade.

The screening rules

  1. 1

    Universe

    A seed list of ~180 liquid U.S. stocks, filtered each morning by price range, average share volume, dollar volume, and enough daily range (ATR) that a move can plausibly pay for the premium.

  2. 2

    Trend

    For a call: close above the 21-day EMA, which is above the 50-day EMA, which is above the 200-day average, with ADX showing a real trend. Puts are the mirror image.

  3. 3

    Momentum

    RSI inside a non-extreme band (50 to 70 for calls) and a positive MACD histogram, so the bot isn't chasing something already stretched or rolling over.

  4. 4

    Trigger

    A new 20-day high on relative volume of at least 1.5x its normal level, without price already running too far above the 21-day EMA. An EMA-pullback bounce trigger exists but is off by default because it lost money in testing.

  5. 5

    Contract checks

    The live option chain has to pass: open interest of at least 500, bid/ask spread of 10% or less, IV not in the top of the stock's own range (true historical IV isn't available on free data, so current ATM IV is compared to trailing realized volatility), a premium under the per-trade cap, and no earnings report inside the contract's life.

From score to contract

Stocks that pass every rule are ranked by a 0–100 setup score built from trend strength, relative volume, relative strength versus SPY, and setup quality. The score ranks setups against each other; it is not a win probability. For each survivor the bot picks the expiration closest to its preferred days-to-expiry and the strike nearest a target delta (slightly out-of-the-money, for leverage). Target and stop are projected from an ATR multiple of the underlying. Until 7 October 2026 the bot used a five-layer blend (technicals, options flow, news sentiment, an XGBoost model, and market regime) instead; signals published before that date came from it, and the full record of them stays on this site.

What the rules backtest found

The rules were tested on 176 liquid names over about five years, with 4% per side slippage, earnings excluded, and parameters chosen on in-sample data only. The best in-sample variant (20-day breakout, ADX 15 or higher, relative volume 1.5x or higher) produced 131 out-of-sample trades with a 43% win rate and an average of +0.4% per trade. The 95% confidence interval runs from about −12.7% to +13.5%, so it is indistinguishable from zero, against −11.9% per trade for random entries. The pullback variant lost money in-sample. Pricing assumes IV at 1.1x realized, which flatters buyers.

Bottom line: no demonstrated predictive edge, and buying single options loses roughly 5–12% per trade even on random entries. The live, graded track record is the real forward test.

How outcomes are graded

A tracking job checks every open signal daily against the underlying’s actual traded high and low (dividend-unadjusted, so a real touch of a level isn’t hidden by a back-adjustment). Any touch of the target at any point during the signal’s life — not just at expiration — counts. The first level touched wins: target → WIN, stop → LOSS. When a single day’s bar spans both levels, the grader drops to hourly bars for that day to see which came first; if hourly data isn’t available (older than ~60 days) it falls back to scoring the day as a loss. The signal’s first day is graded from hourly bars after the 09:45 ET publish time, so price action before the signal existed never counts. A signal that reaches expiration having touched neither level is EXPIRED and reported separately — never folded into the loss column. Win rate = wins ÷ (wins + losses).

The backtest below uses the same intraday first-touch rule, but free historical data has no hourly bars going back years, so its same-day-both-touched case always scores as a loss.

What the P&L numbers are — and aren’t

  • Estimated, not filled. Free historical options data (real bid/ask, IV, open interest through time) does not exist. Every P&L figure on this site is the Black-Scholes value of the contract at the underlying’s exit price versus the estimated entry premium.
  • Gross. No commissions, no slippage, no early assignment, no partial fills.
  • The live record is young and small. Durable signal persistence began on 27 August 2026; anything before that was not reliably stored. A few dozen signals is not a track record — treat the backtests as the primary evidence for now, and read them as showing no edge.
  • This is a research project. It is not investment advice, not a recommendation, and not a solicitation. Options frequently expire worthless. Past performance — live or simulated — does not predict future results.

The bot’s source lives in a private repository. This site reads its database and published backtest directly and adds nothing.