Quantitative Market Intelligence & Execution System
Investment Policy Statement (IPS)
Autonomous Intraday Momentum Breakout Strategy
Robinhood Agentic Trading Platform
| Strategy Name | Atlas Intraday Momentum Breakout v1 |
| Asset Class | US Equities (Long-Only) |
| Universe | S&P 500 constituents (≥1M ADV, $10+ price) |
| Timeframe Stack | 5-minute (execution) / 30-minute (context) / 1-day (bias) |
| Entry Window | 09:35–11:00 ET (90-min morning window) |
| Holding Period | Intraday only; hard flatten 15:45–15:50 ET |
| Max Concurrent Positions | 3 (max 2 per sector) |
| Account Type | Robinhood Cash Account ($500–$1,000); no PDT rule applies |
| Execution Mode | Fully Autonomous, Risk-Engine Gated |
Stocks exhibiting relative volume ≥2.0x, price above a rising 5-minute EMA20/EMA50 alignment, and a clean breakout above a well-formed consolidation (≥6 bars, range ≤0.75×ATR) during the first 90 minutes of regular trading hours have positive expectancy when:
Edge is captured via fixed-R risk management: entry at trigger, stop below base, half position sold at +2R profit, remainder trailed under 5m EMA9 with 5¢ offset. All risk bounded per-trade (0.50% equity) and per-day (2.0% equity).
Strategy verified against Robinhood MCP schemas for place_equity_order, review_equity_order, cancel_equity_order, get_equity_historicals, get_equity_quotes, and related tools. Key compatibility points:
| Input | Source | Staleness Limit |
|---|---|---|
| Equity, Cash, Buying Power | get_portfolio(account) |
60 seconds |
| Open Positions | get_equity_positions |
60 seconds |
| Open Orders & Statuses | get_equity_orders |
30 seconds during QUEUED state |
| Realized Daily/Weekly P&L | get_realized_pnl, get_pnl_trade_history |
60 seconds / 5 minutes |
| Tradability & Halt Status | review_equity_order alerts |
Per order submission |
get_equity_historicals(interval) for watchlist symbols and SPY.get_equity_quotes for last price, bid/ask spread.risk_engine.py clock (ET, weekday, market-hours flags).get_earnings_calendar premarket check (once per day).config/event_lockouts.json (Fed/macro event calendar).All computed from raw OHLCV data per fixed definitions:
A setup is valid only if all of the following hold:
close_5m > EMA20_5m > EMA50_5m.close_30m > EMA20_30m.close_1d_prev > EMA200_1d.RVOL ≥ 2.0.0.40% ≤ ATR_pct ≤ 2.50%.ConsolRange(6) ≤ 0.75 × ATR14_5m.GapExt_pct ≤ 3.0%.close_5m ≥ 0.995 × BreakoutLevel.Trigger: last_price > BreakoutLevel (monitored in real-time between bar closes).
Execution upon trigger:
min(last_price, BreakoutLevel × 1.0010) (marketable limit, +0.10% cap).max(base_low − 0.05, entry_limit − 1.2 × ATR14_5m) (whichever is tighter).(entry_limit − stop_price) / entry_limit ≤ 2.0%.risk_engine.py validate-order must return approved=true.review_equity_order must show no blocking alerts.place_equity_order(type=limit, limit_price=entry_limit, gfd, regular_hours, ref_id=uuid).stop_market(side=sell, stop_price, filled_qty, gfd).r_unit_usd = filled_qty × (avg_fill − stop_price).tp_price = avg_fill + 2.0 × (avg_fill − stop_price).Size computation from risk capital, expressed in whole shares:
risk_dollars = equity × 0.0050 # 0.50% per trade stop_distance = entry_limit − stop_price # > 0, enforced by rules raw_shares = floor(risk_dollars / stop_distance) cap_notional = floor((equity × 0.25) / entry_limit) # ≤25% per position cap_bp = floor((min(cash, buying_power) − 100) / entry_limit) cap_liquidity = floor(0.0005 × ADV20) # ≤0.05% of ADV20 cap_openrisk = floor(max(0, equity×0.015 − open_risk_usd) / stop_distance) shares = min(raw_shares, cap_notional, cap_bp, cap_liquidity, cap_openrisk) shares = shares × regime_size_mod # Apply regime multiplier IF shares < 1: REJECT trade
Exits evaluated at each cycle in strict priority order. A higher-priority exit preempts lower ones. All exits logged with full decision context.
| P | Exit | Trigger | Mechanism |
|---|---|---|---|
| 1 | Take-Profit (Half) | last_price ≥ tp_price = avg_fill + 2.0R |
Limit sell ceil(qty/2) at max(tp_price, bid) |
| 2 | Breakeven Move | Immediately after P1 fills | Cancel stop → new stop_market(avg_fill + $0.01) |
| 3 | Trailing Stop | Each evaluation cycle post-TP | Trail = max(prior_trail, min(EMA9_5m, bar_low) − 0.05); re-place if > current_stop + 0.05 |
| 4 | Regime Exit | Regime becomes TREND_DOWN or HIGH_VOL | Tighten: stop_market(max(current_stop, last_price − 0.5×ATR)) |
| 5 | Time Stop | Position age ≥ 24 bars (2h) AND unrealized < +1.0R | Full exit via J2 limit sequence |
| 6 | EOD Flatten | First cycle at/after 15:45 ET with any position | Cancel all orders → market sell all (backed up by risk loop at 15:50) |
| 7 | Risk Halt Flatten | Daily loss limit breached (M3.2) | Emergency flatten (market sell all) |
| Limit | Threshold | Action |
|---|---|---|
| Soft Daily | Realized P&L ≤ −1.5% | No NEW entries; manage exits only |
| Hard Daily | Realized + Unrealized ≤ −2.0% OR equity ≤ 0.98×day_start | FLATTEN ALL, HALTED_RISK, auto-reset next session |
| Weekly | Realized P&L ≤ −5.0% | FLATTEN ALL, HALTED_RISK; manual reset only |
| Consecutive Losses | 3 full stop-loss exits in a row | No new entries for rest of day |
| Minimum Equity | Equity < $250 | No new entries; account too small to size safely |
Every entry must pass risk_engine.py validate-order (approved=true) AND review_equity_order (no blocking alerts). Once approved, orders execute immediately without human intervention. This is the governing mode for this system.
The following conditions halt Atlas and require intervention or automated recovery:
Trigger: Bar age > 90 seconds past close, or quote fetch fails. Action: Skip evaluations; counter++. At 3 strikes, halt new entries. Auto-recover on fresh data.
Trigger: Tool errors on account-state calls. Action: Retry 2× with backoff (5s, 15s). Halt at 3 strikes. Recover after 3 consecutive healthy checks ≥60s apart.
Trigger: Order status neither filled, cancelled, nor rejected after 2 cancel attempts. Action: HALTED_MANUAL_REVIEW. Operator must investigate and resume.
Trigger: Filled qty > ordered qty for an order_id. Action: HALTED_MANUAL_REVIEW; market-sell excess only.
Trigger: Tradability=halted or review_equity_order shows halt alerts. Action: Freeze that symbol's orders (or all if market-wide). Native stops remain live. Auto-recover on tradability restore.
Core Principle: Broker-side native stops are the final line of defense and are never cancelled during halts (except during controlled flatten sequences). During exceptional conditions, positions are protected by their resting stops; Atlas manages the agent-simulated layers (trails, entries, exits).
| Task | Cadence | Hours (ET) | Purpose |
|---|---|---|---|
| Premarket (Loop A) | Once per day | Before 09:25 | Build watchlist, classify regime, no-trade-day check |
| Entry (trading-bot-intraday) | Every 5 min | 09:00–10:59 | Dense entry window; evaluate and execute new setups |
| Manage (trading-bot-manage) | Every 10 min | 11:00–15:59 | Exit management, trails, EOD flatten (first run ≥15:45) |
| Risk (trading-bot-risk) | Every 2 min | 09:00–15:59 | Kill-switch checks, flatten backstop (15:50 trigger) |
After every mutation, write to state/*.json:
positions.json: equity, cash, buying_power, open positions (symbol, qty, avg_cost, entry_time).kill_switch.json: halt status, daily/weekly P&L, trades_today, equity peak.watchlist.json: today's ranked setups, regime classification, no_trade_day flag.decision_log.jsonl: structured event logs per cycle (one record per line).All parameters are fixed for v1; no online tuning allowed.
| Parameter | Value | Used In |
|---|---|---|
| Entry window (ET) | 09:35–11:00 | E-3, K6 |
| EMA20_5m / EMA50_5m / EMA9_5m | 20 / 50 / 9 bars | Entry trend, trailing exit |
| EMA20_30m / EMA200_1d | 20 / 200 bars | HTF alignment, daily bias |
| ATR lookback | 14 bars (Wilder) | Stop sizing, volatility filter |
| ATR % filter | 0.40% – 2.50% | Entry gate (G1) |
| RVOL minimum | 2.0× | Entry gate (G1) |
| Consolidation bars / range mult | 6 bars / 0.75×ATR | Base definition (G1) |
| Max gap extension | 3.0% | Entry gate (G1) |
| Marketable-limit cap | +0.10% | Entry pricing (G1) |
| Stop ATR multiplier | 1.2× | Stop distance (G1) |
| Risk per trade % | 0.50% | Position sizing (I) |
| Max position % of equity | 25% | Notional cap (I) |
| Max portfolio open risk % | 1.5% | Aggregate risk (I) |
| ADV liquidity cap % | 0.05% | Order size (I) |
| Max concurrent positions | 3 | E-7 |
| Max per sector | 2 | E-9 |
| Max daily entries / per hour | 6 / 2 | E-17 |
| Take-profit R multiple | 2.0R | Exit P1 (K1) |
| Daily loss hard stop | −2.0% | M3.2 |
| Weekly loss hard stop | −5.0% | M3.3 |
Resolution (2026-07-06): Account ••••3261 verified as a CASH account via get_accounts. PDT rule does NOT apply. Governing constraints: settled-funds/GFV guard (E-13), price band ≤25% of equity (E-10), whole shares only.
At $750 equity, 0.50% risk = $3.75/trade. Whole-share sizing will reject many valid setups on $50–$150 stocks. Consider 1.0% risk tier while equity < $5,000. Current: 0.50% remains active.
Assumption: get_equity_quotes returns bid/ask fields. Fallback: If absent, disable spread filter (E-11); rely on marketable-limit price caps for protection.
Manual config file config/event_lockouts.json defines Fed/macro event windows. Empty file = no lockouts (logged as WARN at startup). Current: Fed events ±30 minutes.
Resolution (2026-07-06): M4.3 (fully autonomous, risk-engine gated) is active. Approval question moot.
Resolution (2026-07-06): Retimed per Section 9. Entry loop 09:00–10:59 (*/5); manage loop 11:00–15:59 (*/10); risk loop unchanged 09:00–15:59 (*/2).
This rulebook contains no discretionary language. Every decision path is either a numeric comparison or an enumerated state transition. All gates are explicit and testable.
Capital Preservation > Determinism > Fail-Safe Operation > Broker Compatibility > Implementability > Backtestability > Execution Realism > Performance.
Daily JSONL logs (logs/atlas_YYYYMMDD.jsonl) capture:
Logs retain enough data to replay decisions deterministically for backtesting and audit.
All native broker features referenced were verified against live MCP tool schemas except:
This document formalizes the operator's deterministic trading rules for machine execution. It is NOT investment advice. Edge and expectancy are unvalidated; the strategy has not been backtested. This rulebook serves as specification only; use is at the operator's sole risk and responsibility. Comply with all applicable securities laws and regulations.
Document Version: 1.0-final | Effective: July 6, 2026 | Classification: Authoritative Runtime Specification
For revisions, questions, or incident reports, contact the operator.
© 2026. Atlas is an autonomous trading system operating under this Investment Policy Statement.
Not an offer or solicitation. Compliance with all securities laws required.