All Fred versions

Fred v1.1

v1.0, but only on names whose pre-market volume is at least 3x their daily average.

Locked 2026-11-09Based on v1.0Data SIP real time
+61%Backtest return
−15%Backtest max drawdown
43%Win rate, 173 trades
–Forward test return
0Forward trades / days
Idea

Why it should work

v1.0 trades anything that does 90% of a normal day's volume before the open. Across the backtest, the names in the top fifth by that ratio made almost all of the money and the bottom half lost. v1.1 keeps every other rule and simply waits for real heavy volume, 3x the 90-day average, trading less than half as often.

Logic

How it trades

Pre-market: volume filter, PM high formsRegular session: watch for the cross, one entry, +TP / −SLroster 09:30flat at close04:0006:0008:0010:0012:0014:0016:00last entry 15:59
The trading day, New York time
  1. Universebefore 04:00 ET

    Nasdaq, NYSE and NYSE American common stocks whose previous close was under $5, with at least 20 sessions of history.

  2. Volume filter04:00 to 09:30 ET

    Pre-market volume reaches at least 3x the stock's average daily volume over the previous 90 sessions (v1.0: 0.9x). The names that pass at 09:30 are the day's roster.

  3. Triggerfrom 09:30 ET

    The first regular-session trade above the pre-market high. If the stock opens above it, Fred waits for a trade back below and then a new cross.

  4. Calm-before-break gateat the cross

    Volume over the 5 minutes before the cross, per minute, must be under 2x the average pre-market volume per minute. A spike into the level is skipped.

  5. Entryat the cross

    Marketable limit order, immediate-or-cancel, at the pre-market high +1%. If the ask is already higher, there is no trade. One entry per stock per day, none after 15:59.

  6. Exituntil 16:00 ET

    Limit sell at +25% from the fill, stop at -10% from the fill, otherwise sold in the closing auction.

  7. Sizeper trade

    10% of the day's starting equity per trade (5% roughly halves the drawdown). The backtest also caps size at 10% of the entry minute's volume.

Parameters, read from the locked config

UniversePrevious close under$5.00
UniverseExchangesNASDAQ, NYSE, AMEX
UniverseMinimum history20 sessions
RosterPre-market volume≥ 300% of the 90-session average daily volume
RosterRoster fixed at09:30 ET
EntryLimit (IOC)pre-market high +1%
EntryCalm before breaklast 5 min volume/min < 2x pre-market volume/min
EntryNo entry after15:59 ET
EntryEntries per stock per day1
ExitTake profit+25% from the fill
ExitStop loss-10% from the fill
ExitEnd of dayclosing auction (MOC)
SizePer trade10% of the day's starting equity
Full config (configs/versions/v1.1.yaml)
# Fred v1.1 (draft, child of v1.0): pre-market volume >= 3x the 90-day average (v1.0: 0.9x).
# Everything else is v1.0 unchanged. Rules in words: docs/versions/v1.1.yaml.
#   fred shadow configs/versions    nightly forward test next to v1.0
name: fred_v1_1
plan: paid            # SIP real time (Algo Trader Plus). IEX misses ~99.8% of pre-market volume.

scanner:
  prep_at: "03:50"
  start: "04:00"
  poll_seconds: 60
  watchlist_at: "09:00"
  roster_at: "09:30"
  watchlist_min_progress: 0.5      # "on track" = at least 50% of the volume threshold by 09:00
  max_lines: 15
  baselines:
    max_price: 5.0                 # previous raw close under $5
    exchanges: [NASDAQ, NYSE, AMEX]
    avg_sessions: 90
    min_history: 20
  filters:
    - {cls: fred.scanner.filters:PriceBand, params: {max_price: 5.0, field: prev_close}}
    - {cls: fred.scanner.filters:PremarketVolumeVsAverage, params: {ratio: 3.0}}

trader:
  broker: alpaca_paper             # alpaca_paper | sim (dry run, no orders sent)
  poll_seconds: 1                  # how often the last trade is checked for the cross
  last_entry: "15:59"
  max_entries_per_symbol: 1
  # first trade above the PM high from 09:30 (after a dip below if it opened above) -> limit IOC at PM high x 1.01
  entry: {cls: fred.signals.pm_high_breakout:PmHighCross, params: {max_chase: 0.01}}
  gates:                           # checked at the moment of the cross
    - {cls: fred.live.gates:CalmBeforeBreak, params: {lookback: 5, max_ratio: 2.0}}
  exit: {cls: fred.exits.target_stop:TargetStop, params: {take_profit: 0.25, stop_loss: 0.10}}
  close_order: moc                 # anything still open sells in the closing auction
  close_buffer_minutes: 15         # MOC sent at 15:45 (Alpaca cutoff 15:50); 12:45 on half days
  sizer: {cls: fred.sizing.percent:PercentOfEquity, params: {pct: 0.10, skip_if_insufficient_cash: true}}
  # The spec also caps size at 10% of the entry minute's volume. That volume is only known after the
  # minute ends (the backtest used the full bar), so live runs without the cap; the trade log
  # records the entry minute's volume to check afterwards whether it would have bound.
  # To turn a live estimate on: add max_participation: 0.10 to the params above.
  risk:
    - {cls: fred.risk.guards:KillSwitch}
Backtest · Jan 2, 2025 to Nov 6, 2026

Results the version was chosen on

Replayed tick by tick (scripts/fred_v1x.py export). Buys at the ask 1 second after each trigger, stops sell at the bid 1 second later, targets fill at the limit, no entry and no target/stop from 15:45, still open sells at the official close. Fees: SEC and FINRA on sells. $25,000 start.

173Trades (0.4 a day)
+2.9%Average trade
+19% / −9%Average win / loss
$40,302Final equity
$25,000$30,000$35,000$40,000$45,000Apr ’25Jul Oct Jan ’26Apr Jul Oct
Equity, $25,000 start, red dot = deepest drawdown (−15%)
−10%−5%+0%+5%+10%Jan 2025: +4.1%Feb 2025: +3.2%Mar 2025: +6.7%Apr 2025: −1.1%May 2025: +2.6%Jun 2025: +5.2%Jul 2025: −2.2%Aug 2025: +4.4%Sep 2025: +5.6%Oct 2025: −1.3%Nov 2025: −4.0%Dec 2025: +2.1%Jan 2026: −6.7%Feb 2026: −3.4%Mar 2026: +8.7%Apr 2026: +1.8%May 2026: +3.2%Jun 2026: +10.0%Jul 2026: −3.2%Aug 2026: +5.3%Sep 2026: +6.8%Oct 2026: −1.4%Nov 2026: +4.0%Jan ’25AprJulOctJan ’26AprJulOct
Return by month, on the account above

By year: 2025: +27.6% · 2026: +26.4%. Exits: 29% target · 47% stop · 24% close. 15 of 23 months positive.

Forward test · updated nightly

How it is doing since the lock

Every weekday after the close, the day is replayed tick by tick from the delayed SIP tape exactly as this config would have traded it.

No forward-test days yet. The nightly replay adds one row per roster name after every US session.

Read with care

Caveats