# Stratucation 2023 Playlist Guide
Source: https://docs.stratalerts.com/2023-stratucation-course
Transcript-based notes for Sara's 2023 Stratucation playlist. 17 lesson summaries and key concepts.
[Open Complete Playlist](https://www.youtube.com/playlist?list=PLoOwDUfJHOPCvUhRARFX0HjUOgULiyTuy)
## How to Use These Notes
1. Watch lesson -> read summary -> run the practice prompt on real charts.
2. Capture one screenshot per lesson where you can label the exact concept.
3. Do a weekly review and mark which concepts are still unclear.
***
### Lesson 1: Scenarios + Candle Color
Covers candle anatomy (open, high, low, close), scenario IDs, and how color is determined. Emphasis: use clean Japanese candles and learn structure before setups.
* **Focus skill:** classify candles correctly and fast.
* **Practice:** label 50 bars by scenario and direction.
[Watch lesson](https://www.youtube.com/watch?v=xIqVZ1tmHpU)
- The lesson starts with candle construction: open/high/low/close must be second nature before setup work.
- It emphasizes reading standard candlesticks instead of smoothed alternatives because lag can distort structure.
- Scenario IDs are introduced as range-relationship labels, not prediction labels.
- A major point is that live-candle color can change during the bar as price crosses the open.
- Practical implication: avoid making directional assumptions until you know where price is relative to open and trigger.
***
### Lesson 2: Full Timeframe Continuity
Frames continuity as a control model: identify which side is in charge and align with that side. Priority is not prediction, it is trading with current control.
* **Focus skill:** read control vs conflict across frames.
* **Practice:** log continuity state each morning for one week.
[Watch lesson](https://www.youtube.com/watch?v=O28St2jI8ww)
- Continuity is framed as "who is in control right now," not "who I think should win."
- Full continuity is described as several relevant frames aligned, not every possible frame from monthly to one-minute.
- Conflict across frames is treated as reduced clarity and lower-quality follow-through conditions.
- The lesson encourages selecting trades that align with the stronger side rather than forcing counter-control ideas.
- Practical implication: continuity should be a pre-trade filter, not a post-trade excuse.
***
### Lesson 3: Actionable Signals, In Force, Magnitude
Introduces setup families, confirms the idea of "in force," and explains why magnitude matters for trade quality. Strong reminder: direction and structure matter more than candle color obsession.
* **Focus skill:** identify trigger level and objective level.
* **Practice:** mark in-force state on 20 historical setups.
[Watch lesson](https://www.youtube.com/watch?v=Ano2Vf1g2gc)
- The transcript repeatedly states that setups are evaluated on live bars, so context can update intrabar.
- "In force" is treated as a state change once trigger is broken, not merely a pattern label on a static chart.
- Magnitude is used to judge whether there is enough room for the trade to justify risk.
- There is strong emphasis on trading direction and structure rather than obsessing over candle color alone.
- Practical implication: every setup should include trigger, in-force condition, and objective zone before entry.
***
### Lesson 4: Stop Losses
Treats stops as active defense and management tools, not passive "worst-case" placeholders. Highlights quick feedback entries where trade quality is obvious early.
* **Focus skill:** stop placement based on setup invalidation.
* **Practice:** compare tight vs loose stop outcomes in replay.
[Watch lesson](https://www.youtube.com/watch?v=WqER5nfBe9E)
- Stops are presented as active protection tools, not purely catastrophic fail-safes.
- The lesson favors entries that reveal quickly whether the idea is right or wrong, enabling tighter initial defense.
- It distinguishes Strat stop logic from generic TA stop placement by tying invalidation closely to setup structure.
- Risk handling is discussed as ongoing management, not one-time placement.
- Practical implication: place stop where setup is invalid, then size position from that distance.
***
### Lesson 5: Targets, Magnitude, Exhaustion Risk
Uses pivots and structural levels to define objectives, then links target interaction to exhaustion behavior. Message: where price has room determines whether setup quality is real.
* **Focus skill:** map realistic target path before entry.
* **Practice:** tag exhaustion risk on your last 30 trades.
[Watch lesson](https://www.youtube.com/watch?v=Ug1ous5mXXc)
- The transcript defines a complete trade plan as entry + stop + target, with no exceptions.
- Targets are tied to structural pivots, not arbitrary percentages.
- As key targets are reached, exhaustion risk is treated as increasing and continuation quality can drop.
- The lesson links target completion to possible reversal activity and management adjustments.
- Practical implication: do not evaluate setup quality without first mapping where price could reasonably travel.
***
### Lesson 6: The Flip + Simultaneous Breaks
Explains what happens when control shifts quickly, including flip behavior and simultaneous level interactions. Also discusses why certain weekday patterns can matter in context.
* **Focus skill:** recognize control handoff conditions.
* **Practice:** document 10 flips and how they resolved.
[Watch lesson](https://www.youtube.com/watch?v=yWhSyIvltP8)
- The flip is described as the start condition of a new candle and can matter on any timeframe.
- Which flips matter most depends on trading horizon: swing traders prioritize higher frames, intraday traders focus lower.
- Simultaneous breaks are presented as high-attention conditions that can create fast shifts in control.
- The lesson touches recurring weekly behavior patterns like Tuesday context as conditional, not guaranteed, edges.
- Practical implication: when flips and breaks cluster, reduce assumptions and tighten execution discipline.
***
### Lesson 7: Broadening Formations
Deep dive on broadening structures, outside-bar behavior, and why edge timing can matter more than center-range chasing. Heavy focus on reversal context and range travel behavior.
* **Focus skill:** locate broadening edges and invalidation points.
* **Practice:** annotate broadening structures on 15 charts.
[Watch lesson](https://www.youtube.com/watch?v=DWhp_asU3Eg)
- Broadening structure is defined by both higher highs and lower lows appearing in the same regime.
- The transcript ties broadening behavior to exhaustion and target interactions from prior lessons.
- Outside-bar behavior is treated as part of range expansion rather than isolated noise.
- Range-edge timing is emphasized over middle-range chasing for cleaner invalidation and better R profiles.
- Practical implication: identify broadening boundaries first, then evaluate actionable signals at the edges.
***
### Lesson 8: Tightening Ranges / Mother Bars
Covers the opposite regime: compression. Discusses inside-bar stacking, tightening behavior, and why mother-bar context can confuse entries if not mapped clearly.
* **Focus skill:** distinguish clean compression from noisy chop.
* **Practice:** collect 20 mother-bar cases and classify outcomes.
[Watch lesson](https://www.youtube.com/watch?v=QPeVZSyW4zg)
- This lesson contrasts broadening with compression regimes where range narrows over time.
- Mother-bar context is highlighted as a common source of low-quality entries when traders force midpoint trades.
- Inside-bar stacking is treated as information about compression, not immediate directional certainty.
- Resolution quality improves when breakouts occur from clearly defined compression boundaries.
- Practical implication: in tightening regimes, prioritize patience and breakout quality over trade frequency.
***
### Lesson 9: Multiple Timeframe Analysis / Domino Effect
Shows how higher-timeframe triggers can cascade into lower-timeframe opportunities and risk decisions. Emphasizes sequencing analysis instead of isolated single-frame views.
* **Focus skill:** top-down mapping with execution timeframe precision.
* **Practice:** build a 3-frame checklist for every setup.
[Watch lesson](https://www.youtube.com/watch?v=n52WaalId3I)
- The lesson integrates earlier concepts into cross-frame sequencing instead of single-frame setup spotting.
- "Domino effect" is used for cases where one timeframe trigger activates opportunity on another.
- Entries, stops, and objectives are mapped with frame role clarity: execution frame versus context frame.
- It repeatedly references continuity, exhaustion, and broadening as mandatory context checks.
- Practical implication: write down which timeframe provides trigger, which provides control, and which provides objective.
***
### Lesson 10: TTO
Frames TTO in practical terms: decide whether current move is true reversal behavior or corrective movement. Uses target interaction and exhaustion context to avoid false assumptions.
* **Focus skill:** classify reversal vs correction with evidence.
* **Practice:** review 25 TTO-like moves and tag final outcome.
[Watch lesson](https://www.youtube.com/watch?v=YXhNDAd-vEU)
- The key distinction is whether opposite movement reflects true reversal or temporary corrective action.
- Magnitude completion is treated as a major clue for reversal probability.
- If objective is not yet met, counter-move may be corrective rather than trend-ending.
- The lesson stresses reading opposite-side movement in relation to prevailing continuity.
- Practical implication: avoid labeling every pullback a reversal without objective/context confirmation.
***
### Lesson 11: Big Picture / Zoom Out
Pushes context-first thinking: zoom out enough to understand location, pivots, and structural path, then zoom back in for execution.
* **Focus skill:** location awareness before trigger focus.
* **Practice:** add weekly/monthly location note to every trade plan.
[Watch lesson](https://www.youtube.com/watch?v=KNZXnW8E7P8)
- Single-timeframe views are described as incomplete because location and structural context are missing.
- Zoom-out work is used to locate exhaustion, broadening context, and major pivot pathways.
- Only after higher-level context is mapped should execution-frame setups be selected.
- The transcript warns against overconfidence from isolated chart snippets lacking structure context.
- Practical implication: build every trade plan from top-down context before trigger-level decisions.
***
### Lesson 12: Risk / Reward
Quantifies risk sizing and payoff expectations. Reinforces that position size must follow stop distance, and account risk must remain fixed regardless of confidence.
* **Focus skill:** translate setup into R-based decision making.
* **Practice:** recalc your last 20 trades into normalized R.
[Watch lesson](https://www.youtube.com/watch?v=T9jzudwfSE4)
- Not all setups are equal; magnitude room determines whether the payoff profile is worth taking.
- Risk is quantified before order placement, and position size is derived from stop distance.
- The lesson pushes objective R-based evaluation over emotion-driven conviction sizing.
- A setup can be technically valid but still be rejected for poor reward-to-risk structure.
- Practical implication: use a consistent measurement tool and reject low-quality R profiles early.
***
### Lesson 13: Putting It Together
Integrates continuity, actionable signals, location, risk, and exhaustion into full setup selection. This lesson is essentially the workflow assembly stage.
* **Focus skill:** complete pre-trade workflow in one pass.
* **Practice:** run full checklist on 10 candidate setups nightly.
[Watch lesson](https://www.youtube.com/watch?v=vDD0bR4bZ5o)
- This lesson builds a full decision tree: why this trade, what frame triggers it, and what context supports it.
- Domino analysis, in-force state, remaining magnitude, and continuity alignment are combined into one workflow.
- It emphasizes setup selection quality over setup quantity.
- Execution planning includes predefining stop, objective path, and invalidation before entry.
- Practical implication: turn setup selection into a checklist pass/fail process instead of discretionary guesswork.
***
### Lesson 14: Gappers
Advanced lesson on gap dynamics, gap-fill behavior, and alignment requirements before treating gaps as opportunities. Emphasis on selectivity and context sensitivity.
* **Focus skill:** separate high-quality gap context from noise.
* **Practice:** journal every gap trade with premarket continuity notes.
[Watch lesson](https://www.youtube.com/watch?v=fiE1mMeRkEs)
- Gappers are treated as advanced because standard daily trigger logic may be bypassed by overnight displacement.
- News and earnings are highlighted as common drivers of gap regimes.
- The transcript repeatedly stresses checking left-side context for exhaustion before chasing the open.
- Gap-fill objectives and continuity direction both influence whether continuation or reversal approach is preferred.
- Practical implication: for gappers, context mapping must happen before the first execution decision.
***
### Lesson 15: Nightly Studying / Top-Down Method
Builds the repetition system: nightly review, top-down scanning, and deliberate homework so setup recognition becomes automatic.
* **Focus skill:** daily prep and nightly replay discipline.
* **Practice:** 30-minute nightly top-down routine for 20 sessions.
[Watch lesson](https://www.youtube.com/watch?v=Y8IOcLW1frM)
- The lesson frames progress as repetition: nightly review turns pattern recognition into speed and confidence.
- Workflow starts on higher timeframe to find setups that reached magnitude zones, then drills down for execution signals.
- Trigger and stop marking on smaller frames is done inside predefined higher-frame context areas.
- Homework is treated as non-negotiable skill development, not optional review.
- Practical implication: maintain a scheduled nightly process with chart markup and journal notes.
***
### Lesson 16: TradingView Setup
Platform-focused walkthrough for layout, indicators, watchlists, and practical chart workflow. The goal is reducing execution friction.
* **Focus skill:** standardize your chart workspace.
* **Practice:** create one reproducible chart template and lock it.
[Watch lesson](https://www.youtube.com/watch?v=lhvmTt6swxo)
- Platform configuration is tied directly to reducing execution friction and preventing analysis errors.
- Settings that can distort continuity or candle interpretation are flagged as high priority to verify.
- The lesson covers practical tool use: drawing controls, templates, labels, and watchlist workflow.
- Consistency of workspace is treated as part of risk management because it reduces decision latency.
- Practical implication: lock one chart template for prep, execution, and review and avoid constant layout changes.
***
### Lesson 17: TrendSpider Setup
Companion platform setup covering scanner/workflow configuration so ideas can be found and reviewed faster. Focus is efficiency and consistency in tool use.
* **Focus skill:** configure scan and chart defaults for your process.
* **Practice:** compare one-week idea quality before/after scanner tuning.
[Watch lesson](https://www.youtube.com/watch?v=Rjees132cWo)
- The lesson shows how to use built-in continuity and scanner features instead of rebuilding everything manually.
- Intraday and higher-timeframe continuity views are separated for cleaner control reading.
- Scanner output is treated as idea generation, not automatic trade permission.
- The objective is workflow efficiency: find candidates fast, then validate with your core process.
- Practical implication: keep scanner rules aligned with your setup definitions to reduce false positives.
## Next Step
Use these notes with the live scanner workflow: find setups, confirm control, define risk, then execute with a checklist.
# AI Search Queries
Source: https://docs.stratalerts.com/ai-tools/ai-search
AI Search lets you type plain English Strat queries directly into StratAlerts, which translates them into structured filters instantly.
AI Search is the natural language query engine built into the StratAlerts setups table. Instead of manually configuring column filters, you type what you're looking for in plain English — using the same Strat terminology you already think in — and the system translates it into structured filters that update the table immediately. It's designed to let you move fast: a two-second query replaces several clicks of filter configuration.
## Accessing AI Search
You can open AI Search from multiple places:
* **Wand button** — click the wand icon (✦) next to the gear menu in the Setups Table toolbar. This is the fastest mouse-driven way to open AI Search while you're already working with the table.
* **Keyboard shortcut** — press **Q** from anywhere in the app to open the search input immediately.
* **Mission Control** — use the AI Search bar on the main overview page.
Type your query and press **Enter** — the table filters update in real time.
AI Search is part of the StratAlerts app and does not require a separate AI Tools subscription. It runs inside the app and works against the live setups table.
## How it works
When you submit a query, StratAlerts parses your natural language input and maps it to structured filter conditions on the setups table. The mapping preserves Strat-specific terminology, so you don't need to translate it yourself.
Use Strat terminology naturally — candle types, timeframe names, setup conditions. The parser understands both shorthand (`2U`, `2D`) and expanded forms (`two up`, `inside day`, `in force`).
Your query is converted to specific filter conditions: candle type (CC, C1, C2), timeframe, TFC state, in-force status, and similar fields. The translation is shown so you can verify what was applied.
The table refreshes to show only the symbols that match your query. From there, you can sort, click into individual symbols, or add additional manual filters.
## Example queries
These examples show the query you type and the filter conditions it maps to:
**Query:** `all inside days`
**Translates to:** CC = `1` on the daily timeframe
Returns every symbol currently forming an inside day — a candle contained entirely within the prior candle's range. Useful for identifying coiled setups before a potential directional break.
**Query:** `2U weeks in force`
**Translates to:** CC = `2U` on Weekly timeframe, In-Force = `true`
Returns all symbols where the weekly candle is a 2U that has gone in-force — meaning price has broken above the prior weekly high.
**Query:** `1-2U setups on the daily`
**Translates to:** C2 = `1`, C1 = `2U` on Daily timeframe
Returns symbols showing the classic 1-2U setup pattern: an inside day followed by an up-candle, with the current candle potentially resolving the setup.
**Query:** `green C1 on the month`
**Translates to:** C1 Color = `green` on Monthly timeframe
Returns symbols where the trigger candle closed green. You can also target the target candle with `red C2` or use natural phrases like `green trigger candle` and `red target candle`. When you add a color to a two-part setup sequence like `1-2d green`, the color defaults to C1 unless you explicitly say `C2` or `target candle`.
**Query:** `day and week are 2U`
**Translates to:** Daily CC = `2U` AND Weekly step CC = `2U`
Returns symbols aligned as 2U on both the daily and weekly timeframe — a stronger continuation signal than a single-timeframe 2U. AI Search preserves both timeframe-state filters, so queries like `week and month that are 2u` keep the weekly base filter and the monthly step instead of collapsing to a single timeframe.
**Query:** `day in force and week in force`
**Translates to:** Daily In-Force = `true` AND Weekly step In-Force = `true`
Returns symbols that are in force on both the daily and weekly timeframes simultaneously. AI Search preserves the `in_force` flag inside each multi-timeframe step, so both conditions carry through to the table filters.
## Strat terminology the parser understands
AI Search recognizes the core vocabulary of The Strat methodology. You can use these terms directly in your queries:
| Term | Meaning |
| ------------------------------- | --------------------------------------------------------------- |
| `inside`, `inside day`, `1` | Candle 1 — inside candle contained within prior range |
| `2U`, `two up`, `up candle` | Candle 2U — up-candle, high above prior high |
| `2D`, `two down`, `down candle` | Candle 2D — down-candle, low below prior low |
| `outside`, `3`, `broadening` | Candle 3 — outside candle, both high and low exceed prior range |
| `failed 2U` | 2U candle that reversed below its own open |
| `failed 2D` | 2D candle that reversed above its own open |
The parser accepts full names and shorthand:
| Accepted terms | Timeframe |
| ------------------------------- | --------- |
| `15m`, `15 minute`, `15-minute` | 15-minute |
| `30m`, `30 minute` | 30-minute |
| `60m`, `60 minute`, `hourly` | 60-minute |
| `4H`, `4 hour` | 4-hour |
| `daily`, `day`, `D` | Daily |
| `weekly`, `week`, `W` | Weekly |
| `monthly`, `month`, `M` | Monthly |
| `quarterly`, `quarter`, `Q` | Quarterly |
| `yearly`, `year`, `annual`, `Y` | Yearly |
AI Search understands two-part and three-part Strat setup sequences using the standard C2-C1 or C2-C1-CC notation:
| Term | Filter applied |
| ----------------------------- | ----------------------------------------------------------- |
| `1-2U`, `1-2d` | C2 = `1`, C1 = `2U` or `2D` |
| `3-2U`, `2D-3` | Directional two-part sequences |
| `1-2-2`, `1-2U-2D` | Three-part sequences mapped to C2-C1-CC |
| `all 1-2 setups on the month` | Expanded to C2 = `1`, C1 = `2` (both directions) on Monthly |
Bare `2` in a sequence is automatically expanded to cover both `2U` and `2D`. Explicit directional sequences like `1-2d` are mapped correctly as setup-sequence filters, not misread as current-candle state.
| Term | Filter applied |
| ---------------------------------- | -------------------------------------------- |
| `green C1`, `green trigger candle` | C1 Color = `green` |
| `red C2`, `red target candle` | C2 Color = `red` |
| `1-2d green` | Setup = `1-2D`, C1 Color = `green` (default) |
| `green C2 on the week` | C2 Color = `green` on Weekly |
When a color is attached to a setup sequence without specifying which candle, it defaults to C1. To target C2 instead, explicitly name it.
| Term | Condition |
| ----------------------------------- | --------------------------------------------- |
| `in force`, `in-force`, `triggered` | InForce = true |
| `continuation` | Continuation = true |
| `P3`, `potential 3` | P3 flag = true |
| `PMG`, `potential major gap` | PMG flag = true |
| `green TFC`, `bullish TFC` | TFC state = green for the specified timeframe |
| `red TFC`, `bearish TFC` | TFC state = red for the specified timeframe |
## Tips for effective queries
Be specific about the timeframe. "2U setups" is valid, but "2U setups on the daily" returns a more focused result. If you omit the timeframe, AI Search defaults to the timeframe currently selected in the table.
Combine conditions naturally. Phrases like "2U daily with green weekly TFC" or "inside days on the 60 that are in force" work as you'd expect — the parser handles compound conditions.
AI Search is designed for standard Strat terminology. Very custom or proprietary terms outside the standard Strat vocabulary may not translate correctly. If a query produces unexpected results, check the filter summary shown below the search bar to see exactly what was applied.
## Related
Feed live Strat bundles into GPT, Claude, Gemini, and other LLMs for deeper AI-powered analysis.
Detailed field reference for the NDJSON bundle format used with external LLMs.
# Bundle Format
Source: https://docs.stratalerts.com/ai-tools/bundles
Complete reference for the StratAlerts NDJSON market bundle: every field, refresh cadence, how to fetch it with your API key, and Python parsing examples.
## Fields and Fetch Reference
The StratAlerts market bundle is a structured snapshot of every tracked symbol delivered as an NDJSON file — one JSON object per line, one line per symbol. It refreshes every 300 seconds (5 minutes), so the data your LLM receives always reflects current market conditions. This page covers the exact bundle format, every available field, how to fetch the bundle, and how to parse it in code.
## File format
The bundle is **NDJSON** (Newline-Delimited JSON). Each line is a valid, self-contained JSON object representing one symbol. This format is intentional: it streams efficiently, parses line by line without loading the entire file into memory, and works cleanly as LLM context input.
```text bundle-0001.ndjson theme={null}
{"Symbol":"SPY","Sector":"ETF","LastPrice":561.40,...}
{"Symbol":"QQQ","Sector":"ETF","LastPrice":477.83,...}
{"Symbol":"AAPL","Sector":"Technology","LastPrice":213.57,...}
```
**Refresh cadence:** Every 300 seconds. The bundle URL does not change — the same URL always returns the latest snapshot.
## Fields
### Identity and price
| Field | Type | Description |
| -------------------- | ----------------- | --------------------------------------------------------------- |
| `Symbol` | string | Ticker symbol (e.g., `SPY`, `NQ=F`, `BTC-USD`) |
| `Sector` | string | Sector classification (e.g., `Technology`, `Financials`, `ETF`) |
| `LastPrice` | number | Most recent trade price |
| `LastTradeTimestamp` | string (ISO 8601) | Timestamp of the last trade |
| `LastPriceSource` | string | Data source for the last price |
### TFC state
Timeframe continuity (TFC) state is provided for five higher timeframes. Each value is one of `green`, `red`, or `na`.
| Field | Timeframe | Values |
| ------- | --------- | -------------------- |
| `TFC_D` | Daily | `green`, `red`, `na` |
| `TFC_W` | Weekly | `green`, `red`, `na` |
| `TFC_M` | Monthly | `green`, `red`, `na` |
| `TFC_Q` | Quarterly | `green`, `red`, `na` |
| `TFC_Y` | Yearly | `green`, `red`, `na` |
### Candles (OHLCV)
OHLCV bars are included for nine timeframes. Each timeframe block contains: `Time`, `Open`, `High`, `Low`, `Close`, `Volume`.
| Timeframe key | Timeframe |
| ------------- | --------- |
| `Candle_15` | 15-minute |
| `Candle_30` | 30-minute |
| `Candle_60` | 60-minute |
| `Candle_4H` | 4-hour |
| `Candle_D` | Daily |
| `Candle_W` | Weekly |
| `Candle_M` | Monthly |
| `Candle_Q` | Quarterly |
| `Candle_Y` | Yearly |
Each candle object looks like:
```json candle object theme={null}
{
"Time": "2026-04-10T09:30:00Z",
"Open": 558.20,
"High": 563.80,
"Low": 557.40,
"Close": 561.40,
"Volume": 42871200
}
```
### Setup fields
Setup fields reflect the current Strat setup state on the daily timeframe by default.
| Field | Type | Description |
| -------------- | -------------- | ---------------------------------------------------------------------- |
| `C2` | string | Candle 2 scenario — the prior candle type (e.g., `1`, `2U`, `2D`, `3`) |
| `C1` | string | Candle 1 scenario — the current candle type |
| `CC` | string | Current candle scenario |
| `SetupTarget` | string | The identified setup target (price level or label) |
| `TriggerGreen` | number \| null | Price level that triggers the bullish side of the setup |
| `TriggerRed` | number \| null | Price level that triggers the bearish side of the setup |
| `Continuation` | boolean | Whether the setup is a continuation setup |
| `InForce` | boolean | Whether the setup is currently in-force (trigger has been breached) |
| `P3` | boolean | Whether the setup is a P3 (potential 3) |
| `PMG` | boolean | Whether a PMG (potential major gap) flag is set |
## Sample bundle row
This shows a complete single-symbol row from the bundle:
```json sample row (SPY) theme={null}
{
"Symbol": "SPY",
"Sector": "ETF",
"LastPrice": 561.40,
"LastTradeTimestamp": "2026-04-10T14:35:22Z",
"LastPriceSource": "consolidated",
"TFC_D": "green",
"TFC_W": "green",
"TFC_M": "red",
"TFC_Q": "red",
"TFC_Y": "green",
"Candle_D": {
"Time": "2026-04-10T09:30:00Z",
"Open": 558.20,
"High": 563.80,
"Low": 557.40,
"Close": 561.40,
"Volume": 42871200
},
"Candle_W": {
"Time": "2026-04-07T09:30:00Z",
"Open": 549.10,
"High": 564.90,
"Low": 546.30,
"Close": 561.40,
"Volume": 198450000
},
"C2": "1",
"C1": "2U",
"CC": "2U",
"SetupTarget": "564.90",
"TriggerGreen": 563.80,
"TriggerRed": 557.40,
"Continuation": false,
"InForce": false,
"P3": false,
"PMG": false
}
```
## Fetching the bundle
Send an HTTP GET to your bundle URL with your API key in the `X-API-Key` header:
```bash cURL theme={null}
curl -H "X-API-Key: YOUR_API_KEY" \
https://app.stratalerts.com/api/v1/bundles/latest.ndjson
```
```python Python theme={null}
import requests
response = requests.get(
"https://app.stratalerts.com/api/v1/bundles/latest.ndjson",
headers={"X-API-Key": "YOUR_API_KEY"},
)
response.raise_for_status()
bundle_text = response.text
```
```javascript JavaScript theme={null}
const response = await fetch(
"https://app.stratalerts.com/api/v1/bundles/latest.ndjson",
{
headers: { "X-API-Key": "YOUR_API_KEY" },
}
);
const bundleText = await response.text();
```
Your bundle URL and API key are available in **Account → AI Tools** after subscribing.
## Parsing the bundle in Python
This example fetches the bundle, parses every row, and filters for symbols that are in-force on the daily:
```python parse and filter bundle theme={null}
import json
import requests
def fetch_bundle(api_key: str) -> list[dict]:
url = "https://app.stratalerts.com/api/v1/bundles/latest.ndjson"
response = requests.get(url, headers={"X-API-Key": api_key})
response.raise_for_status()
rows = []
for line in response.text.splitlines():
line = line.strip()
if line:
rows.append(json.loads(line))
return rows
def in_force_daily(rows: list[dict]) -> list[dict]:
return [r for r in rows if r.get("InForce") is True]
rows = fetch_bundle("YOUR_API_KEY")
active = in_force_daily(rows)
for symbol in active:
print(f"{symbol['Symbol']} — {symbol['CC']} — in force at {symbol['TriggerGreen'] or symbol['TriggerRed']}")
```
Parse the bundle line by line rather than loading the entire file into memory at once. For large universes, streaming line-by-line reduces memory overhead significantly.
## Related
How AI Tools works, compatible models, and pricing.
Run natural language queries directly inside the StratAlerts setups table — no API key or code required.
# Installation Guide
Source: https://docs.stratalerts.com/ai-tools/installation
Save your API key once in a standard local config file, then let your own script or agent fetch the latest snapshot manifest from `/api/llm/v1/snapshots/latest`.
```bash theme={null}
CONFIG_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/marketscanner/llm-bundle.env"
mkdir -p "$(dirname "$CONFIG_FILE")"
umask 077
cat > "$CONFIG_FILE" <<'EOF'
MARKETSCANNER_API_KEY=PASTE_API_KEY_HERE
EOF
echo "Saved key to $CONFIG_FILE"
```
```powershell theme={null}
$configFile = Join-Path $env:APPDATA 'MarketScanner\llm-bundle.env'
New-Item -ItemType Directory -Force -Path (Split-Path -Parent $configFile) | Out-Null
@"
MARKETSCANNER_API_KEY=PASTE_API_KEY_HERE
"@ | Set-Content $configFile
Write-Host "Saved key to $configFile"
```
Copy and paste this into your LLM:
```text theme={null}
Follow these directions:
https://gist.github.com/tlk3/31e0b091f0d2d8c1790a6067edca5fd3
My API key is already stored in the correct default location.
If I say /msr refresh, download the latest MarketScanner bundle and then reload it from disk before answering.
After refresh, work from the local bundle files unless I explicitly ask for another API call.
Do not print or expose my API key.
```
Optional for users who want a saved local downloader script instead of relying on `/msr refresh`.
```bash theme={null}
#!/usr/bin/env bash
set -euo pipefail
CONFIG_FILE="${MARKETSCANNER_CONFIG_FILE:-${XDG_CONFIG_HOME:-$HOME/.config}/marketscanner/llm-bundle.env}"
if [ -f "$CONFIG_FILE" ]; then
set -a
. "$CONFIG_FILE"
set +a
fi
: "${MARKETSCANNER_API_KEY:?Set MARKETSCANNER_API_KEY or create $CONFIG_FILE first}"
BASE_URL="${MARKETSCANNER_BASE_URL:-https://app.stratalerts.com}"
OUTPUT_DIR="${1:-$HOME/marketscanner-data/latest}"
mkdir -p "$OUTPUT_DIR"
MANIFEST_URL="$BASE_URL/api/llm/v1/snapshots/latest"
curl --fail --silent --show-error \
-H "Authorization: Bearer $MARKETSCANNER_API_KEY" \
"$MANIFEST_URL" -o "$OUTPUT_DIR/manifest.json"
extract_chunk_refs() {
grep -o '\{[^}]*\}' "$OUTPUT_DIR/manifest.json" | while IFS= read -r obj; do
ref="$(printf '%s\n' "$obj" | sed -n 's/.*"relative_path"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')"
if [ -z "$ref" ]; then
ref="$(printf '%s\n' "$obj" | sed -n 's/.*"path"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')"
fi
if [ -z "$ref" ]; then
ref="$(printf '%s\n' "$obj" | sed -n 's/.*"name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')"
fi
if [ -n "$ref" ] && printf '%s' "$obj" | grep -q '"chunk_order"\|"chunk_name"\|"symbol_count"'; then
printf '%s\n' "$ref"
fi
done
}
snapshot_version="$(sed -n 's/.*"snapshot_version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$OUTPUT_DIR/manifest.json")"
chunk_refs="$(extract_chunk_refs)"
if [ -z "$chunk_refs" ]; then
echo "No chunk references found in manifest" >&2
exit 1
fi
while IFS= read -r ref; do
[ -n "$ref" ] || continue
chunk_name="${ref##*/}"
case "$ref" in
http://*|https://*) chunk_url="$ref" ;;
/api/*) chunk_url="${BASE_URL%/}$ref" ;;
*)
if [ -n "$snapshot_version" ]; then
chunk_url="${BASE_URL%/}/api/llm/v1/snapshots/$snapshot_version/$chunk_name"
else
chunk_url="${BASE_URL%/}/${ref#./}"
fi
;;
esac
mkdir -p "$OUTPUT_DIR/$(dirname "$ref")"
curl --fail --silent --show-error \
-H "Authorization: Bearer $MARKETSCANNER_API_KEY" \
"$chunk_url" -o "$OUTPUT_DIR/$ref"
done <<< "$chunk_refs"
missing=0
while IFS= read -r ref; do
[ -n "$ref" ] || continue
if [ ! -f "$OUTPUT_DIR/$ref" ]; then
if [ "$missing" -eq 0 ]; then
echo "Bundle incomplete. Missing chunks:" >&2
fi
echo "- $ref" >&2
missing=1
fi
done <<< "$chunk_refs"
if [ "$missing" -ne 0 ]; then
exit 1
fi
chunk_count="$(printf '%s\n' "$chunk_refs" | grep -c '.')"
echo "Bundle ready: $OUTPUT_DIR"
echo "snapshot_version=${snapshot_version:-unknown}"
echo "chunk_count=$chunk_count"
```
```powershell theme={null}
$ErrorActionPreference = 'Stop'
$configFile = if ($env:MARKETSCANNER_CONFIG_FILE) { $env:MARKETSCANNER_CONFIG_FILE } elseif ($env:APPDATA) { Join-Path $env:APPDATA 'MarketScanner\llm-bundle.env' } else { Join-Path $HOME 'AppData\Roaming\MarketScanner\llm-bundle.env' }
if ((-not $env:MARKETSCANNER_API_KEY) -and (Test-Path $configFile)) {
Get-Content $configFile | ForEach-Object {
if ($_ -match '^\s*MARKETSCANNER_API_KEY=(.+)$') { $env:MARKETSCANNER_API_KEY = $matches[1].Trim() }
}
}
if (-not $env:MARKETSCANNER_API_KEY) { throw "Set MARKETSCANNER_API_KEY or create $configFile first." }
$baseUrl = if ($env:MARKETSCANNER_BASE_URL) { $env:MARKETSCANNER_BASE_URL } else { 'https://app.stratalerts.com' }
$outputDir = if ($args.Length -gt 0) { $args[0] } else { Join-Path $HOME 'marketscanner-data/latest' }
New-Item -ItemType Directory -Force -Path $outputDir | Out-Null
$manifestUrl = "$baseUrl/api/llm/v1/snapshots/latest"
$headers = @{ Authorization = "Bearer $($env:MARKETSCANNER_API_KEY)" }
$manifest = Invoke-RestMethod -Headers $headers -Uri $manifestUrl
$manifest | ConvertTo-Json -Depth 10 | Set-Content (Join-Path $outputDir 'manifest.json')
$snapshotVersion = if ($manifest.snapshot_version) { "$($manifest.snapshot_version)" } else { '' }
$chunkRefs = @()
foreach ($chunk in @($manifest.chunks)) {
$ref = ''
if ($chunk.PSObject.Properties.Name -contains 'relative_path' -and $chunk.relative_path) { $ref = "$($chunk.relative_path)".Trim() }
elseif ($chunk.PSObject.Properties.Name -contains 'path' -and $chunk.path) { $ref = "$($chunk.path)".Trim() }
elseif ($chunk.PSObject.Properties.Name -contains 'name' -and $chunk.name) { $ref = "$($chunk.name)".Trim() }
if ($ref) { $chunkRefs += $ref }
}
if (-not $chunkRefs.Count) { throw 'No chunk references found in manifest' }
foreach ($ref in $chunkRefs) {
$chunkName = Split-Path -Leaf $ref
if ($ref -match '^https?://') { $chunkUrl = $ref }
elseif ($ref.StartsWith('/api/')) { $chunkUrl = "$baseUrl$ref" }
elseif ($snapshotVersion) { $chunkUrl = "$baseUrl/api/llm/v1/snapshots/$snapshotVersion/$chunkName" }
else { $chunkUrl = "$baseUrl/$($ref.TrimStart('/'))" }
$targetPath = Join-Path $outputDir ($ref -replace '/', [IO.Path]::DirectorySeparatorChar)
$targetDir = Split-Path -Parent $targetPath
if ($targetDir) { New-Item -ItemType Directory -Force -Path $targetDir | Out-Null }
Invoke-WebRequest -Headers $headers -Uri $chunkUrl -OutFile $targetPath
}
$missing = @()
foreach ($ref in $chunkRefs) {
$targetPath = Join-Path $outputDir ($ref -replace '/', [IO.Path]::DirectorySeparatorChar)
if (-not (Test-Path $targetPath)) { $missing += $ref }
}
if ($missing.Count -gt 0) {
Write-Error "Bundle incomplete. Missing chunks:`n- $($missing -join "`n- ")"
exit 1
}
Write-Host "Bundle ready: $outputDir"
Write-Host "snapshot_version=$([string]::IsNullOrWhiteSpace($snapshotVersion) ? unknown : $snapshotVersion)"
Write-Host "chunk_count=$($chunkRefs.Count)"
```
# Strat Data for LLMs
Source: https://docs.stratalerts.com/ai-tools/overview
AI Tools gives you structured, live Strat market bundles refreshed every 5 minutes, ready to feed into GPT, Claude, Gemini, and any other LLM. Included with the Founders Plan or available as a standalone add-on.
## Realtime Market Data for AI Workflows
AI Tools brings StratAlerts market data directly into your AI workflows. Every five minutes, StratAlerts compiles a structured snapshot of every tracked symbol — complete with TFC state, candle data across nine timeframes, and full setup fields — and makes it available as a downloadable NDJSON bundle. You feed that bundle into your LLM of choice, and your model can answer detailed questions about current market conditions using real, live data instead of hallucinating on stale training knowledge.
**Founders Plan subscribers** already have AI Tools included at no extra cost. If you are on the Basic plan or have no scanner subscription, AI Tools is available as a standalone add-on at \$25/mo.
## How it works
If you are on the Founders Plan, AI Tools is already active — go to your account settings to find your bundle URL and API key. Otherwise, subscribe to AI Tools at **\$25/mo** from your StratAlerts account. The bundle updates automatically every 5 minutes — no polling configuration required on your end.
Make an HTTP GET request to your bundle URL with your API key in the header. The response is an NDJSON file — one JSON object per line, one line per symbol. Paste the bundle content into your LLM's context window or attach it as a file, then add your starter prompt.
Ask your LLM questions about the current market structure. The model can reason over TFC state, candle scenarios, in-force flags, setup targets, and more — across every symbol in the bundle.
## Compatible models
AI Tools bundles are plain structured JSON, so they work with any model that accepts a file or text context.
GPT-4o and later models accept large context windows. Paste the bundle directly or use the Assistants API with file attachments.
Claude's extended context window handles full bundles easily. Use the API or paste directly into Claude.ai.
Gemini 1.5 and later support large context inputs. Pass the bundle via the API or Gemini Advanced.
Use Codex for programmatic workflows — generate scanning scripts, filters, or automated reports from live bundle data.
Self-hosted Llama 3 deployments work with the same bundle format. Ideal for private, on-premise AI workflows.
The NDJSON format is model-agnostic. If your model accepts text or file input, the bundle works.
## What you can do with it
Ask the model to summarize current TFC alignment across sectors, identify which symbols have the most timeframe continuity, or flag setups where multiple timeframes are aligned in the same direction.
Describe the setup pattern you're looking for in plain English. The model searches the bundle for matching symbols rather than you having to manually filter a table.
Example prompts:
* "Which stocks are 2U on the daily with a green weekly TFC?"
* "Show me names that are in-force on the 60-minute timeframe."
* "Find symbols where the daily and weekly are both 2U."
Use Codex or the OpenAI API to write scripts that fetch the bundle, filter for specific conditions, and generate a formatted market brief — automatically, on a schedule.
Save snapshots at regular intervals to build a historical record of setup states. Use that history to study how certain TFC configurations or in-force conditions played out over time.
## Pricing
AI Tools is **included at no extra cost** with the Founders Plan. If you are on the Basic plan or have no scanner subscription, you can purchase AI Tools as a standalone add-on at **\$25/mo**. The plan includes **2 GB of data per month**. Most workflows stay well within the included data cap.
If your workflow fetches the bundle frequently or processes large volumes of data, additional usage is billed at \$5 per GB beyond the included 2 GB.
Fetching the bundle once per refresh cycle (every 5 minutes) for a typical session uses a fraction of the 2 GB monthly cap. Overage charges apply mainly to high-frequency automated pipelines that fetch far more often than the bundle actually updates.
## Watch a Demo
## Next steps
Follow these instructions to begin using AI Tools. If you need help installing, please reach out to us.
Detailed field-by-field reference for the bundle format, including a sample JSON snippet and fetch examples.
Use the natural language search built into the StratAlerts setups table — no LLM setup required.
# Authenticate API Requests
Source: https://docs.stratalerts.com/api/authentication
Every StratAlerts API request requires a scoped API key. Pass it as a Bearer token or X-API-Key header. Covers key creation, scopes, and auth error codes.
Every request to the StratAlerts Partner API must include an API key. Keys are scoped — each key grants access only to the specific endpoints and channels listed in its scope set. You manage keys from your account settings after subscribing to the API Access plan.
## Getting an API key
API access is a separate subscription from your standard StratAlerts plan. Visit the [API Access subscription page](https://app.stratalerts.com/billing/subscribe/?plan=market_api) and complete checkout.
After subscribing, go to your [account settings](https://app.stratalerts.com/users/redirect/) and generate a new API key. Give it a descriptive label so you can identify it later.
The full key value is only shown once at creation time. Copy it to a secure location before closing the dialog — you cannot retrieve the raw key afterward, only revoke and regenerate it.
## Passing your key
You can pass your API key in either of two request headers. Both are accepted on every REST endpoint and on the WebSocket handshake.
Use the standard HTTP `Authorization` header with the `Bearer` scheme:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
Alternatively, pass the raw key in the `X-API-Key` header:
```text theme={null}
X-API-Key: YOUR_API_KEY
```
### Code examples
```bash curl theme={null}
curl -s \
-H "Authorization: Bearer YOUR_API_KEY" \
https://app.stratalerts.com/api/market/v1/market-status
```
```python Python theme={null}
import httpx
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://app.stratalerts.com/api/market/v1"
response = httpx.get(
f"{BASE_URL}/market-status",
headers={"Authorization": f"Bearer {API_KEY}"},
)
response.raise_for_status()
print(response.json())
```
```javascript JavaScript theme={null}
const API_KEY = "YOUR_API_KEY";
const BASE_URL = "https://app.stratalerts.com/api/market/v1";
const response = await fetch(`${BASE_URL}/market-status`, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
if (!response.ok) {
const err = await response.json();
throw new Error(err.error.message);
}
const data = await response.json();
console.log(data);
```
## Key scopes
When you generate a key, you choose which scopes to grant. A request to an endpoint whose scope is not on the key returns a `403 missing_scope` error. The table below lists all available scopes.
| Scope | Grants access to |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `metadata:read` | `GET /instruments`, `GET /instruments/{symbol}`, `GET /market-status` |
| `prices:read` | `GET /prices/latest`, WebSocket `quotes` channel |
| `candles:read` | `GET /candles/{symbol}` |
| `states:read` | `GET /states/{symbol}`, `GET /setups/current`, WebSocket `states` channel |
| `alerts:read` | `GET /alerts/in-force`, `GET /alerts/simultaneous-breaks`, WebSocket `alerts.in_force` and `alerts.simultaneous_breaks` channels |
| `ws:connect` | Establish a WebSocket connection (required in addition to channel-specific scopes) |
Grant only the scopes your integration actually uses. A key scoped to `metadata:read` and `prices:read` cannot accidentally be used to pull alert data if it is ever leaked.
## Error responses
Authentication failures return a JSON error envelope. The HTTP status code and `code` field tell you exactly what went wrong.
| HTTP status | Error code | Meaning |
| ----------- | ---------------------- | ------------------------------------------------------------------------------------------- |
| `401` | `missing_api_key` | No key was found in the request headers — either the header is absent or the value is empty |
| `403` | `inactive_entitlement` | Your API Access subscription has lapsed or been cancelled |
| `403` | `missing_scope` | The key is valid but does not have the scope required by this endpoint |
A `401` response looks like this:
```json theme={null}
{
"error": {
"code": "missing_api_key",
"message": "missing api key"
}
}
```
A `403` scope error looks like this:
```json theme={null}
{
"error": {
"code": "missing_scope",
"message": "missing scope"
}
}
```
## Security best practices
Never embed your API key in client-side code, browser JavaScript, or a public repository. If a key is exposed, revoke it immediately from your account settings and generate a new one.
* Store your key in an environment variable or secrets manager, not in source code.
* Use a separate key per integration so you can revoke one without affecting others.
* Grant only the scopes each key requires — avoid creating full-access keys for read-only integrations.
* Rotate keys on a regular schedule or immediately if you suspect exposure.
## WebSocket authentication
The WebSocket connection handshake also requires your API key. Pass it in the same headers (`Authorization: Bearer` or `X-API-Key`) during the initial HTTP upgrade request. Your key must include both `ws:connect` and the scope for every channel you plan to subscribe to.
If authentication fails during the WebSocket handshake, the connection is closed with one of these close codes before any messages are exchanged:
| Close code | Meaning |
| ---------- | -------------------------------------------------------------- |
| `4401` | No valid API key found in the handshake headers |
| `4403` | Active subscription not found, or key lacks `ws:connect` scope |
```python theme={null}
import asyncio
import json
import websockets
API_KEY = "YOUR_API_KEY"
WS_URL = "wss://app.stratalerts.com/ws/market/v1"
async def stream_quotes():
headers = {"Authorization": f"Bearer {API_KEY}"}
async with websockets.connect(WS_URL, additional_headers=headers) as ws:
await ws.send(json.dumps({
"op": "subscribe",
"topics": [{"channel": "quotes", "symbols": ["AAPL", "TSLA"]}],
}))
async for message in ws:
print(json.loads(message))
asyncio.run(stream_quotes())
```
# REST and WebSockets
Source: https://docs.stratalerts.com/api/overview
Access StratAlerts market data programmatically. REST endpoints for snapshots and history; WebSocket streams for live prices, state changes, and alert events.
The StratAlerts Partner API gives you direct, programmatic access to the same market data that powers the scanner — instrument metadata, OHLCV candles, TFC states, setup detection, and live alerts. You can pull current snapshots over REST or subscribe to live streams over WebSocket, depending on whether you need point-in-time data or continuous updates.
API access requires a separate **API Access** subscription plan. Your standard StratAlerts subscription does not include API access. [Subscribe at app.stratalerts.com](https://app.stratalerts.com/billing/subscribe/?plan=market_api) to get started.
## Delivery modes
Request historical data, current snapshots, and batch lookups over HTTPS. Best for periodic polling, backtesting, and on-demand queries.
Maintain a persistent connection and receive pushed updates as they happen. Best for live dashboards, execution systems, and alert ingestion.
## Base URLs
| Transport | Base URL |
| --------- | ------------------------------------------- |
| REST | `https://app.stratalerts.com/api/market/v1` |
| WebSocket | `wss://app.stratalerts.com/ws/market/v1` |
## REST endpoints
Every endpoint requires a valid API key with the appropriate scope. See [Authentication](/api/authentication) for how to pass your key.
| Method | Path | Scope | Description |
| ------ | ----------------------------- | --------------- | ------------------------------------------------------ |
| `GET` | `/instruments` | `metadata:read` | List instruments with name, exchange, type, and sector |
| `GET` | `/instruments/{symbol}` | `metadata:read` | Fetch metadata for a single instrument |
| `GET` | `/prices/latest` | `prices:read` | Latest trade price for one or more symbols |
| `GET` | `/candles/{symbol}` | `candles:read` | OHLCV bars at any supported timeframe |
| `GET` | `/states/{symbol}` | `states:read` | TFC color state and active setups for a symbol |
| `GET` | `/setups/current` | `states:read` | All active Strat setups across the scan universe |
| `GET` | `/alerts/in-force` | `alerts:read` | In-force alerts within a rolling time window |
| `GET` | `/alerts/simultaneous-breaks` | `alerts:read` | Simultaneous break alerts across timeframes |
| `GET` | `/market-status` | `metadata:read` | Current market open/close status and session times |
## WebSocket channels
After connecting to `wss://app.stratalerts.com/ws/market/v1`, you subscribe to channels by sending a JSON message with `"op": "subscribe"`. Your key must have `ws:connect` scope plus the scope corresponding to each channel.
| Channel | Scope | Description |
| ---------------------------- | ------------- | ---------------------------------------------------- |
| `quotes` | `prices:read` | Real-time trade price updates for subscribed symbols |
| `states` | `states:read` | Live TFC state changes and setup updates per symbol |
| `alerts.in_force` | `alerts:read` | Pushed in-force alert events as they fire |
| `alerts.simultaneous_breaks` | `alerts:read` | Pushed simultaneous break alert events |
## Quick example
The following request fetches the current market status using `curl`. Replace `YOUR_API_KEY` with your actual key.
```bash theme={null}
curl -s \
-H "Authorization: Bearer YOUR_API_KEY" \
https://app.stratalerts.com/api/market/v1/market-status
```
A successful response looks like this:
```json theme={null}
{
"market": "stocks",
"timezone": "America/New_York",
"is_open": true,
"session": {
"label": "RTH",
"session_date": "2026-04-10",
"open_ts": "2026-04-10T09:30:00-04:00",
"close_ts": "2026-04-10T16:00:00-04:00"
},
"now": "2026-04-10T11:22:00-04:00"
}
```
## Error format
All error responses use a consistent JSON envelope regardless of the endpoint or HTTP status code.
```json theme={null}
{
"error": {
"code": "error_code_here",
"message": "Human readable message"
}
}
```
See [Authentication](/api/authentication) for the specific error codes returned for missing or invalid keys, and [Rate Limits](/api/rate-limits) for throughput-related errors.
## Next steps
Learn how to obtain an API key, pass it in requests, and understand scope requirements.
Understand per-key throughput limits, burst behavior, and WebSocket connection rules.
# Rate Limits and Connection Rules
Source: https://docs.stratalerts.com/api/rate-limits
Per-key REST rate limits, 250-symbol batch cap, one-WebSocket-per-account rule, and best practices to keep your integration within allowed throughput.
The StratAlerts Partner API enforces rate limits on a per-key basis to keep the service stable for all users. Limits are dynamic — throughput controls adjust with burst capacity during volatile sessions, so there is some flexibility during high-activity periods, but sustained high-frequency polling will still be throttled. Design your integration around the guidelines on this page to avoid unexpected errors.
## REST rate limits
Rate limits are applied per API key. When you exceed the allowed request rate, the API returns an HTTP `429 Too Many Requests` response with the standard error envelope:
```json theme={null}
{
"error": {
"code": "rate_limit_exceeded",
"message": "rate limit exceeded"
}
}
```
### Handling a 429
When you receive a `429`, back off and retry with a delay. A simple exponential backoff strategy works well:
```python Python theme={null}
import time
import httpx
def get_with_backoff(url: str, headers: dict, max_retries: int = 5) -> dict:
delay = 1.0
for attempt in range(max_retries):
response = httpx.get(url, headers=headers)
if response.status_code == 429:
time.sleep(delay)
delay *= 2
continue
response.raise_for_status()
return response.json()
raise RuntimeError("Rate limit retries exhausted")
```
```javascript JavaScript theme={null}
async function getWithBackoff(url, headers, maxRetries = 5) {
let delay = 1000;
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, { headers });
if (response.status === 429) {
await new Promise((resolve) => setTimeout(resolve, delay));
delay *= 2;
continue;
}
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json();
}
throw new Error("Rate limit retries exhausted");
}
```
## Batch requests and symbol limits
Endpoints that accept a `symbols` query parameter accept up to **250 symbols per request**. Symbols beyond the 250-symbol limit are silently dropped. Split large symbol lists across multiple requests if your universe exceeds this limit.
```bash theme={null}
# Fetch prices for up to 250 symbols in one call
curl -s \
-H "Authorization: Bearer YOUR_API_KEY" \
"https://app.stratalerts.com/api/market/v1/prices/latest?symbols=AAPL,MSFT,GOOGL,AMZN,TSLA"
```
The `/instruments` endpoint has its own `limit` parameter (default 50, max 200 per page) that controls how many instrument records are returned per request, separate from the 250-symbol batch cap.
## WebSocket connection limits
You may have **one active WebSocket connection per user account** at any time. Opening a new connection automatically evicts the previous one — the older connection receives close code `4409` and is terminated.
```text theme={null}
Close code 4409 — connection replaced by a newer session
```
This means:
* You cannot fan out to multiple persistent WebSocket clients under the same API key or account.
* If your process restarts and reconnects, the new connection takes over immediately and the old one closes.
* Monitor for close code `4409` in your client and treat it as a displacement event rather than an error.
### Handling displacement
```python theme={null}
import asyncio
import json
import websockets
API_KEY = "YOUR_API_KEY"
WS_URL = "wss://app.stratalerts.com/ws/market/v1"
DISPLACEMENT_CODE = 4409
async def stream_with_reconnect():
while True:
try:
headers = {"Authorization": f"Bearer {API_KEY}"}
async with websockets.connect(WS_URL, additional_headers=headers) as ws:
await ws.send(json.dumps({
"op": "subscribe",
"topics": [{"channel": "alerts.in_force"}],
}))
async for message in ws:
print(json.loads(message))
except websockets.exceptions.ConnectionClosedError as exc:
if exc.code == DISPLACEMENT_CODE:
# Another session took over — wait before reconnecting
await asyncio.sleep(5)
else:
raise
asyncio.run(stream_with_reconnect())
```
## WebSocket event metering
Outbound WebSocket events are metered for billing purposes. Each event pushed to your connection — quotes, state changes, and alert notifications — is recorded as a `ws_message` usage row. The volume of metered events depends on how many symbols you subscribe to and how active those symbols are during market hours.
WebSocket metering is separate from REST rate limits. REST requests are throttled per key, while WebSocket events are counted toward your API Access usage for billing. Check your current usage from the API Access page in your account settings.
## Best practices
Following these patterns keeps your integration efficient and avoids hitting limits unnecessarily.
Subscribe to the `quotes`, `states`, and `alerts.*` WebSocket channels instead of polling REST endpoints in a loop. WebSocket push updates are more efficient and don't consume REST quota.
Instrument metadata (`/instruments`) and candle history (`/candles/{symbol}`) change infrequently. Cache responses locally and refresh on a schedule rather than fetching on every request.
Use the `symbols` parameter to request data for multiple instruments in a single call instead of making one request per symbol. Stay under the 250-symbol limit per call.
Use query parameters like `timeframe`, `direction`, `window_minutes`, and `limit` to narrow responses server-side. Fetching more data than you need wastes quota and increases latency.
For alert ingestion workflows, combine an initial REST poll on startup (`/alerts/in-force`) to get current state with a WebSocket `alerts.in_force` subscription for subsequent updates. This avoids repeated polling while keeping your state current after a reconnect.
# In-Force and Simultaneous Breaks
Source: https://docs.stratalerts.com/api/rest/alerts
Poll in-force setup alerts and simultaneous break events. Filter by timeframe, direction, and candle state. Use since_id for incremental polling.
The alerts endpoints expose two distinct alert types that StratAlerts generates in real time. In-force alerts fire when a setup becomes actionable — price is inside the trigger range on a given timeframe. Simultaneous break alerts fire when multiple index futures break the same direction within a detection window. Both endpoints share the `alerts:read` scope and support `since_id`-based incremental polling so you can efficiently retrieve only new events since your last request.
***
## GET /alerts/in-force
Returns in-force setup alerts. An alert is "in force" when price has entered the actionable range of a setup on a given timeframe. Filter by symbol, timeframe, direction, and candle state to narrow the result set.
**`GET https://app.stratalerts.com/api/market/v1/alerts/in-force`**
Requires scope: `alerts:read`
### Request parameters
Comma-separated list of ticker symbols to filter by (e.g., `AAPL,SPY`). When omitted, alerts for all symbols are returned.
How far back in time (in minutes) to look for alerts. When omitted, the server's default window applies.
Maximum number of alert items to return. Server-side clamping applies.
Return only alerts with an ID greater than this value. Use the highest `id` from your last response to implement incremental polling without re-fetching previously seen alerts.
Filter by timeframe. Pass `all` to return alerts across all timeframes, or a specific code such as `D`, `W`, `M`, `Q`, `Y`, `60`, `30`, `15`.
Filter by alert direction. Valid values: `all`, `bullish`, `bearish`.
Filter by candle state (CC field). Pass `all` to skip filtering, or a specific candle state string.
### Response fields
Array of in-force alert objects.
Unique alert ID. Use this value with `since_id` for incremental polling.
Ticker symbol.
Timeframe on which the setup went in force (e.g., `D`, `W`, `60`).
`bullish` or `bearish`.
Setup shape label (e.g., `1-2U`, `2-1`).
Price at which the alert triggered.
ISO 8601 timestamp (UTC) when the alert fired.
Candle state at the time of the alert.
### Code examples
```bash curl theme={null}
curl -G "https://app.stratalerts.com/api/market/v1/alerts/in-force" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "timeframe=D" \
--data-urlencode "direction=bullish" \
--data-urlencode "window_minutes=60" \
--data-urlencode "limit=50"
```
```python python theme={null}
import requests
last_seen_id = 0 # persist this between polls
resp = requests.get(
"https://app.stratalerts.com/api/market/v1/alerts/in-force",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={
"timeframe": "D",
"direction": "bullish",
"window_minutes": 60,
"limit": 50,
"since_id": last_seen_id,
},
)
resp.raise_for_status()
data = resp.json()
for alert in data["items"]:
print(alert["symbol"], alert["timeframe"], alert["shape"], alert["price"])
last_seen_id = max(last_seen_id, alert["id"])
```
```javascript javascript theme={null}
let lastSeenId = 0; // persist between polls
const params = new URLSearchParams({
timeframe: "D",
direction: "bullish",
window_minutes: "60",
limit: "50",
since_id: String(lastSeenId),
});
const resp = await fetch(
`https://app.stratalerts.com/api/market/v1/alerts/in-force?${params}`,
{ headers: { Authorization: "Bearer YOUR_API_KEY" } }
);
const data = await resp.json();
data.items.forEach((alert) => {
console.log(alert.symbol, alert.timeframe, alert.shape, alert.price);
lastSeenId = Math.max(lastSeenId, alert.id);
});
```
### Example response
```json theme={null}
{
"items": [
{
"id": 98421,
"symbol": "AAPL",
"timeframe": "D",
"direction": "bullish",
"shape": "1-2U",
"price": 214.32,
"triggered_at": "2026-04-10T13:45:22Z",
"cc": "2U"
},
{
"id": 98398,
"symbol": "SPY",
"timeframe": "D",
"direction": "bullish",
"shape": "2-2U",
"price": 532.10,
"triggered_at": "2026-04-10T13:31:05Z",
"cc": "2U"
}
]
}
```
***
## GET /alerts/simultaneous-breaks
Returns simultaneous break alert events. A simultaneous break fires when multiple tracked index futures (ES, NQ, RTY, YM) all break the same direction within the detection window. Use this endpoint to identify moments when the broad market is moving in a coordinated fashion.
**`GET https://app.stratalerts.com/api/market/v1/alerts/simultaneous-breaks`**
Requires scope: `alerts:read`
### Request parameters
How far back in time (in minutes) to look for simultaneous break events. When omitted, the server's default window applies.
Maximum number of events to return.
Return only events with an ID greater than this value. Use for incremental polling.
Filter by timeframe. Pass `all` or a specific timeframe code (e.g., `D`, `W`).
Filter by break direction. Valid values: `all`, `bullish`, `bearish`.
Filter by the number of participating instruments. Pass `all` to return all events, or a numeric string (`2`, `3`, `4`) to filter by the exact break count.
### Response fields
Array of simultaneous break alert objects.
Unique event ID. Use with `since_id` for incremental polling.
Timeframe on which the simultaneous break was detected.
`bullish` or `bearish`.
Number of index futures that broke in the same direction (2, 3, or 4).
List of the symbol tickers that participated in the break.
ISO 8601 timestamp (UTC) when the event fired.
### Code examples
```bash curl theme={null}
curl -G "https://app.stratalerts.com/api/market/v1/alerts/simultaneous-breaks" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "direction=bullish" \
--data-urlencode "threshold=3" \
--data-urlencode "window_minutes=120"
```
```python python theme={null}
import requests
resp = requests.get(
"https://app.stratalerts.com/api/market/v1/alerts/simultaneous-breaks",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"direction": "bullish", "threshold": "3", "window_minutes": 120},
)
resp.raise_for_status()
data = resp.json()
for event in data["items"]:
symbols = ", ".join(event["symbols"])
print(f"{event['triggered_at']} — {event['threshold']}/4 {event['direction']} ({symbols})")
```
```javascript javascript theme={null}
const params = new URLSearchParams({
direction: "bullish",
threshold: "3",
window_minutes: "120",
});
const resp = await fetch(
`https://app.stratalerts.com/api/market/v1/alerts/simultaneous-breaks?${params}`,
{ headers: { Authorization: "Bearer YOUR_API_KEY" } }
);
const data = await resp.json();
data.items.forEach(({ triggered_at, threshold, direction, symbols }) => {
console.log(`${triggered_at} — ${threshold}/4 ${direction} (${symbols.join(", ")})`);
});
```
### Example response
```json theme={null}
{
"items": [
{
"id": 4112,
"timeframe": "D",
"direction": "bullish",
"threshold": 3,
"symbols": ["ES1!", "NQ1!", "YM1!"],
"triggered_at": "2026-04-10T13:35:00Z"
},
{
"id": 4089,
"timeframe": "D",
"direction": "bullish",
"threshold": 4,
"symbols": ["ES1!", "NQ1!", "RTY1!", "YM1!"],
"triggered_at": "2026-04-10T09:32:15Z"
}
]
}
```
***
## Error codes
Both alerts endpoints use the same error format.
| HTTP status | Error code | Meaning |
| ----------- | ---------------------- | ----------------------------------------------------- |
| 401 | `missing_api_key` | No API key was provided or the key format is invalid. |
| 403 | `inactive_entitlement` | Your account does not have an active API entitlement. |
| 403 | `missing_scope` | Your API key does not have the `alerts:read` scope. |
Error responses use the following shape:
```json theme={null}
{
"error": {
"code": "missing_scope",
"message": "missing scope"
}
}
```
For real-time delivery, use the WebSocket channels `alerts.in_force` and `alerts.simultaneous_breaks` instead of polling. The REST endpoints are best suited for backfilling missed events or building an alert history log.
# Candles
Source: https://docs.stratalerts.com/api/rest/candles
Fetch open, high, low, close, and volume bars for a symbol across 10 intervals from 1-minute intraday to yearly. Filter by date range or limit bar count.
## Retrieve OHLCV bars for any timeframe
The candles endpoint returns historical OHLCV (open, high, low, close, volume) bars for a single symbol at a requested interval. You can retrieve everything from 1-minute intraday data up to yearly bars, and optionally narrow the result to a specific date range. When the market is open, the most recent bar may still be forming — the `partial_bar_included` flag tells you whether that is the case.
**`GET https://app.stratalerts.com/api/market/v1/candles/{symbol}`**
Requires scope: `candles:read`
## Path parameters
The ticker symbol (e.g., `AAPL`, `ES1!`). Case-insensitive — normalized to uppercase.
## Query parameters
The bar interval. Must be one of the following values:
| Value | Description |
| ----- | ----------- |
| `1m` | 1-minute |
| `15m` | 15-minute |
| `30m` | 30-minute |
| `60m` | 60-minute |
| `4h` | 4-hour |
| `1d` | Daily |
| `1w` | Weekly |
| `1mo` | Monthly |
| `1q` | Quarterly |
| `1y` | Yearly |
An unrecognized interval value returns a `404` response.
Start of the date range. Accepts an ISO 8601 datetime string (`2026-01-15T09:30:00Z`) or a plain date string (`2026-01-15`). Plain dates are interpreted as midnight UTC. Bars with a `time` value before this timestamp are excluded.
End of the date range. Same format as `start`. Bars with a `time` value after this timestamp are excluded.
Maximum number of bars to return. Clamped to the range `1–5000`. When a `start`/`end` range is also provided, the limit is applied after filtering — returning the most recent `limit` bars within that range.
## Response fields
The requested ticker symbol, uppercased.
The normalized interval string you requested (e.g., `1d`).
Array of OHLCV bar objects ordered chronologically (oldest first).
Bar open timestamp as a Unix timestamp (seconds since epoch, UTC).
Opening price for the bar period.
Highest price reached during the bar period.
Lowest price reached during the bar period.
Closing price for the bar period.
Total volume traded during the bar period.
`true` when the final bar in the array is still forming (i.e., the current period has not yet closed). Always `false` for the `1m` interval and for any request made outside market hours.
When `partial_bar_included` is `true`, the last bar's `high`, `low`, `close`, and `volume` values will change as the period progresses. Do not treat a partial bar as a confirmed candle for setup or signal calculations.
## Code examples
```bash curl theme={null}
curl -G "https://app.stratalerts.com/api/market/v1/candles/AAPL" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "interval=1d" \
--data-urlencode "limit=10"
```
```python python theme={null}
import requests
resp = requests.get(
"https://app.stratalerts.com/api/market/v1/candles/AAPL",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"interval": "1d", "limit": 10},
)
resp.raise_for_status()
data = resp.json()
print("partial bar included:", data["partial_bar_included"])
for bar in data["bars"]:
print(bar["time"], bar["open"], bar["close"])
```
```javascript javascript theme={null}
const resp = await fetch(
"https://app.stratalerts.com/api/market/v1/candles/AAPL?interval=1d&limit=10",
{ headers: { Authorization: "Bearer YOUR_API_KEY" } }
);
const data = await resp.json();
console.log("partial bar included:", data.partialBarIncluded);
data.bars.forEach(({ time, open, close }) => console.log(time, open, close));
```
### Fetching a date range
```bash curl theme={null}
curl -G "https://app.stratalerts.com/api/market/v1/candles/SPY" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "interval=1w" \
--data-urlencode "start=2026-01-01" \
--data-urlencode "end=2026-03-31"
```
```python python theme={null}
import requests
resp = requests.get(
"https://app.stratalerts.com/api/market/v1/candles/SPY",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"interval": "1w", "start": "2026-01-01", "end": "2026-03-31"},
)
resp.raise_for_status()
data = resp.json()
print(f"{len(data['bars'])} weekly bars returned")
```
```javascript javascript theme={null}
const params = new URLSearchParams({
interval: "1w",
start: "2026-01-01",
end: "2026-03-31",
});
const resp = await fetch(
`https://app.stratalerts.com/api/market/v1/candles/SPY?${params}`,
{ headers: { Authorization: "Bearer YOUR_API_KEY" } }
);
const data = await resp.json();
console.log(`${data.bars.length} weekly bars returned`);
```
## Example response
```json theme={null}
{
"symbol": "AAPL",
"interval": "1d",
"bars": [
{
"time": 1744243200,
"open": 210.50,
"high": 215.80,
"low": 209.30,
"close": 214.32,
"volume": 62400000
},
{
"time": 1744329600,
"open": 214.50,
"high": 217.10,
"low": 213.20,
"close": 216.75,
"volume": 55100000
}
],
"partial_bar_included": false
}
```
## Error codes
| HTTP status | Error code | Meaning |
| ----------- | ---------------------- | ---------------------------------------------------------------- |
| 401 | `missing_api_key` | No API key was provided or the key format is invalid. |
| 403 | `inactive_entitlement` | Your account does not have an active API entitlement. |
| 403 | `missing_scope` | Your API key does not have the `candles:read` scope. |
| 404 | `unknown_symbol` | The symbol path parameter was not found in the tracked universe. |
An unrecognized `interval` value also returns a `404` with no error body.
Error responses use the following shape:
```json theme={null}
{
"error": {
"code": "unknown_symbol",
"message": "unknown symbol"
}
}
```
# Instruments
Source: https://docs.stratalerts.com/api/rest/instruments
Look up instrument metadata — name, exchange, sector, asset type, and active status — for one symbol or an entire batch of up to 250 tickers at once.
## Search and retrieve ticker metadata
The instruments endpoints give you structured metadata for any symbol in the StratAlerts universe. Use the list endpoint to search or filter by symbol, then use the detail endpoint when you need a single record by exact ticker. Both endpoints require the `metadata:read` scope and return the same object shape.
***
## GET /instruments
Returns a paginated list of instruments. You can filter by a comma-separated set of symbols, run a prefix/substring search, or simply page through the full universe.
**`GET https://app.stratalerts.com/api/market/v1/instruments`**
Requires scope: `metadata:read`
### Request parameters
Comma-separated list of ticker symbols to retrieve. Symbols are normalized to uppercase. Maximum 250. When provided alongside `search`, only symbols that also match the search string are returned.
Substring filter applied to the symbol field (case-insensitive). Useful for finding symbols when you only know part of the ticker.
Maximum number of instruments to return. Clamped to the range `1–200`.
### Response fields
Array of instrument objects.
Ticker symbol, uppercased (e.g., `AAPL`).
Full company or instrument name.
Asset class: `stocks`, `futures`, `crypto`, or empty string if unknown.
Primary exchange abbreviation (e.g., `NASDAQ`, `NYSE`).
Instrument type string from the underlying data provider (e.g., `CS` for common stock).
GICS sector name, or empty string for instruments without sector classification.
`true` if the symbol is actively tracked and receiving data.
### Code examples
```bash curl theme={null}
curl -G "https://app.stratalerts.com/api/market/v1/instruments" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "symbols=AAPL,MSFT,NVDA" \
--data-urlencode "limit=10"
```
```python python theme={null}
import requests
resp = requests.get(
"https://app.stratalerts.com/api/market/v1/instruments",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"symbols": "AAPL,MSFT,NVDA", "limit": 10},
)
resp.raise_for_status()
data = resp.json()
for instrument in data["items"]:
print(instrument["symbol"], instrument["name"])
```
```javascript javascript theme={null}
const resp = await fetch(
"https://app.stratalerts.com/api/market/v1/instruments?symbols=AAPL,MSFT,NVDA&limit=10",
{ headers: { Authorization: "Bearer YOUR_API_KEY" } }
);
const data = await resp.json();
data.items.forEach(({ symbol, name }) => console.log(symbol, name));
```
### Example response
```json theme={null}
{
"items": [
{
"symbol": "AAPL",
"name": "Apple Inc.",
"market": "stocks",
"exchange": "NASDAQ",
"type": "CS",
"sector": "Information Technology",
"active": true
},
{
"symbol": "MSFT",
"name": "Microsoft Corporation",
"market": "stocks",
"exchange": "NASDAQ",
"type": "CS",
"sector": "Information Technology",
"active": true
}
]
}
```
***
## GET /instruments/
Returns a single instrument by its exact ticker symbol. The symbol in the path is normalized to uppercase before lookup.
**`GET https://app.stratalerts.com/api/market/v1/instruments/{symbol}`**
Requires scope: `metadata:read`
### Path parameters
The ticker symbol to look up (e.g., `AAPL`). Case-insensitive — the server normalizes to uppercase.
### Response fields
Returns a single instrument object with the same fields as the list response above: `symbol`, `name`, `market`, `exchange`, `type`, `sector`, and `active`.
### Code examples
```bash curl theme={null}
curl "https://app.stratalerts.com/api/market/v1/instruments/AAPL" \
-H "Authorization: Bearer YOUR_API_KEY"
```
```python python theme={null}
import requests
resp = requests.get(
"https://app.stratalerts.com/api/market/v1/instruments/AAPL",
headers={"Authorization": "Bearer YOUR_API_KEY"},
)
resp.raise_for_status()
instrument = resp.json()
print(instrument["symbol"], instrument["sector"])
```
```javascript javascript theme={null}
const resp = await fetch(
"https://app.stratalerts.com/api/market/v1/instruments/AAPL",
{ headers: { Authorization: "Bearer YOUR_API_KEY" } }
);
const instrument = await resp.json();
console.log(instrument.symbol, instrument.sector);
```
### Example response
```json theme={null}
{
"symbol": "AAPL",
"name": "Apple Inc.",
"market": "stocks",
"exchange": "NASDAQ",
"type": "CS",
"sector": "Information Technology",
"active": true
}
```
***
## Error codes
| HTTP status | Error code | Meaning |
| ----------- | ---------------------- | ---------------------------------------------------------- |
| 401 | `missing_api_key` | No API key was provided or the key format is invalid. |
| 403 | `inactive_entitlement` | Your account does not have an active API entitlement. |
| 403 | `missing_scope` | Your API key does not have the `metadata:read` scope. |
| 404 | `unknown_symbol` | The requested symbol was not found (detail endpoint only). |
Error responses use the following shape:
```json theme={null}
{
"error": {
"code": "unknown_symbol",
"message": "unknown symbol"
}
}
```
# Market Status
Source: https://docs.stratalerts.com/api/rest/market-status
Returns the current open/closed state of the US stock market, active session details, session open and close timestamps, and the current server time in ET.
## Check whether the market is open
The market status endpoint returns a real-time snapshot of whether the US stock market is open, along with the details of the active session. Use this endpoint to gate time-sensitive logic in your integration — for example, to skip candle or price requests outside Regular Trading Hours (RTH), or to display market open/close countdowns in your UI.
**`GET https://app.stratalerts.com/api/market/v1/market-status`**
Requires scope: `metadata:read`
## Request parameters
This endpoint accepts no query parameters.
## Response fields
The market this status applies to. Currently always `stocks`.
The timezone used for session timestamps. Always `America/New_York`.
`true` if the market is currently in a Regular Trading Hours (RTH) session, `false` otherwise (pre-market, after-hours, weekend, or holiday).
Details of the current or most recent RTH session. All timestamp fields are empty strings when `is_open` is `false`.
Session type label. `RTH` during Regular Trading Hours, empty string otherwise.
The calendar date of the session in `YYYY-MM-DD` format. Empty string when `is_open` is `false`.
ISO 8601 timestamp of the session open (e.g., `2026-04-10T09:30:00-04:00`). Empty string when `is_open` is `false`.
ISO 8601 timestamp of the session close (e.g., `2026-04-10T16:00:00-04:00`). Empty string when `is_open` is `false`.
The current server time as an ISO 8601 timestamp in the `America/New_York` timezone (e.g., `2026-04-10T14:35:00-04:00`). Use this to compute time-to-close or time-to-open without worrying about clock skew.
StratAlerts only tracks Regular Trading Hours (RTH) sessions. Pre-market and after-hours periods return `is_open: false` even when exchange-traded products are actively trading on extended hours.
## Code examples
```bash curl theme={null}
curl "https://app.stratalerts.com/api/market/v1/market-status" \
-H "Authorization: Bearer YOUR_API_KEY"
```
```python python theme={null}
import requests
from datetime import datetime
resp = requests.get(
"https://app.stratalerts.com/api/market/v1/market-status",
headers={"Authorization": "Bearer YOUR_API_KEY"},
)
resp.raise_for_status()
status = resp.json()
if status["is_open"]:
close_ts = status["session"]["close_ts"]
now = status["now"]
print(f"Market is open. Closes at {close_ts}. Current time: {now}")
else:
print("Market is closed.")
```
```javascript javascript theme={null}
const resp = await fetch(
"https://app.stratalerts.com/api/market/v1/market-status",
{ headers: { Authorization: "Bearer YOUR_API_KEY" } }
);
const status = await resp.json();
if (status.is_open) {
console.log(`Market is open. Closes at ${status.session.close_ts}.`);
console.log(`Server time: ${status.now}`);
} else {
console.log("Market is closed.");
}
```
## Example responses
### Market open
```json theme={null}
{
"market": "stocks",
"timezone": "America/New_York",
"is_open": true,
"session": {
"label": "RTH",
"session_date": "2026-04-10",
"open_ts": "2026-04-10T09:30:00-04:00",
"close_ts": "2026-04-10T16:00:00-04:00"
},
"now": "2026-04-10T14:35:00-04:00"
}
```
### Market closed
```json theme={null}
{
"market": "stocks",
"timezone": "America/New_York",
"is_open": false,
"session": {
"label": "",
"session_date": "",
"open_ts": "",
"close_ts": ""
},
"now": "2026-04-10T18:12:00-04:00"
}
```
## Error codes
| HTTP status | Error code | Meaning |
| ----------- | ---------------------- | ----------------------------------------------------- |
| 401 | `missing_api_key` | No API key was provided or the key format is invalid. |
| 403 | `inactive_entitlement` | Your account does not have an active API entitlement. |
| 403 | `missing_scope` | Your API key does not have the `metadata:read` scope. |
Error responses use the following shape:
```json theme={null}
{
"error": {
"code": "missing_api_key",
"message": "missing api key"
}
}
```
# Prices
Source: https://docs.stratalerts.com/api/rest/prices
Retrieve the most recent trade price and volume for up to 250 symbols in a single request. Requires the prices:read scope on your API key.
## Fetch the latest trade prices for symbols
The latest prices endpoint returns the most recent trade data for a batch of symbols. You must specify at least one symbol — the request returns a `400` error otherwise. Results are keyed by symbol and include price, volume, and any additional fields captured from the last trade event.
**`GET https://app.stratalerts.com/api/market/v1/prices/latest`**
Requires scope: `prices:read`
## Request parameters
Comma-separated list of ticker symbols (e.g., `AAPL,MSFT,SPY`). Symbols are normalized to uppercase. Maximum 250. At least one symbol is required — omitting this parameter returns a `400` error.
## Response fields
Array of price objects, one per symbol that has a recent trade on record. Symbols with no recorded trade are omitted from the response.
Ticker symbol, uppercased.
Most recent trade price.
Volume associated with the last trade event.
Symbols in the response array follow the same order as your `symbols` parameter. Symbols with no recent trade data are silently excluded — check that all expected symbols appear in the response if completeness matters to your use case.
## Code examples
```bash curl theme={null}
curl -G "https://app.stratalerts.com/api/market/v1/prices/latest" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "symbols=AAPL,MSFT,SPY"
```
```python python theme={null}
import requests
resp = requests.get(
"https://app.stratalerts.com/api/market/v1/prices/latest",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"symbols": "AAPL,MSFT,SPY"},
)
resp.raise_for_status()
data = resp.json()
for item in data["items"]:
print(item["symbol"], item["price"])
```
```javascript javascript theme={null}
const resp = await fetch(
"https://app.stratalerts.com/api/market/v1/prices/latest?symbols=AAPL,MSFT,SPY",
{ headers: { Authorization: "Bearer YOUR_API_KEY" } }
);
const data = await resp.json();
data.items.forEach(({ symbol, price }) => console.log(symbol, price));
```
## Example response
```json theme={null}
{
"items": [
{
"symbol": "AAPL",
"price": 214.32,
"volume": 1200
},
{
"symbol": "MSFT",
"price": 415.88,
"volume": 850
},
{
"symbol": "SPY",
"price": 532.10,
"volume": 3400
}
]
}
```
## Error codes
| HTTP status | Error code | Meaning |
| ----------- | ---------------------- | ----------------------------------------------------------- |
| 400 | `missing_symbols` | The `symbols` query parameter was not provided or is empty. |
| 401 | `missing_api_key` | No API key was provided or the key format is invalid. |
| 403 | `inactive_entitlement` | Your account does not have an active API entitlement. |
| 403 | `missing_scope` | Your API key does not have the `prices:read` scope. |
Error responses use the following shape:
```json theme={null}
{
"error": {
"code": "missing_symbols",
"message": "missing symbols"
}
}
```
# Setups
Source: https://docs.stratalerts.com/api/rest/setups
Retrieve active Strat setups for any combination of symbols and timeframes. Filter to a subset or pull the full tracked universe in one paginated request.
## Query current active setups across symbols
The setups endpoint returns the currently active setup records — the same data that populates the Setups Table in the StratAlerts UI. Each item represents one setup on one timeframe for one symbol, and includes candle state, in-force status, P3 and PMG indicators, setup shape, and sector classification. You can scope the results to specific symbols or timeframes, or omit filters to retrieve the full active universe up to your `limit`.
**`GET https://app.stratalerts.com/api/market/v1/setups/current`**
Requires scope: `states:read`
## Request parameters
Comma-separated list of ticker symbols to filter by (e.g., `AAPL,MSFT,SPY`). When provided, only setups for those symbols are returned. Symbols are normalized to uppercase. Maximum 250.
Comma-separated list of timeframe codes to filter by (e.g., `D,W,M`). When provided, only setups on those timeframes are returned. Valid timeframe codes: `15`, `30`, `60`, `4H`, `D`, `W`, `M`, `Q`, `Y`.
Maximum number of setup rows to return. Results are ordered by symbol then timeframe before the limit is applied.
## Response fields
Array of setup objects.
Ticker symbol.
Timeframe code (e.g., `D`, `W`, `60`).
Human-readable setup shape label combining the C2-C1 sequence (e.g., `1-2U`, `2D-3`, `1-2D`).
`true` if the setup is currently in force — price has crossed the trigger level and the trade is active.
`true` if a P3 (potential 3) scenario is present — the current candle is an outside bar.
The Potential Max Gain price level for this setup, or `null` if not applicable.
`true` if the setup is a continuation — the C1 and CC candles are both the same directional 2 candle.
GICS sector of the underlying symbol.
Results are ordered alphabetically by symbol, then by timeframe, before the `limit` is applied. If you need a specific subset, always pass `symbols` and/or `timeframes` to avoid truncation.
## Code examples
```bash curl theme={null}
curl -G "https://app.stratalerts.com/api/market/v1/setups/current" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "symbols=AAPL,MSFT" \
--data-urlencode "timeframes=D,W" \
--data-urlencode "limit=50"
```
```python python theme={null}
import requests
resp = requests.get(
"https://app.stratalerts.com/api/market/v1/setups/current",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"symbols": "AAPL,MSFT", "timeframes": "D,W", "limit": 50},
)
resp.raise_for_status()
data = resp.json()
for setup in data["items"]:
in_force = "IN FORCE" if setup["in_force"] else ""
print(f"{setup['symbol']} {setup['timeframe']} {setup['shape']} {in_force}")
```
```javascript javascript theme={null}
const params = new URLSearchParams({
symbols: "AAPL,MSFT",
timeframes: "D,W",
limit: "50",
});
const resp = await fetch(
`https://app.stratalerts.com/api/market/v1/setups/current?${params}`,
{ headers: { Authorization: "Bearer YOUR_API_KEY" } }
);
const data = await resp.json();
data.items.forEach(({ symbol, timeframe, shape, in_force }) => {
const flag = in_force ? "IN FORCE" : "";
console.log(symbol, timeframe, shape, flag);
});
```
## Example response
```json theme={null}
{
"items": [
{
"symbol": "AAPL",
"timeframe": "D",
"shape": "1-2U",
"in_force": true,
"p3": false,
"pmg": null,
"continuation": false,
"sector": "Information Technology"
},
{
"symbol": "AAPL",
"timeframe": "W",
"shape": "1-2D",
"in_force": false,
"p3": true,
"pmg": 210.00,
"continuation": false,
"sector": "Information Technology"
},
{
"symbol": "MSFT",
"timeframe": "D",
"shape": "2U-2U",
"in_force": false,
"p3": false,
"pmg": null,
"continuation": true,
"sector": "Information Technology"
}
]
}
```
## Error codes
| HTTP status | Error code | Meaning |
| ----------- | ---------------------- | ----------------------------------------------------- |
| 401 | `missing_api_key` | No API key was provided or the key format is invalid. |
| 403 | `inactive_entitlement` | Your account does not have an active API entitlement. |
| 403 | `missing_scope` | Your API key does not have the `states:read` scope. |
Error responses use the following shape:
```json theme={null}
{
"error": {
"code": "missing_scope",
"message": "missing scope"
}
}
```
# TFC and Setup Snapshots
Source: https://docs.stratalerts.com/api/rest/states
Retrieve the complete real-time state for a symbol: metadata, latest price, TFC colors across all timeframes, and all active setups in one response.
The states endpoint returns a single-symbol snapshot that aggregates everything StratAlerts tracks for a ticker: its instrument metadata, the most recent trade price, the Timeframe Continuity (TFC) color for each timeframe, and all active setup rows. This is the same data that powers the per-symbol overview page in the StratAlerts UI and is the most efficient way to get a complete picture of a symbol in one request.
**`GET https://app.stratalerts.com/api/market/v1/states/{symbol}`**
Requires scope: `states:read`
## Path parameters
The ticker symbol to look up (e.g., `AAPL`). Normalized to uppercase. Returns `404` if the symbol is unknown or not tracked.
## Response fields
The requested ticker symbol, uppercased.
Full instrument metadata object. Contains the same fields as the [instruments endpoint](/api/rest/instruments): `symbol`, `name`, `market`, `exchange`, `type`, `sector`, and `active`.
Latest trade price object from the prices feed. Contains at minimum `price` and `volume`. May be an empty object (`{}`) if no recent trade is on record.
Timeframe Continuity state for the symbol. Keys are timeframe labels; values are color strings indicating directional bias.
Daily TFC color:
`green`
,
`red`
, or
`yellow`
.
Weekly TFC color.
Monthly TFC color.
Quarterly TFC color.
Yearly TFC color.
Only timeframes with a recorded TFC state appear in this object. Intraday timeframes may appear when available.
Array of active setup rows for the symbol. Each object includes the setup shape (e.g., `1-2U`), in-force status, P3 and PMG flags, continuation status, and sector. The exact shape mirrors the [setups endpoint](/api/rest/setups) response items.
The recommended default chart timeframe for this symbol (e.g., `D`).
Ordered list of timeframe labels available for this symbol's chart display (e.g., `["15", "30", "60", "4H", "D", "W", "M", "Q", "Y"]`).
## Code examples
```bash curl theme={null}
curl "https://app.stratalerts.com/api/market/v1/states/AAPL" \
-H "Authorization: Bearer YOUR_API_KEY"
```
```python python theme={null}
import requests
resp = requests.get(
"https://app.stratalerts.com/api/market/v1/states/AAPL",
headers={"Authorization": "Bearer YOUR_API_KEY"},
)
resp.raise_for_status()
state = resp.json()
# Read TFC colors
for tf, color in state["tfc"].items():
print(f"{tf}: {color}")
# Count active setups
print(f"{len(state['setups'])} active setup(s)")
```
```javascript javascript theme={null}
const resp = await fetch(
"https://app.stratalerts.com/api/market/v1/states/AAPL",
{ headers: { Authorization: "Bearer YOUR_API_KEY" } }
);
const state = await resp.json();
// Read TFC colors
Object.entries(state.tfc).forEach(([tf, color]) =>
console.log(`${tf}: ${color}`)
);
// Count active setups
console.log(`${state.setups.length} active setup(s)`);
```
## Example response
```json theme={null}
{
"symbol": "AAPL",
"instrument": {
"symbol": "AAPL",
"name": "Apple Inc.",
"market": "stocks",
"exchange": "NASDAQ",
"type": "CS",
"sector": "Information Technology",
"active": true
},
"price": {
"price": 214.32,
"volume": 1200
},
"tfc": {
"D": "green",
"W": "red",
"M": "green",
"Q": "green",
"Y": "green"
},
"setups": [
{
"symbol": "AAPL",
"timeframe": "D",
"shape": "1-2U",
"in_force": true,
"p3": false,
"pmg": null,
"continuation": false,
"sector": "Information Technology"
}
],
"default_timeframe": "D",
"chart_timeframes": ["15", "30", "60", "4H", "D", "W", "M", "Q", "Y"]
}
```
## Error codes
| HTTP status | Error code | Meaning |
| ----------- | ---------------------- | ---------------------------------------------------------- |
| 401 | `missing_api_key` | No API key was provided or the key format is invalid. |
| 403 | `inactive_entitlement` | Your account does not have an active API entitlement. |
| 403 | `missing_scope` | Your API key does not have the `states:read` scope. |
| 404 | `unknown_symbol` | The symbol was not found or is not tracked by StratAlerts. |
Error responses use the following shape:
```json theme={null}
{
"error": {
"code": "unknown_symbol",
"message": "unknown symbol"
}
}
```
# WebSocket Channels
Source: https://docs.stratalerts.com/api/websocket/channels
Reference for all four StratAlerts WebSocket channels — required scopes, symbol subscription rules, event payloads, and subscribe/unsubscribe examples.
## Quotes, States, and Alerts
The WebSocket API organizes its event streams into four channels. Two channels — `quotes` and `states` — deliver per-symbol events and require you to subscribe with an explicit list of ticker symbols. The other two — `alerts.in_force` and `alerts.simultaneous_breaks` — are account-wide streams that deliver all events globally; no symbol list is needed. Each channel requires the `ws:connect` scope on your key plus the channel-specific scope listed below.
Your key must have **both** `ws:connect` and the channel-specific scope to subscribe. If your key is missing a channel's scope, that channel is silently excluded from the acknowledgment. Check the `channels` array in the `subscribed` response to confirm which subscriptions were accepted.
On `quotes` and `states` topics, `symbols` must be a JSON array — for example, `["AAPL"]`. If you pass a string such as `"AAPL"`, the server treats the payload as malformed and subscribes you to **zero** symbols. The channel is still echoed back in the `subscribed` acknowledgment, but no per-symbol events are delivered until you resubscribe with a proper array. Always wrap symbols in an array, even when subscribing to one ticker.
***
## `quotes`
Delivers real-time price updates as trades occur for each symbol you subscribe to.
| Property | Value |
| ------------------------ | ------------- |
| **Required scope** | `prices:read` |
| **Symbol list required** | Yes |
| **Event type** | `quote` |
### Event payload
```json theme={null}
{
"type": "quote",
"ts": "2026-04-10T14:35:00.887341+00:00",
"seq": "7",
"data": {
"symbol": "AAPL",
"price": 198.50,
"volume": 1234567,
"event_ts": "2026-04-10T14:35:00.712000+00:00"
}
}
```
| Field | Type | Description |
| ---------- | ------- | -------------------------------------------------- |
| `symbol` | string | Uppercase ticker symbol |
| `price` | number | Trade price |
| `volume` | integer | Cumulative volume at the time of this update |
| `event_ts` | string | ISO 8601 timestamp of the originating market event |
### Subscribe
```json theme={null}
{
"op": "subscribe",
"topics": [
{ "channel": "quotes", "symbols": ["AAPL", "SPY", "QQQ"] }
]
}
```
### Unsubscribe
You can unsubscribe from individual symbols without affecting others. Symbols you are still subscribed to continue delivering events.
```json theme={null}
{
"op": "unsubscribe",
"topics": [
{ "channel": "quotes", "symbols": ["QQQ"] }
]
}
```
***
## `states`
Delivers real-time TFC state and setup updates for each symbol you subscribe to. A `state` event fires when a symbol's candle state changes on any tracked timeframe — for example, when a daily 2U break occurs or a weekly 1 completes.
| Property | Value |
| ------------------------ | ------------- |
| **Required scope** | `states:read` |
| **Symbol list required** | Yes |
| **Event type** | `state` |
### Event payload
The `data` object contains the symbol's current state snapshot at the time of the update. The exact fields reflect the same structure returned by the `/states/{symbol}` REST endpoint.
```json theme={null}
{
"type": "state",
"ts": "2026-04-10T14:35:01.004512+00:00",
"seq": "12",
"data": {
"symbol": "AAPL"
}
}
```
The full state payload includes TFC colors, candle IDs per timeframe, and active setup data. The structure matches the `/states/{symbol}` REST endpoint response. Refer to the [REST states reference](/api/rest/states) for field-level documentation.
### Subscribe
```json theme={null}
{
"op": "subscribe",
"topics": [
{ "channel": "states", "symbols": ["AAPL", "NVDA"] }
]
}
```
### Unsubscribe
```json theme={null}
{
"op": "unsubscribe",
"topics": [
{ "channel": "states", "symbols": ["NVDA"] }
]
}
```
***
## `alerts.in_force`
Delivers a pushed event each time an in-force alert fires anywhere in the scan universe. This channel is account-wide — once subscribed, you receive every in-force alert without specifying symbols.
| Property | Value |
| ------------------------ | ---------------- |
| **Required scope** | `alerts:read` |
| **Symbol list required** | No |
| **Event type** | `alert.in_force` |
An in-force alert fires when price breaks the trigger level of a recognized setup, making the trade active. This corresponds to the same alerts surfaced in Mission Control's alerts stream and delivered via push notifications.
### Event payload
```json theme={null}
{
"type": "alert.in_force",
"ts": "2026-04-10T14:35:02.341800+00:00",
"seq": "19",
"data": {
"symbol": "SPY",
"timeframe": "Daily",
"setup": "2-1-2U",
"direction": "Up",
"price": 561.40,
"alert_ts": "2026-04-10T14:35:02.100000+00:00"
}
}
```
The fields in `data` reflect the alert payload as produced by the StratAlerts alert engine. Field availability may vary by alert type and instrument. Always code defensively against missing keys.
### Subscribe
No symbol list is needed. A single subscription receives all in-force alerts across every scanned instrument.
```json theme={null}
{
"op": "subscribe",
"topics": [
{ "channel": "alerts.in_force" }
]
}
```
### Unsubscribe
```json theme={null}
{
"op": "unsubscribe",
"topics": [
{ "channel": "alerts.in_force" }
]
}
```
***
## `alerts.simultaneous_breaks`
Delivers a pushed event each time a simultaneous break is detected — when multiple instruments break the same type of level in the same direction within a short time window. Like `alerts.in_force`, this is an account-wide channel with no symbol list.
| Property | Value |
| ------------------------ | -------------------------- |
| **Required scope** | `alerts:read` |
| **Symbol list required** | No |
| **Event type** | `alert.simultaneous_break` |
Simultaneous breaks signal coordinated directional activity across multiple instruments and are surfaced separately in Mission Control. Subscribing to this channel lets you ingest those events programmatically.
### Event payload
```json theme={null}
{
"type": "alert.simultaneous_break",
"ts": "2026-04-10T14:35:05.908211+00:00",
"seq": "24",
"data": {
"direction": "Up",
"timeframe": "Daily",
"symbols": ["SPY", "QQQ", "IWM"],
"break_ts": "2026-04-10T14:35:05.700000+00:00"
}
}
```
The fields in `data` reflect the simultaneous break payload as produced by the alert engine. Field availability may vary. Always code defensively against missing keys.
### Subscribe
```json theme={null}
{
"op": "subscribe",
"topics": [
{ "channel": "alerts.simultaneous_breaks" }
]
}
```
### Unsubscribe
```json theme={null}
{
"op": "unsubscribe",
"topics": [
{ "channel": "alerts.simultaneous_breaks" }
]
}
```
***
## Subscribing to multiple channels at once
You can subscribe to multiple channels in a single message. The server processes all topics and returns one acknowledgment listing every channel it accepted.
```json theme={null}
{
"op": "subscribe",
"topics": [
{ "channel": "quotes", "symbols": ["AAPL", "SPY"] },
{ "channel": "states", "symbols": ["AAPL"] },
{ "channel": "alerts.in_force" },
{ "channel": "alerts.simultaneous_breaks" }
]
}
```
Response:
```json theme={null}
{
"type": "subscribed",
"ts": "2026-04-10T14:35:00.123456+00:00",
"seq": "1",
"data": {
"channels": ["quotes", "states", "alerts.in_force", "alerts.simultaneous_breaks"]
}
}
```
Send all your subscriptions in one message immediately after connecting rather than as separate messages. This reduces round trips and ensures you do not miss events that fire during the gap between individual subscription requests.
## Channel scope summary
| Channel | Scope required | Symbol list |
| ---------------------------- | ---------------------------- | ----------- |
| `quotes` | `ws:connect` + `prices:read` | Yes |
| `states` | `ws:connect` + `states:read` | Yes |
| `alerts.in_force` | `ws:connect` + `alerts:read` | No |
| `alerts.simultaneous_breaks` | `ws:connect` + `alerts:read` | No |
## Related
Connection setup, authentication, close codes, and reconnection strategy.
How to obtain an API key and understand which scopes each key carries.
# WebSocket API
Source: https://docs.stratalerts.com/api/websocket/overview
Connect to the StratAlerts WebSocket API to receive pushed price updates, TFC state changes, and alert events as they happen — no polling required.
## Overview for Real-Time Streaming
The StratAlerts WebSocket API gives you a persistent, bidirectional connection to the same real-time data stream that powers the scanner. Instead of polling REST endpoints for the latest state, you open one connection and subscribe to the channels you need — price quotes, TFC state changes, in-force alerts, and simultaneous break alerts — then receive events pushed to you as they fire. Use the WebSocket API when your integration needs live data; use the REST API when you need historical snapshots or one-time lookups.
## Endpoint
All WebSocket connections go to a single endpoint:
```text theme={null}
wss://app.stratalerts.com/ws/market/v1
```
## Authentication
You authenticate at connection time by passing your API key in the HTTP upgrade request. The server validates the key before completing the WebSocket handshake — no separate auth message is needed after connecting.
Pass your key using either of these headers:
| Header | Format |
| --------------- | --------------------- |
| `Authorization` | `Bearer YOUR_API_KEY` |
| `X-API-Key` | `YOUR_API_KEY` |
Your key must have the `ws:connect` scope in addition to any channel-specific scopes. If the key is missing or invalid, the connection is rejected with close code `4401`. If the key lacks the required scopes, it is rejected with close code `4403`.
API keys are managed in your account at [app.stratalerts.com](https://app.stratalerts.com). Each key is issued with a specific set of scopes — if you cannot connect or subscribe to a channel, check that your key includes the required scope.
## One connection per account
Each account may have only one active WebSocket connection at a time. If you open a second connection while an existing one is live, the server evicts the older connection by closing it with code `4409` before completing the new handshake. The new connection then proceeds normally.
Design your client to handle close code `4409` as a signal that it was replaced — typically this means you should not attempt to reconnect immediately, since a newer instance of your application is already connected.
## Usage metering
Each outbound WebSocket event is metered as a `ws_message` usage row on your account. This applies to all data events pushed to your connection — quotes, state changes, and alerts. Metered usage counts toward your API billing alongside REST request usage.
## Message envelope
Every message the server sends — including acknowledgments and data events — uses the same JSON envelope:
```json theme={null}
{
"type": "event_type_here",
"ts": "2026-04-10T14:35:00.123456+00:00",
"seq": "42",
"data": {}
}
```
| Field | Type | Description |
| ------ | ------ | --------------------------------------------------------------------------------------------- |
| `type` | string | Event type (e.g. `quote`, `alert.in_force`, `subscribed`) |
| `ts` | string | ISO 8601 server timestamp for this message |
| `seq` | string | Monotonically increasing integer string; increments for every message sent on this connection |
| `data` | object | Event-specific payload |
The `seq` field is a string representation of an integer that starts at `1` and increments with each message. You can use it to detect dropped messages if you are logging or buffering events.
## Subscribing to channels
After the connection is established, send a subscribe message to begin receiving events from one or more channels:
```json theme={null}
{
"op": "subscribe",
"topics": [
{ "channel": "quotes", "symbols": ["AAPL", "TSLA"] },
{ "channel": "states", "symbols": ["AAPL"] },
{ "channel": "alerts.in_force" },
{ "channel": "alerts.simultaneous_breaks" }
]
}
```
The server responds with a `subscribed` acknowledgment listing the channels it accepted:
```json theme={null}
{
"type": "subscribed",
"ts": "2026-04-10T14:35:00.123456+00:00",
"seq": "1",
"data": {
"channels": ["quotes", "alerts.in_force"]
}
}
```
Channels that require a symbols list (`quotes`, `states`) are subscribed per symbol. Channels that are account-wide (`alerts.in_force`, `alerts.simultaneous_breaks`) do not take a symbols list — once subscribed, you receive all events globally.
`symbols` must be a JSON array of ticker strings — for example, `["AAPL", "TSLA"]`. If you pass a string such as `"AAPL"`, the server treats the payload as malformed and subscribes you to **zero** symbols on that topic. The channel still appears in the `subscribed` acknowledgment, but you will not receive any events until you resubscribe with a proper array. Always wrap symbols in an array, even when subscribing to one ticker.
If your key is missing the scope for a channel, that channel is silently omitted from the acknowledgment. Check the `channels` array in the response to confirm which subscriptions were accepted.
## Unsubscribing
Send the same message format with `"op": "unsubscribe"` to stop receiving events from specific channels or symbols:
```json theme={null}
{
"op": "unsubscribe",
"topics": [
{ "channel": "quotes", "symbols": ["TSLA"] }
]
}
```
The server responds with an `unsubscribed` acknowledgment in the same envelope format.
## Close codes
| Code | Meaning |
| ------ | --------------------------------------------------------------------------------------------- |
| `4401` | No API key provided or key could not be resolved |
| `4403` | API key is valid but the account is not entitled or the key is missing the `ws:connect` scope |
| `4409` | Connection evicted — a new connection was opened for this account and replaced this one |
## Reconnection
WebSocket connections can drop due to network interruptions, server restarts, or idle timeouts. Implement reconnection with exponential backoff in your client, and re-subscribe to all channels after each successful reconnect.
A basic backoff strategy:
* Start with a 1-second delay after the first disconnect
* Double the delay on each failed reconnect attempt
* Cap the delay at 60 seconds
* Reset the delay counter after a successful reconnect
Do not reconnect immediately in a tight loop. Rapid reconnection attempts can exhaust your connection budget and delay recovery. Always use backoff.
## Complete examples
The examples below show a full connect → subscribe → receive loop. Replace `YOUR_API_KEY` with your actual key.
```python Python theme={null}
import asyncio
import json
import websockets
API_KEY = "YOUR_API_KEY"
WS_URL = "wss://app.stratalerts.com/ws/market/v1"
async def connect_stratalerts():
headers = {"Authorization": f"Bearer {API_KEY}"}
async with websockets.connect(WS_URL, additional_headers=headers) as ws:
# Subscribe to quotes for two symbols and all in-force alerts
await ws.send(json.dumps({
"op": "subscribe",
"topics": [
{"channel": "quotes", "symbols": ["AAPL", "SPY"]},
{"channel": "alerts.in_force"},
]
}))
# Receive messages until the connection closes
async for raw in ws:
message = json.loads(raw)
event_type = message.get("type")
data = message.get("data", {})
if event_type == "subscribed":
print(f"Subscribed to: {data.get('channels')}")
elif event_type == "quote":
print(f"Quote {data['symbol']} ${data['price']} vol {data['volume']}")
elif event_type == "alert.in_force":
print(f"Alert {data}")
async def main():
backoff = 1
while True:
try:
await connect_stratalerts()
backoff = 1 # reset on clean disconnect
except websockets.ConnectionClosedError as exc:
if exc.code == 4409:
print("Connection evicted by a newer session — not reconnecting.")
break
print(f"Disconnected (code={exc.code}), retrying in {backoff}s...")
await asyncio.sleep(backoff)
backoff = min(backoff * 2, 60)
except Exception as exc:
print(f"Error: {exc}, retrying in {backoff}s...")
await asyncio.sleep(backoff)
backoff = min(backoff * 2, 60)
asyncio.run(main())
```
```javascript JavaScript theme={null}
const WebSocket = require("ws");
const API_KEY = "YOUR_API_KEY";
const WS_URL = "wss://app.stratalerts.com/ws/market/v1";
function connect() {
const ws = new WebSocket(WS_URL, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
ws.on("open", () => {
// Subscribe to quotes for two symbols and all in-force alerts
ws.send(JSON.stringify({
op: "subscribe",
topics: [
{ channel: "quotes", symbols: ["AAPL", "SPY"] },
{ channel: "alerts.in_force" },
],
}));
});
ws.on("message", (raw) => {
const message = JSON.parse(raw);
const { type, data } = message;
if (type === "subscribed") {
console.log("Subscribed to:", data.channels);
} else if (type === "quote") {
console.log(`Quote ${data.symbol} $${data.price} vol ${data.volume}`);
} else if (type === "alert.in_force") {
console.log("Alert", data);
}
});
ws.on("close", (code) => {
if (code === 4409) {
console.log("Connection evicted by a newer session — not reconnecting.");
return;
}
console.log(`Disconnected (code=${code}), reconnecting with backoff...`);
reconnectWithBackoff();
});
ws.on("error", (err) => {
console.error("WebSocket error:", err.message);
});
return ws;
}
let backoff = 1000;
function reconnectWithBackoff() {
setTimeout(() => {
connect();
backoff = Math.min(backoff * 2, 60000);
}, backoff);
}
// Reset backoff on successful open
const ws = connect();
ws.on("open", () => { backoff = 1000; });
```
## Related
Full reference for all four channels: required scopes, symbol subscriptions, and example event payloads.
How to obtain an API key, understand scopes, and pass credentials in requests.
# Earnings and News
Source: https://docs.stratalerts.com/context/earnings
See upcoming earnings dates filtered by report window and importance, and monitor live macro headlines from FinancialJuice without leaving the scanner.
## Manage Event Risk and Catalysts
Catalysts and scheduled events don't have to surprise you. The Earnings page puts the upcoming earnings calendar and a live macro news feed side by side in the same environment where you scan for setups — so you can plan around reporting dates before they're relevant and stay informed on market-moving headlines without switching tools.
## Earnings calendar
The earnings calendar shows upcoming earnings report dates for stocks in the StratAlerts universe. Each event tells you the symbol, company name, the report date, and when during the trading day the announcement is expected.
### Report windows
Earnings reports fall into two primary windows:
The company reports before the regular session opens. The first candle of the day may gap significantly based on the results. Any setup you hold into the open carries earnings risk if the symbol has a BMO report that morning.
The company reports after the regular session closes. If you hold an overnight position in a symbol reporting AMC, you are exposed to a gap at the next open. Check the calendar before carrying any swing setup overnight.
### Importance tiers
Each earnings event is assigned an importance level that reflects the likely market impact of the report. Higher-importance events — from major index components or market-moving companies — surface at the top when you filter by importance. Use importance tiers to prioritize which upcoming dates need attention and which are less likely to affect your scanning universe meaningfully.
Importance ratings are sourced from the earnings data provider and reflect a general assessment of each company's potential market impact. They are not a signal to trade or avoid a symbol — they are a flag to prompt further review of your exposure.
### Filtering the calendar
Use the filter controls at the top of the calendar to narrow the view:
Filter by **Before Market Open**, **After Market Close**, or both to focus on the timing that is most relevant to your current positions or planned setups.
Filter by importance tier to surface the highest-impact reporting dates first. If you are managing a large number of positions, starting with the highest-importance events helps you prioritize risk review.
Scan the filtered list for any symbols that match setups you are currently watching or holding. An upcoming earnings date in the next one to three sessions is a reason to reduce size, avoid the setup entirely, or plan an explicit exit before the event.
## Practical use: avoiding earnings risk
Check the calendar for any earnings events within the next two to three trading days for the symbol you are considering. A clean setup with no upcoming earnings carries less binary risk than the same setup with an AMC report the following day.
Search the calendar for any AMC reports on symbols you currently hold. If a name you are long has an earnings report after the close, you need to decide whether to exit before the close or accept the overnight gap risk.
High-importance earnings reports from sector leaders can drive sympathy moves in related names. If XOM (a major XLE component) reports strong results BMO, the energy sector may see elevated 2U breadth at the open. Use the calendar alongside the Sectors page to anticipate where sector-level momentum may concentrate.
After a high-importance report, the underlying symbol often forms a clean candle structure on the daily as it absorbs the news. Watch the setups table for post-earnings names showing actionable Strat scenarios — particularly 1-2U scenarios forming out of the gap candle.
You can click any symbol in the earnings calendar — both on the standalone page and in the [Mission Control](/scanner/mission-control) Earnings Calendar panel — to open the [Setups Table](/scanner/setups-table) filtered to that ticker across all timeframes, making it easy to check the current setup landscape before or after an earnings event.
## FinancialJuice news feed
The FinancialJuice news feed runs alongside the earnings calendar and delivers live macro headlines directly in the platform. Headlines include central bank commentary, economic data releases, geopolitical events, and other market-moving news as it breaks.
### Why it's here
Strat setups don't exist in a vacuum. A technically clean 1-2U on SPY means less if a Fed speaker is about to take the podium, and a sector breakout is easier to trust when the macro backdrop is quiet. Having the news feed in the same window as your setup data means you can make that judgment call without toggling between applications.
### How to use the news feed
Review the feed before the open to assess the macro backdrop for the session. Overnight headlines, economic data releases scheduled for the morning, and any pre-market surprises all set the tone for how breadth is likely to behave at the open.
Watch for unexpected headlines while you are in a setup. A breaking headline about a sector — an oil supply disruption, a bank earnings miss, a regulatory action — can invalidate or accelerate a trade that was clean five minutes earlier.
Major scheduled releases (CPI, FOMC decisions, jobs reports) create known volatility windows. You can see these events on the feed as they hit and correlate them directly with what breadth does in the daily chart at that same moment.
The FinancialJuice feed is a live news stream, not curated trade signals. Headlines should inform your context, not replace your technical analysis. A news item on its own is not a reason to enter or exit a setup — it is additional data that either supports or complicates what the candle structure is already telling you.
# Market Breadth
Source: https://docs.stratalerts.com/context/market-breadth
Monitor real-time breadth across all scanner symbols to confirm whether the broader market supports your trade direction before you enter a setup.
The Market Breadth page requires the **Founders Plan**. Basic plan subscribers do not have access to breadth dashboards. [Compare plans →](/pricing)
## Confirm the Directional Environment
Market breadth tells you how many symbols in the scanner are participating in a move — not just whether a single index is up or down. The Market Breadth page gives you four complementary views of directional participation: a live intraday chart showing how breadth evolves through the session, a current snapshot of all symbols' candle states, a matrix of the major indices and futures, and a timeframe-by-timeframe breakdown of bullish and bearish counts across the full universe. Together, these surfaces answer one core question before you enter any trade: is the market moving with you or against you?
## The principle behind breadth
In The Strat, the guiding principle is to trade in the direction of the most 2s, and 2s going 3. Breadth operationalizes that principle at a market level. When the majority of symbols are showing 2U on the daily timeframe, the environment favors long setups. When 2Ds dominate, the environment favors short setups. When the market is flooded with 1s, most symbols are compressing — the tape is coiling and waiting for a catalyst to define direction.
Breadth is calculated across the active universe of scanner symbols. It excludes futures (which have their own matrix panel) and filters by market so that equity breadth and crypto breadth are tracked independently.
## Daily breadth chart
The daily breadth chart plots the intraday distribution of candle states — 1, 2U, 2D, and 3 — as the trading session progresses. Each data point represents a snapshot of the full universe at that moment in time, updated continuously.
Use this chart to track how breadth evolves through the session:
* **Expanding 2U count** — Bullish participation is broadening. More symbols are breaking to the upside as the session develops.
* **Expanding 2D count** — Bearish participation is broadening. The sell-side move is gaining width.
* **Contracting to 1s** — The market is compressing. Many symbols that were moving have pulled back inside their parent candles, signaling reduced conviction.
* **Rising 3 count** — Increased volatility and indecision. Outside candles are appearing across the universe, often ahead of a directional resolution.
Watch the 2U and 2D lines at the open. A session that opens with rapidly expanding 2U breadth and holds it into mid-morning is a strong environment for long setups. A session where 2U count peaks early and starts fading back toward 1s warrants more caution on new entries.
## Current candle snapshot
The current candle snapshot is a grid showing every symbol in the scanner universe alongside its live candle state. You can see at a glance how the full universe is distributed right now — without having to open individual charts.
This panel is most useful when you want to:
* Confirm that the market-wide 2U count in the chart is not concentrated in just a handful of names
* Identify which symbols have already made their daily move (2U or 2D) versus which are still inside (1)
* Spot clusters of 3 candles that could indicate recent range expansions across multiple symbols
## Indices matrix
The indices matrix shows the candle state of the four major U.S. equity indices and key futures contracts across five timeframes: Daily, Weekly, Monthly, Quarterly, and Yearly.
**Tracked instruments:**
SPY (S\&P 500), QQQ (Nasdaq 100), DIA (Dow Jones), IWM (Russell 2000)
Key futures contracts tracked across D/W/M/Q/Y timeframes
Read the matrix left to right. If SPY, QQQ, DIA, and IWM are all showing 2U on the Daily and Weekly timeframes, the index-level TFC is aligned bullish, and the environment strongly supports long setups. Divergence between indices — for example, QQQ showing 2U while IWM shows 2D on the weekly — signals a less clean environment where selective filtering matters more.
Do not use the indices matrix as a standalone entry signal. Use it as a filter. Even when SPY is in weekly 2U, individual setups still need their own candle confirmation and timeframe continuity. The matrix tells you the backdrop — your setup is still responsible for its own trigger.
## Market breadth panel
The market breadth panel breaks down the current breadth count by timeframe. For each timeframe — Daily, Weekly, Monthly, Quarterly, and Yearly — it shows how many symbols are bullish (2U or breaking higher), bearish (2D or breaking lower), or inside (1).
When the Daily and Weekly timeframes both show 2U counts significantly higher than 2D counts, the market has directional continuity on two timeframes. Long setups triggered on the daily with weekly alignment have the highest probability environment behind them.
When 2D counts dominate on multiple timeframes, short setups have the broadest participation. A daily 2D setup in a name that is also showing weekly and monthly 2D breadth dominance has sector and market-level confirmation.
When 1 counts are high across the Daily and Weekly timeframes, the market is consolidating. This is often the environment just before a significant directional move. Setups are fewer, and selectivity matters more — wait for breadth to tilt before committing.
## Reading breadth before a trade
Use the following workflow to incorporate breadth context into your trading decisions:
Open the Market Breadth page and look at the indices matrix. Confirm the direction of SPY, QQQ, DIA, and IWM on the daily and weekly timeframes. This establishes the macro backdrop.
In the market breadth panel, check the daily and weekly counts. Confirm that the 2U count exceeds the 2D count on both timeframes if you are looking for long setups — or vice versa for short setups.
Look at the intraday breadth chart. Make sure the 2U count is holding or expanding, not fading. A setup taken when breadth is contracting carries more risk than one taken when breadth is still broadening.
If the index matrix, breadth panel, and daily chart all align with your trade direction, you have market-level context confirming the setup. If they conflict, size down or wait for the environment to resolve.
# Sector Breadth
Source: https://docs.stratalerts.com/context/sectors
See candle-state breadth across all 11 SPDR sectors, then drill into every ticker's D/W/M/Q/Y TFC alignment to scan where conditions favor your setups.
The Sectors page requires the **Founders Plan**. Basic plan subscribers do not have access to sector breadth or the sector drill-down modals. [Compare plans →](/pricing)
## Spot Leaders and Laggards Instantly
The Sectors page maps the entire market into the 11 SPDR sector ETFs and shows you, in real time, how many symbols inside each sector are in each candle state. Rather than scrolling through hundreds of individual charts, you get a single view that tells you which sectors have bullish participation, which are compressing, and which are leaning bearish — so you can concentrate your scanning where the wind is at your back.
## How breadth is counted
Each sector card displays a live breakdown of the symbols it contains, bucketed into four candle states:
| State | Meaning |
| ------ | ---------------------------------------------------------------------------------- |
| **1** | Inside candle — the symbol is compressing between its parent candle's high and low |
| **2U** | Bullish candle — the symbol has broken above its parent candle's high |
| **2D** | Bearish candle — the symbol has broken below its parent candle's low |
| **3** | Outside candle — the symbol has broken both sides of its parent candle |
A sector card that shows a high 2U count and few 2Ds signals broad bullish participation. A card dominated by 1s tells you the sector is coiling and has not picked a direction yet.
Breadth counts refresh continuously throughout the session. The numbers you see reflect the current state of all active symbols in that sector — not a snapshot from the open.
## The 11 SPDR sectors
Basic materials companies including chemicals, metals, and mining.
Media, telecom, and internet platform companies.
Oil, gas, and energy equipment companies.
Banks, insurance, asset managers, and financial services.
Aerospace, defense, machinery, and transportation companies.
Semiconductors, software, and hardware companies.
Food, beverages, household products, and retail staples.
REITs and real estate management companies.
Electric, gas, and water utility companies.
Pharmaceuticals, biotech, medical devices, and managed care.
Autos, retail, hotels, restaurants, and leisure companies.
## Drilling into a sector
Clicking any sector card opens a modal that lists every ticker assigned to that sector. Each symbol shows its candle state across all five higher timeframes — Daily, Weekly, Monthly, Quarterly, and Yearly — giving you a full TFC (Timeframe Continuity) snapshot without opening a single chart.
Scan the sector cards on the page. Look for the sector with the highest 2U count relative to its total symbols. That sector has the broadest bullish participation at the daily timeframe.
Click the sector card to open the drill-down modal. You will see every ticker in the sector displayed in a grid with its D, W, M, Q, and Y candle states.
Look for symbols where multiple timeframes show 2U. A symbol showing 2U across D/W/M is exhibiting strong upside continuity and is a candidate for further review in the setups table.
Click **Browse Setups** at the top of the Sectors page to jump straight to the [Setups Table](/scanner/setups-table). From there, filter by sector or add your highest-conviction names to a watchlist to monitor throughout the session.
The **Browse Setups** button at the top of the Sectors page takes you directly to the Setups Table, so you can move from sector-level breadth analysis into individual setup scanning in one click.
## Practical use cases
Before entering any long setup, check that the symbol's sector is showing more 2Us than 2Ds. A stock breaking out of a 1-2U on the daily has a higher probability of following through when most of its sector peers are also in 2U — the broader move is already underway.
If a sector's card shows a majority of 2Ds and a bearish higher-timeframe TFC on the sector ETF itself, long setups in that sector carry additional headwind. Identify these sectors early and deprioritize them for long-side scanning.
Watch for sectors that shift rapidly from a high 1-count (compression) to a high 2U-count during the session. A sector breaking out of a broad compression phase can produce multiple tradeable setups within a short window.
Every sector card also reflects the candle state of the ETF (for example, XLE for Energy). Before trading names within the sector, confirm that XLE itself is in 2U on the timeframe you are trading. The ETF candle is the most direct read on sector-level TFC.
After identifying a strong sector, open its modal and look for symbols that show 2U on the Weekly and Monthly timeframes in addition to the Daily. Those names have continuity across all three timeframes and are the highest-conviction candidates in that sector's current move.
# Watchlists
Source: https://docs.stratalerts.com/context/watchlists
Create named watchlists to organize high-conviction symbols, build dynamic rule-based lists that refresh after the close, view multi-timeframe charts alongside setup data, and reorder your list with drag-and-drop or keyboard shortcuts.
Watchlists require an active **Basic** or **Founders Plan** subscription. [Compare plans →](/pricing)
## Organize and track your high-conviction setups
Not every symbol in the scanner demands equal attention. Watchlists let you cut the universe down to the names you have already decided are worth watching, organized however makes sense for your workflow. You can keep separate lists for different strategies, asset classes, or conviction levels — and every list comes paired with chart context so you're never looking at a symbol's data without knowing what the chart looks like.
## Creating a watchlist
Press **W** on your keyboard or navigate to **Watchlists** in the sidebar. The page opens to your saved lists, with the default **Favorites** list loaded first.
Click **New Watchlist** and enter a name. Names can be anything that fits your workflow — for example, "Tech Leaders", "Futures", "Swing Candidates", or "Earnings Watch".
Type a symbol into the watchlist input field and press **Enter** to add it. StratAlerts validates each entry against the active scanner universe and resolves futures aliases automatically (for example, entering `ES` resolves to `ES=F`).
Create as many lists as you need. You can maintain separate watchlists for different strategies — intraday and swing setups, for instance — without them interfering with each other.
Watchlist names are limited to 64 characters. Each account can hold multiple watchlists, and a symbol can appear in more than one list at the same time.
## The Favorites list
Every account has a default watchlist called **Favorites**. This list is special because it connects directly to the setups table: symbols you mark as favorites appear with a distinct indicator in the setups feed, and you can filter the entire setups table to show only your favorited names with a single click.
Use Favorites for your most active, highest-conviction symbols — the names you check first every session. Use your other watchlists for longer-term tracking or thematic groupings that don't need to surface in the setups table immediately.
You cannot delete the Favorites list while it is the only list in your account. To remove it, first create another watchlist and then delete Favorites — the next list in alphabetical order becomes the default automatically.
## Dynamic watchlists
Dynamic watchlists are rule-based lists that automatically populate with symbols matching your filter criteria. Instead of manually adding tickers one by one, you define a set of conditions — such as a base timeframe setup, candle-state filter, or multi-timeframe in-force confirmation — and the list fills itself with every symbol that qualifies. Setup filters support multi-select, so you can target several setup patterns at once without creating separate lists for each one.
### Creating a dynamic watchlist
From the Watchlists page, click **New Watchlist** and choose the **Dynamic** list type. Give the list a name that reflects its purpose — for example, "Daily Inside Bars" or "Weekly 2U In-Force."
Use the curated filter controls to set your criteria. Available filters include:
* **Base timeframe setup** — select one or more setup sequences on a specific timeframe (e.g., daily `1-1`, `2-1`, weekly `2D-3`). The setup filter is multi-select — check every pattern you want to include and matching symbols that have **any** of your selected setups will qualify.
* **Candle-state filters** — narrow by candle color, shape (hammer, shooter), continuity count, or near-extreme proximity on the base timeframe.
* **Multi-timeframe in-force confirmation** — add up to two additional confirmation steps, each with their own timeframe, setup, in-force, and shape filters. Setup filters on confirmation steps are also multi-select.
The setup filter displays a summary label showing the number of selected patterns — for example, **3 selected** — so you can see at a glance how broad or narrow your setup criteria are. All other filters use single-select dropdowns. Any filter you leave unset displays as **—**, making it clear which conditions are active and which are not.
Within a single step, multiple setup selections use **OR** logic — a symbol qualifies if it matches any of the selected setups. Across steps, filters combine with **AND** logic — a symbol must pass the base filter **and** every confirmation step to appear in the list.
Save the list. It immediately populates with every symbol in the scanner universe that meets your filter criteria as of the last end-of-day data refresh.
### How dynamic watchlists refresh
Dynamic watchlists update their membership based on end-of-day data. After the market close, the list re-evaluates its filter rules against the latest daily candle data and adds or removes symbols accordingly. You can also trigger a manual refresh on demand from the watchlist page if you want to re-run the filters before waiting for the next automatic refresh.
Dynamic watchlists evaluate against end-of-day data, not intraday prices. Symbols enter or leave the list based on the completed daily candle, not on mid-session price action.
### When to use dynamic watchlists
Dynamic watchlists are useful when you want a list that stays current without daily maintenance:
Build a dynamic list for your preferred setup pattern — for example, daily inside bars with weekly TFC alignment — and review it each morning. The list updates itself overnight so you always start the session with a fresh set of candidates.
Use the in-force confirmation filters to find symbols where setups are active across multiple timeframes simultaneously. Combine multi-select setup filters with confirmation steps to screen for broad pattern families — for example, any daily reversal (`2-1`, `3-1`) with weekly in-force — without creating a separate list for each setup.
Dynamic watchlists appear alongside your static lists in every [Mission Control](/scanner/mission-control) watchlist filter — including the setups card, alerts card, and ticker matrix. Select a dynamic watchlist as a filter source and Mission Control scopes its panels to that list's current membership, so your rule-based symbol set drives your live dashboard without any extra configuration.
You can use both static and dynamic watchlists side by side. Keep a manual Favorites list for names you are tracking regardless of setup state, and create dynamic lists that surface new candidates each day based on your rules.
## Viewing symbols in your watchlist
Each symbol in your watchlist is displayed with its current setup data alongside a chart, so you can assess both the technical picture and the Strat state without navigating to a separate page.
When you select a different ticker — whether by clicking, using arrow keys, or navigating with the browser back/forward buttons — the right-side detail panel updates in place. The left ticker list stays stable and your scroll position is preserved, so you can move quickly through your list without the page reloading.
### Multi-timeframe chart viewing
When you open a symbol inside a watchlist, you can flip between timeframes directly from the chart controls. Charts default to the daily timeframe on page load, but your selected timeframe is preserved as you move between tickers within the same session. If you switch to a 4-hour view, that view stays active as you navigate to other symbols — it only resets to daily when you reload the page.
When you click a setup row in the setup table, the chart automatically switches to that setup's timeframe. For example, clicking a weekly setup row loads the weekly chart for that symbol. This lets you jump directly to the timeframe that matters for the setup you're evaluating, without manually switching chart controls.
Each watchlist entry shows the symbol's candle state, TFC alignment, and setup flags alongside the chart — so the data and the chart are always in the same view.
Flip between Daily, Weekly, Monthly, Quarterly, and Yearly candles directly in the chart view. Your selected timeframe carries over as you navigate between tickers. Clicking a setup row overrides this with the setup's own timeframe.
### Multichart view
Below the primary chart, the detail panel displays a six-chart grid that shows the selected symbol across six timeframes at once: **15-minute**, **30-minute**, **60-minute**, **4-hour**, **Daily**, and **Weekly**. Each mini chart renders as a candlestick chart with a compact timeframe badge in the corner so you can identify the timeframe at a glance.
The multichart grid updates in real time. When new price data arrives through the live feed, each affected mini chart refreshes automatically — you do not need to reload the page or manually cycle timeframes to keep the grid current.
This view lets you assess the full Strat picture for a symbol without leaving the watchlist or clicking through individual timeframe tabs. You can see whether a daily inside bar is forming while a weekly continuation is in play, all from one screen.
The multichart view is available for stock and ETF symbols. Futures symbols display the primary chart only.
### News panel
The watchlist detail panel includes a news section that displays recent headlines for the selected symbol. When you click a ticker in your list, the news panel loads the latest headlines and summaries so you can check for catalysts or events alongside the chart and setup data.
Each headline includes a timestamp and a link to the full article. Up to ten recent headlines are shown at a time. The news panel updates automatically when you switch between symbols — select a new ticker and the headlines refresh to match.
Use the news panel to quickly check whether a symbol's price action is being driven by a specific catalyst before acting on a setup signal. Pairing headline context with Strat data helps you avoid trading into news-driven moves that may not follow the usual pattern behavior.
### Desktop workspace layout
The watchlist page uses a full-width layout to give the detail panel as much room as possible. On wider screens, the detail panel arranges your setup table, primary chart, multichart grid, and news headlines into a multi-column workspace:
* **Below 1500px** — All panels stack vertically: setup table, primary chart, multichart grid, then news.
* **1500px and wider** — The setup table and primary chart appear in a left column, with the six-chart multichart grid in a right column. News headlines span the full width below both columns.
* **1920px and wider** — The news panel moves into its own third column on the right, so all three content areas — charts, setup data, and news — are visible side by side without scrolling.
## Organizing symbols within a list
### Sections
You can divide a watchlist into named sections to group symbols by theme, strategy, or priority. Click **Add Section** to open the section modal — type a name and press **Enter** to confirm. The name field is focused automatically, so you can start typing immediately.
Sections appear as collapsible labeled dividers within the list. Click a section header to collapse or expand it. You can move symbols between sections by dragging them.
### Managing sections
Right-click any section header to open the context menu with these options:
* **Rename** — Edit the section name in place without a page reload.
* **Delete Section Only** — Remove the section header and move its symbols to the top-level list.
* **Delete Section + Tickers** — Remove the section and all the symbols it contains.
When you delete a section, an undo toast appears at the bottom of the screen for 10 seconds. Click **Undo** to restore the section and its symbols.
Symbols that are not assigned to any section appear at the top of the list without a section header. You do not need to create sections to use watchlists — sections are optional organization on top of the flat list.
### Drag reordering
Symbols within a watchlist can be manually reordered by dragging. Grab a symbol row and move it up or down — a visible horizontal insertion marker shows exactly where the symbol will land when you drop it. You can drag symbols between sections or into empty sections at the bottom of the list. Newly created sections are immediately available as drop targets without needing a page reload.
### Keyboard navigation
Navigate between symbols using **Arrow Up** and **Arrow Down** on your keyboard. Pressing either key moves the selection to the adjacent symbol and loads its chart and setup data immediately — no click required. This works from anywhere on the watchlist page without needing to click into the list panel first. You can navigate rapidly without the detail panel flickering back to a previous symbol — stale responses from earlier selections are automatically discarded.
Combine keyboard navigation with the multi-timeframe chart controls: press Arrow Down to cycle through your list, then flip timeframes on each symbol to walk the entire stack in seconds.
## Managing watchlist membership
You can add or remove a symbol from any watchlist from multiple places in the platform:
* **From the watchlist page** — Type a symbol and press **Enter** to add it, or click the remove button next to any existing entry.
* **From the setups table** — Click the watchlist icon next to any symbol to open the membership picker and toggle the lists it belongs to.
* **From a symbol detail view** — The watchlist membership panel shows which lists the symbol is in and lets you update them without leaving the detail view.
When a symbol is in your Favorites list, it is marked as a **favorite** across the platform. That flag appears in the setups table and can be used as a filter condition.
## Cloning and renaming lists
If you want to create a variation of an existing list — for example, you have a "Tech Leaders" watchlist and want a focused subset for earnings week — you can clone the list and rename the copy rather than rebuilding it from scratch.
Click the list name or the rename action in the watchlist menu. Enter the new name and confirm. Renaming does not affect the symbols in the list or any filter states in the setups table that reference the list.
Use the clone option in the watchlist menu to duplicate the list with all its symbols. The cloned list is named with a "Copy" suffix by default — rename it immediately to keep your workspace organized.
Open the watchlist menu and select delete. If you delete the default watchlist, the next alphabetical list becomes the default. You cannot delete your last remaining watchlist — create a replacement first.
## Using watchlists on mobile
Watchlists are fully supported on mobile. You can browse your saved symbols, review setup data, and check chart context from any device. This makes watchlists the right place to store the names you want to monitor when you are away from your primary workspace.
Open your watchlist on mobile to check candle states and setup flags for every symbol in your list, without needing to be at your desk.
Symbols in your watchlist that trigger setup alerts will reach you through Pushover or Telegram — so mobile watchlist review and push notifications work together as your away-from-desk workflow.
## Keyboard shortcut
Press **W** from anywhere in the platform to jump directly to the Watchlists page.
# Scanner for Strat Traders
Source: https://docs.stratalerts.com/introduction
StratAlerts scans stocks, futures, and crypto using The Strat — detecting setups with TFC context, firing live alerts, and delivering them to your phone.
StratAlerts is a real-time market scanner built around **The Strat** methodology by [Rob Smith](https://x.com/RobInTheBlack) (RIP, king). It continuously monitors stocks across the S\&P 500 and Nasdaq 100, major futures contracts, and crypto pairs — detecting actionable setups as they develop, framing them with Timeframe Continuity context, and delivering live alerts to your browser or mobile device. The goal is to keep you focused on what is triggering right now rather than manually scanning dozens of charts and guessing at market conditions.
## The Strat in brief
The Strat is a rule-based trading methodology built on universal candle scenarios. Every candle on every timeframe receives one of four state IDs:
* **1** — Inside bar. The candle's high and low are contained within the prior candle's range.
* **2U** — Bullish outside. The candle breaks above the prior candle's high.
* **2D** — Bearish outside. The candle breaks below the prior candle's low.
* **3** — Outside bar. The candle breaks both the prior high and the prior low.
Setups are expressed as three-candle sequences written as **target candle → trigger candle → current candle**, for example, **2-1-2U** or **3-2-2D**. The trigger candle defines the level you are watching, and the current candle indicates whether it has been broken.
**Timeframe Continuity (TFC)** describes how aligned multiple timeframes are in the same direction. When the monthly, weekly, daily, and intraday candles are all printing 2U states, the environment is fully bullish, and setups in that direction carry higher conviction. StratAlerts automatically calculates and surfaces the TFC context for every instrument tracked.
## Key features
Your primary dashboard. Mission Control combines the real-time alerts stream, simultaneous breaks panel, setups feed, and market breadth data in one command center.
A filterable, sortable grid of every active setup across your scanned universe. View TFC state, candle IDs, in-force flags, PMGs, and setup shape all in one surface.
Catch coordinated moves when multiple instruments break the same level at the same time. Simultaneous breaks often signal that a move is broadening beyond a single symbol.
See live alerts the moment they trigger, complete with timeframe and setup context. Every alert links directly to the relevant instrument view.
Receive setup and simultaneous break alerts on your phone through Pushover or Telegram, even when you are away from the desk.
Monitor SPDR sector breadth from XLB through XLY and drill into every ticker's daily, weekly, monthly, quarterly, and yearly candle state in one compact view.
Organize high-conviction names into custom lists with multi-timeframe chart context always one click away.
Read directional participation by timeframe so you know whether conditions are broad or narrow before sizing into a trade.
Keep the earnings calendar alongside your setups feed. Filter by reporting window and importance so high-impact dates surface before the setup is already in motion.
Pre-compiled JSON market bundles are refreshed every five minutes, ready to feed directly into GPT, Claude, and other AI workflows.
Build automated strategies that execute on setup outcomes. Route through the internal paper engine, Alpaca for stocks, or TopstepX, Tradovate, or Rithmic for futures — with bracket orders, trailing stops, and real-time position sync.
Pause automated entries globally or per market, set safety breakers for daily loss and order rate, and let paused markets auto-resume at the next session open.
Low-latency REST endpoints and WebSocket streams for building custom integrations, execution systems, or your own front-end dashboards.
## Multi-asset coverage
StratAlerts scans across three asset classes simultaneously:
* **Stocks** — S\&P 500 and Nasdaq 100 components
* **Futures** — Major equity index, commodity, and currency futures contracts
* **Crypto** — Leading cryptocurrency pairs
All instruments are processed through the same setup detection engine, so you can monitor and compare signals across asset classes in a single session.
## Getting help
Click the **?** button in the desktop navbar — between the universe picker and theme toggle — for quick access to **What's New**, **Help**, **Documentation**, and **Feedback**. You can also press **?** on your keyboard to open the shortcuts modal.
## Keyboard shortcuts
The most-used shortcuts:
| Key | Destination |
| ----- | ------------------- |
| **/** | Quick Search |
| **M** | Mission Control |
| **S** | Setups Table |
| **A** | Alerts |
| **B** | Simultaneous Breaks |
| **W** | Watchlists |
| **Q** | AI Search |
## Mobile support
The core workflow is usable on a mobile screen. You can check active setups, review watchlists, monitor the alerts stream, and track the earnings calendar from your phone. Push notifications through Pushover and Telegram extend that reach further — alerts reach you even when the app is not open.
StratAlerts is a scanner with built-in strategy execution. It surfaces signals and context, and the Strategy Builder lets you run strategies through the internal paper engine or route orders through connected broker accounts (Alpaca for stocks; TopstepX, Tradovate, or Rithmic for futures). Execution guardrails provide safety controls to manage risk across all accounts.
# Discord
Source: https://docs.stratalerts.com/notifications/discord
Connect a Discord account to StratAlerts to use slash commands for watchlists, gappers, movers, earnings, and snooze controls — and let staff watch tickers and dispatch setup alerts from any guild channel.
The StratAlerts Discord integration brings scanner data into your guild as slash commands. Once you link a Discord account from your profile, you can pull watchlists, gappers, movers, and the upcoming economic calendar without leaving Discord — and the same `/snooze` controls available on the web and Telegram are available from any channel where the bot is installed.
## Linking your Discord account
From the StratAlerts sidebar, open **My Profile**. The profile page exposes connection cards for Pushover, Telegram, and Discord.
Click **Connect Discord** to start the OAuth handshake. Discord prompts you to authorize the StratAlerts bot for the requested scopes. Approve to return to the profile page with the link confirmed.
The Discord card on My Profile updates to show your connected Discord username. From this point on, slash commands run from any guild that has the StratAlerts bot installed will recognize you as a linked user.
## Slash commands for linked users
The following slash commands are available to any linked user in a guild where the StratAlerts bot is installed.
Returns a compact Markdown card listing your StratAlerts watchlists. Selecting a watchlist from the picker renders a monospace ticker table for easy scanning. You can also add tickers to an existing watchlist through an ephemeral picker and modal flow without leaving Discord.
Returns separate green and red embed cards for the top gap-up and gap-down equities. The data comes from the same Mission Control [Top Gappers](/scanner/gappers) panel feed, with a default top-10 rows per side.
Returns separate green and red embed cards for top gainers and decliners. Defaults to **stocks**, with an optional `market` argument that accepts `stocks`, `crypto`, or `futures`. Gainers and decliners are filtered by sign before rendering, so positive movers never appear in the red decliners card.
```text theme={null}
/movers
/movers market:crypto
```
Returns a neutral embed card with this week's earnings calendar. Without a ticker, it defaults to `importance >= 5`. With a ticker argument, it filters the week to that symbol.
```text theme={null}
/earnings
/earnings ticker:NVDA
```
The card folds **BMO** and **AMC** indicators into the date column to keep tables readable.
Mirrors the Telegram and web snooze controls. Choose a duration (`15m`, `4h`, `forever`, or `resume`) and optionally restrict the snooze to specific scopes — `setups`, `metrics`, or `simbreaks`.
```text theme={null}
/snooze duration:15m
/snooze duration:4h scope:metrics
/snooze duration:resume
```
Snoozes pause push delivery without changing your saved alert groups, and `resume` clears the snooze immediately.
Returns an ephemeral list of available bot commands, arguments, and short descriptions. Use it as an in-Discord cheat sheet for the rest of the slash command surface.
## Setup alert embeds
When a setup-alert delivery is configured for a guild channel, embeds use a compact format optimized for Discord:
* The setup notation, direction, and timeframe appear in the title — the timeframe is wrapped in square brackets and separated by a bullet.
* The body leads with the last price and the trigger time.
* The footer renders timeframe-first **TFC** chips without a `TFC` label.
* High-priority **FinancialJuice** news embeds use a red accent color, omit the duplicate top label, and keep headline text unlinked.
Trigger-time TFC snapshots prefer live current colors over stale persisted state, so the chip colors match what you see on the chart at the moment of the alert.
## Staff-only commands
The following commands are restricted to staff. They expose operator-grade visibility into the scanner pipeline directly from Discord.
| Command | Description |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **/news** | Latest headline cards from the FinancialJuice and operator news streams. |
| **/simbreaks** | Recent simultaneous-break events from the index futures detector. |
| **/calendar** | Upcoming USD economic events through the end of the current week, with the impact column included. |
| **/alerts\_status** | Current alert pipeline health, including stream cursors and worker heartbeat ages. Stale labels are suppressed during quiet off-hours. |
| **/alerts\_replay** | Replay recent alert deliveries for a given symbol, timeframe, or window. |
| **/discord\_health** | Integration health for the Discord bot itself — guild count, command sync state, and last interaction. |
| **/user\_link** | Inspects a linked user's Stripe subscription status, broader app access, and beta-tester flag. |
| **/setups ticker:\** | Public embed card with the ticker's active setup rows across timeframes, sorted by timeframe and paired with a compact TFC summary. The card uses a narrower table that drops C2 and continuation columns to reduce wrapping. |
| **/watch ticker:\** | Toggles a channel-level realtime setup-alert watch on the symbol. Accepts a single ticker, CSV tickers, or `off` to clear the watch. Matching alerts are delivered back to the channel where the command was run. |
Table-heavy commands (`/setups`, `/news`, `/simbreaks`, `/calendar`, `/earnings`, `/alerts_status`, and `/alerts_replay`) render as plain fenced text instead of embed cards, giving the output more usable width before wrapping.
## FinancialJuice bridge
Operators can run a Compose-managed bridge that streams live FinancialJuice SignalR widget headlines and forwards high-priority, breaking, urgent, or `active-critical` alerts into a configured Discord channel. The bridge persists dedupe state and exposes admin-visible delivery status so failures are debuggable without console access.
The FinancialJuice Discord bridge is an opt-in operator integration. Reach out through [Feedback](/) if you want it enabled for your guild.
## Troubleshooting
* **Commands do not appear in the guild.** Ask staff to run the guild-scoped sync — slash commands are registered per guild and require an explicit sync after the bot is added.
* **/movers shows fewer rows than expected.** Default is top 10 per side; the bot filters by sign so a market with few negative names will produce a shorter decliners card.
* **Account linking fails with a 403.** The bot sends an explicit Discord API user agent, but corporate proxies can still strip headers. Retry from a network without proxy interception.
# Pushover
Source: https://docs.stratalerts.com/notifications/pushover
Connect Pushover to StratAlerts to receive in-force and simultaneous break alerts directly on your iOS or Android device in real time.
Pushover is a paid mobile app (one-time purchase, around \$5 after a free 30-day trial) that delivers reliable, low-latency push notifications to iOS and Android. Because it operates independently of email and SMS, alerts arrive fast and with consistent priority — making it a solid choice for time-sensitive trading signals. Once you link your Pushover account to StratAlerts, in-force setup alerts and simultaneous break alerts are pushed to your device as they trigger, without you needing to have StratAlerts open.
Pro subscriptions include 250 messages/mo. Unused credits do not roll over. Additional message packs can be purchased for \$5 per 500 messages, and they never expire.
Telegram alerts are completely free and can be used instead of Pushover.
Push notifications require the **Founders Plan**. Basic plan subscribers do not have access to alert delivery through Pushover or Telegram. [Compare plans →](/pricing)
## **What you need**
* A Pushover account at [pushover.net](https://pushover.net)
* The Pushover app installed on your iOS or Android device
* An active StratAlerts Founders Plan subscription
## Setup
Sign up at [pushover.net](https://pushover.net) if you don't have an account. Then install the Pushover app from the App Store or Google Play and log in with the same credentials.
Log in to [pushover.net](https://pushover.net) on the web. Your **User Key** is displayed on the main dashboard — it's a 30-character string at the top of the page. Copy it.
In StratAlerts, open **Alerts → Settings** and paste your User Key into the **Pushover User Key** field. Save the settings. StratAlerts will send a test notification to confirm the connection.
Under **Alerts → Settings**, create or edit an alert group with the symbols, timeframes, and optionally specific setups you want to receive. If you leave the **Setup** selector on **All**, every matching setup triggers a notification. To narrow delivery, select specific setups like `1-2`, `3-2`, or `2d-green (failed)` from the dropdown.
The test notification confirms that your User Key is valid and the connection is live. If it doesn't arrive within 30 seconds, double-check that you copied the User Key from your Pushover dashboard, not an app token.
## Market selection
Each delivery method has its own market filter that controls which asset classes can trigger alerts. Under **Alerts → Settings → Pushover**, you will see checkboxes for:
* **Stocks** — equities alerts (e.g., `SPY`, `AAPL`)
* **Futures** — futures alerts (e.g., `NQ=F`, `ES=F`)
* **Crypto** — cryptocurrency alerts (e.g., `BTC-USD`)
Check the markets you want to receive on this channel and save. Only alerts for enabled markets are delivered — alerts for unchecked markets are silently filtered out.
Sim Break Alerts scan futures instruments. If you want to receive Sim Break alerts through Pushover, make sure **Futures** is enabled here.
## What alerts you receive
Once connected, Pushover delivers two types of alerts:
Triggered when a setup goes in-force — meaning price has broken the trigger level and the trade is live. Each alert includes the symbol, timeframe, setup type, and direction.
Triggered when multiple instruments break together in the same direction within a short window, signaling a potentially broader move.
## Alert message format
Each Pushover notification includes:
* **Symbol** — the ticker (e.g., `SPY`, `NQ=F`, `BTC-USD`)
* **Timeframe** — the candle timeframe that triggered (e.g., `Daily`, `Weekly`, `60m`)
* **Setup** — the candle scenario and direction (e.g., `2U`, `2D`, `1-2U`)
* **Direction** — `Up` or `Down`
A typical alert looks like:
```text example alert theme={null}
SPY — Daily — 2U — Up
In-force at 561.40
```
Tapping a setup alert opens the Setups Table with the symbol prefiltered and all timeframes visible, so you can review the full setup context immediately.
## Tips
In the Pushover app, you can configure alerts from StratAlerts to use high-priority delivery, which bypasses Do Not Disturb and quiet hours. This is useful during the regular trading session (9:30 AM – 4:00 PM ET) when you need every alert to cut through.
Open Pushover → **Settings** → **Sounds** → find the StratAlerts notification source and set it to high priority.
Pushover groups notifications by app. If you use Pushover for other services, tap the StratAlerts group on the notification screen to isolate your trading alerts from unrelated messages.
On iOS, make sure Pushover has background app refresh enabled and notifications are allowed from **Settings → Notifications → Pushover**. On Android, exclude Pushover from battery optimization to prevent the OS from delaying delivery.
## Related
Set up Telegram as an alternative or complementary notification channel.
Learn how to filter which setups and timeframes trigger push notifications.
# Telegram
Source: https://docs.stratalerts.com/notifications/telegram
Connect the StratAlerts Telegram bot to receive in-force and simultaneous break alerts as messages in a dedicated bot conversation, free on any device.
Telegram is a free messaging app available on iOS, Android, and desktop. When you connect StratAlerts to Telegram, alerts arrive as messages in a private bot conversation — giving you a persistent, scrollable alert log alongside a direct link back into the setup workflow in the app. Unlike email, Telegram notifications are instant and can be pinned to the top of your conversations for quick access during the trading session.
Push notifications require the **Founders Plan**. Basic plan subscribers do not have access to alert delivery through Pushover or Telegram. [Compare plans →](/pricing)
## What you need
* The Telegram app installed on your device ([telegram.org](https://telegram.org))
* A Telegram account
* An active StratAlerts Founders Plan subscription
## Setup
Download Telegram from the App Store or Google Play (or use the desktop or web client). Sign up with your phone number and complete verification.
Search for **@StratAlertsBot** in Telegram or open the link provided in StratAlerts under **Alerts → Settings → Telegram**. Tap **Start** to open the conversation. The bot will respond with your unique chat ID.
The bot's welcome message includes your **Chat ID**. Copy it, then paste it into the **Telegram Chat ID** field in StratAlerts under **Alerts → Settings → Telegram**. Save the settings — StratAlerts will send a test message to confirm.
Under **Alerts → Settings**, create or edit an alert group with the symbols, timeframes, and optionally specific setups you want to receive. If you leave the **Setup** selector on **All**, every matching setup triggers a notification. To narrow delivery, select specific setups like `1-2`, `3-2`, or `2d-green (failed)` from the dropdown.
If the test message doesn't arrive, make sure you tapped **Start** in the bot conversation. Telegram bots cannot send messages to users who haven't initiated the conversation first.
## Market selection
Each delivery method has its own market filter that controls which asset classes can trigger alerts. Under **Alerts → Settings → Telegram**, you will see checkboxes for:
* **Stocks** — equities alerts (e.g., `SPY`, `AAPL`)
* **Futures** — futures alerts (e.g., `NQ=F`, `ES=F`)
* **Crypto** — cryptocurrency alerts (e.g., `BTC-USD`)
Check the markets you want to receive on this channel and save. Only alerts for enabled markets are delivered — alerts for unchecked markets are silently filtered out.
Sim Break Alerts scan futures instruments. If you want to receive Sim Break alerts through Telegram, make sure **Futures** is enabled here.
## What alerts you receive
Once connected, the StratAlerts bot delivers two types of alerts:
Sent when a setup goes in-force — price has cleared the trigger level and the trade is active. Includes symbol, timeframe, setup, and direction with a deep link back into the app.
Sent when multiple instruments break together within a short window, flagging potential broad market participation.
## Alert message format
Each Telegram alert includes full setup context and a tap-to-open link back into StratAlerts:
```text example alert theme={null}
📈 SPY — Daily — 2U — Up
In-force at 561.40
View setup → https://app.stratalerts.com/...
```
The deep link opens the Setups Table with the clicked symbol prefiltered and all timeframes visible, so you can review TFC context, target levels, and candle state without navigating manually.
The deep link in each alert takes you straight to the Setups Table filtered to that symbol across all timeframes. Tapping it from your phone opens the StratAlerts mobile view at the correct symbol.
## Tips
Long-press the StratAlerts bot conversation in your Telegram chat list and select **Pin**. This keeps the alert feed at the top of your screen, one tap away during the session.
If you've muted Telegram globally or use focus modes, make sure the StratAlerts bot conversation has notifications enabled. Open the conversation, tap the bot name at the top, and verify **Notifications** is set to **On**.
The Telegram desktop app (Mac, Windows, Linux) or web client lets you track the alert feed alongside your charting platform without picking up your phone. All alerts sync across devices in real time.
You can connect both Pushover and Telegram simultaneously. Some traders prefer Pushover for high-priority lock-screen alerts and Telegram for the searchable message history and deep links.
## Related
Set up Pushover for high-priority lock-screen alerts with configurable sound profiles.
Control which setups, timeframes, and markets trigger your push notifications.
# Pricing
Source: https://docs.stratalerts.com/pricing
StratAlerts offers a Basic plan for core scanner access and a Founders Plan with every premium feature. No locked modules, cancel anytime.
StratAlerts offers two subscription tiers — a **Basic** plan for core scanner access and a **Founders Plan** with every premium feature — plus free access to several key pages without a subscription.
## Free 7-day trial
New users who have never held a StratAlerts subscription can start with a **free 7-day trial** of the Founders Plan. During the trial, you get full access to every premium feature — Mission Control, Watchlists, push notifications, and everything else included in the Founders Plan.
* A credit card is required at signup
* You are not charged until the trial ends
* Cancel anytime before day 7, and you are not billed
* After the trial, your subscription automatically converts to the paid Founders rate on the billing cycle you selected (monthly or annual)
The free trial is available on the Founders Plan only. It appears as the primary option on the pricing page and the in-app upgrade screen.
[Start your free trial →](https://app.stratalerts.com/billing/subscribe/)
## Free scanner access
You can explore several core features without a subscription. Create a free account and log in to access:
* **Market Overview** — sector breadth, indices, and candle-state snapshots
* **Earnings calendar** — filtered by report window and importance
Premium features require an active Basic or Founders Plan subscription. If you open a premium page without a subscription, you are redirected to an in-app upgrade screen.
## Basic plan
The Basic plan gives you access to the core StratAlerts scanner at a lower price point. It is designed for traders who want the scanner front and center before stepping into the full platform.
| Billing cycle | Price |
| ------------- | -------- |
| Monthly | \$25/mo |
| Annual | \$250/yr |
Annual billing saves you two months compared to paying monthly.
### What's included in Basic
* **Setups Table** — Browse, filter, and save views across the full setup universe with multi-timeframe filtering
* **Watchlists** — Custom symbol lists with multi-timeframe chart context
* **AI Search** — Natural-language search across scanned instruments
* **Mission Control (limited)** — Access to the dashboard shell with general-availability panels like the setups feed, biggest movers, economic events, overnight context, VIX, earnings calendar, top gappers, relative strength, and top movers into trigger. The alerts stream, simultaneous breaks, sectors snapshot, and sector performance matrix panels are excluded on the Basic plan.
Basic does not include the alerts stream, push notifications, simultaneous breaks, sectors, breadth dashboards, or playbooks. If you need those features, choose the [Founders Plan](#founders-plan) instead.
AI Tools and API Access are not included with the Basic plan. You can purchase them separately as standalone add-ons — see [AI Tools and API Access](#ai-tools-and-api-access) below.
[Subscribe to Basic →](https://app.stratalerts.com/billing/subscribe/)
## Founders Plan
The Founders Plan is launch pricing for early members and includes the full platform with no exceptions. It expires **June 30th**, after which new subscriptions move to regular pricing.
New users who have never held a StratAlerts subscription can start with a **7-day free trial** of the Founders Plan. A credit card is required at signup, and your subscription automatically converts to the paid Founders rate at the end of the trial unless you cancel.
| Billing cycle | Founders price | Regular price |
| ------------- | -------------- | ------------- |
| Monthly | \$99/mo | \$149/mo |
| Annual | \$999/yr | \$1,499/yr |
Annual billing saves you two months compared to paying monthly.
Founders pricing is locked in for the life of your subscription as long as it remains active. If you cancel and resubscribe after June 30th, the regular rate applies.
[Start your free trial →](https://app.stratalerts.com/billing/subscribe/)
## What's included in the Founders Plan
Every Founders Plan subscription includes the full StratAlerts platform with no exceptions:
* **Mission Control** — Real-time signal monitoring across the alerts stream, simultaneous breaks panel, and setups feed
* **Setups feed and table** — Complete setup grid with TFC state, candle IDs, in-force flags, PMGs, and setup shape across all scanned instruments
* **Simultaneous breaks** — Coordinated multi-instrument break detection with configurable thresholds
* **Sectors** — SPDR sector breadth overview with one-click drill-downs into every ticker's D/W/M/Q/Y candle state
* **Watchlists** — Custom symbol lists with multi-timeframe chart context
* **Market and daily breadth dashboards** — Directional participation by timeframe, plus intraday distribution of candle states
* **Indices matrix** — Candle state snapshot across major indices
* **Earnings calendar** — Filtered by reporting window and importance, integrated alongside your scanner
* **FinancialJuice news** — Live macro headlines and fast-moving news without leaving the scanner environment
* **Push notifications** — Mobile alert delivery through Pushover and Telegram
* **Multi-asset coverage** — Stocks (S\&P 500, Nasdaq 100), futures, and crypto
* **Custom filters** — Deep multi-timeframe filtering across the setups table
* **AI Tools** — Structured NDJSON market bundles for GPT, Claude, and other LLMs, refreshed every 5 minutes
* **API Access** — REST endpoints and WebSocket streams for custom integrations and execution systems
* **All current features and future core platform updates** — No upgrade required as new features ship
Push notifications work on both iOS and Android through Pushover or Telegram. You do not need to keep the StratAlerts tab open to receive live alerts.
## AI Tools and API Access
AI Tools and API Access are **included at no extra cost** with the Founders Plan. If you have an active Founders subscription, you already have access to both products — no separate purchase required.
Pre-compiled JSON market bundles for GPT, Claude, Codex, and custom agent workflows. Refreshed every five minutes. Included with the Founders Plan.
Low-latency REST endpoints and WebSocket streams for building custom integrations and execution systems. Included with the Founders Plan.
If you are on the **Basic plan**, AI Tools and API Access are not included and can be purchased as standalone add-ons:
| Product | Monthly | Annual |
| ---------- | ------- | -------- |
| AI Tools | \$25/mo | \$250/yr |
| API Access | \$50/mo | \$500/yr |
Both AI Tools and API Access support monthly and annual billing. Annual saves you two months compared to paying monthly.
## Frequently asked questions
Yes. There are no contracts or cancellation fees. You can cancel your subscription at any time from your account settings. Access continues through the end of your current billing period.
Switching from monthly to annual while your account is active preserves your Founders pricing status. You move to the \$999/yr Founders annual rate rather than the regular \$1,499/yr rate, as long as you switch before June 30th.
Yes. After creating a free account, you can access the Market Overview and Earnings Calendar without a subscription. Features like Watchlists, Setups Table, and AI Search require at least a Basic subscription. Pro-tier features such as the alerts stream, push notifications, simultaneous breaks, and sectors require a Pro Plan. If you open a premium page without the required subscription, you are redirected to an in-app upgrade screen where you can compare plans and subscribe.
New users who have never held a StratAlerts subscription can start the Founders Plan with a 7-day free trial. You need to enter a credit card at signup, but you are not charged until the trial ends. If you cancel before the 7-day period is up, you will not be billed. After the trial, your subscription automatically converts to the paid Founders rate on the billing cycle you selected.
The Basic plan includes the Setups Table, Watchlists, AI Search, and a limited Mission Control. The Founders Plan includes every premium feature on the platform — the full Mission Control with alerts stream and simultaneous breaks panels, push notifications, sectors, breadth dashboards, playbooks, and all future core updates. Choose Basic if you only need the scanner essentials, or Founders for the complete experience.
It depends on your plan. The **Founders Plan** includes both AI Tools and API Access at no extra cost. If you are on the **Basic plan**, you need to purchase them separately — AI Tools at \$25/mo or \$250/yr, and API Access at \$50/mo or \$500/yr. You can also subscribe to AI Tools or API Access as standalone products without a scanner subscription.
[Subscribe now →](https://app.stratalerts.com/billing/subscribe/)
# Quick Start
Source: https://docs.stratalerts.com/quickstart
Create your account, log in to Mission Control, and configure push alerts in under 5 minutes. Start scanning stocks, futures, and crypto with The Strat.
Getting started with StratAlerts takes a few minutes. You will create an account, log in to the dashboard, orient yourself in Mission Control, and optionally connect push notifications to your phone. By the end, you will have a live scanner running against stocks, futures, and crypto with real-time alerts ready to deliver.
Go to [app.stratalerts.com](https://app.stratalerts.com) and create a free account. Once logged in, you can explore the Market Overview, Earnings calendar, and Setups Table immediately — no subscription required.
To unlock scanner features, choose a paid plan. The **Basic plan** gives you access to the Setups Table, Watchlists, and AI Search. The **Founders Plan** adds the full Mission Control with alerts stream and simultaneous breaks, push notifications, sectors, breadth dashboards, and playbooks. Start a **free 7-day trial** of the Founders Plan at [app.stratalerts.com/billing/subscribe/](https://app.stratalerts.com/billing/subscribe/) — you get full access during the trial and can cancel before day 7 if it is not for you.
Founders pricing expires June 30th. Locking in now keeps that rate for the life of your subscription.
Visit [app.stratalerts.com/accounts/login/](https://app.stratalerts.com/accounts/login/) and sign in with the email and password you created during signup. You will land on Mission Control immediately after logging in.
StratAlerts works in any modern desktop or mobile browser. No app download is required, though you can install it as a progressive web app on iOS or Android for a more native feel.
Mission Control is your primary scanner surface. Take a moment to orient yourself before customizing anything:
* **Alerts stream** — Live alerts appear here as setups trigger across all scanned instruments. Each entry shows the symbol, timeframe, and setup sequence.
* **Simultaneous breaks** — When multiple instruments break the same type of level at the same time, they surface here. Coordinated breaks often signal broader participation.
* **Setups feed** — A scannable grid of every active setup across the universe. You can filter by asset class, timeframe, setup type, and TFC alignment.
* **Breadth panels** — Market breadth and daily breadth panels show the distribution of candle states across timeframes, so you can read whether conditions are narrow or broad before entering.
Spend a few minutes watching the alerts stream and setups feed update in real time before exploring other sections.
Push notifications deliver live alerts to your phone even when you are not at your desk. StratAlerts supports two delivery channels:
* **Pushover** — Install the Pushover app on iOS or Android, create a free account, and connect it in **Alerts → Settings** inside StratAlerts. See [Pushover setup](/notifications/pushover) for the full walkthrough.
* **Telegram** — If you prefer Telegram, follow the [Telegram setup guide](/notifications/telegram) to link your account through the StratAlerts bot.
You can enable one or both channels. Alerts include symbol, timeframe, and setup context so you know at a glance whether to act.
If you want to build your own tools on top of StratAlerts data — custom dashboards, execution systems, or AI workflows — request an API key in your account settings and review the [API reference](/api/overview).
The API provides low-latency REST endpoints and WebSocket streams for candle states, setup data, prices, and alerts.
## What to explore next
A deep dive into the alerts stream, simultaneous breaks, and setups feed panels.
Learn how to filter, sort, and browse setups to find high-conviction candidates fast.
Use sector breadth to understand which parts of the market are leading or lagging.
Start with a free 7-day trial, then choose the plan that fits. See what is included.
Market data in StratAlerts reflects live conditions. Setups and alerts are informational and do not constitute financial advice. Always apply your own risk management and position sizing rules before entering a trade.
# Realtime Alerts
Source: https://docs.stratalerts.com/scanner/alerts
The Alerts panel streams in-force notifications as setups trigger. Filter by timeframe, direction, and candle state. Receive alerts via Pushover or Telegram.
The Alerts panel and push notifications require the **Founders Plan**. Basic plan subscribers do not have access to alerts, alert groups, or push notification delivery. [Compare plans →](/pricing)
The Alerts panel is your real-time feed of setups going in force. When price crosses a trigger level — the high of a 2U or the low of a 2D — an alert fires immediately and appears at the top of the stream. You don't need to watch the Setups Table for price action; the alerts come to you. Press **A** anywhere in the app to jump to the panel.
## What each alert shows
Every entry in the stream contains the full context you need to evaluate the trade without leaving the panel.
The ticker and the candle period the setup lives on. A daily 1-2U and a 60-minute 1-2U are different trades — the timeframe tells you which one fired.
The C2-C1 combination (e.g., 1-2U, 2D-3, 1-2D) and the current candle (CC) state at the moment the trigger was crossed, so you know the structural context of the alert.
Whether the break was **up** (above the trigger high) or **down** (below the trigger low), and the exact price at which the trigger was crossed.
The time the setup was detected, shown as a dedicated column in `HH:MM:SS` format on the Mission Control alerts stream. Detection timestamps give you a more accurate read on when the trigger actually crossed. Alerts are sorted most recent first, so the freshest signals stay at the top of the stream.
## Filtering the stream
Use the filter controls above the stream to narrow the alerts to the ones relevant to your session.
Select one or more timeframes to show only alerts from those periods. The default view includes 60m, 4H, 12H, Daily, Weekly, Monthly, Quarterly, and Yearly. Toggle off shorter timeframes if you trade larger structures, or pin intraday-only timeframes during the session. Click **All** to select every timeframe at once.
Available timeframes: **All, 15m, 30m, 60m, 4H, 12H, D, W, M, Q, Y**
Filter to **up** alerts only (bullish in-force triggers), **down** alerts only (bearish), or leave on **All** to see both directions. Useful when you have a directional bias for the session and want to reduce noise.
Show only alerts where the current candle matches a specific ID — **1** (inside), **2U**, **2D**, **3**, or detail values like **2D-green** (failed bearish candle) or **2U-red** (failed bullish candle). The CC state at alert time is the candle forming when the trigger was crossed.
Scope the stream to **Stocks**, **Futures**, **Crypto**, or **Core** (stocks and futures together). When you're focused on equities, hiding crypto reduces irrelevant alerts.
## Alert settings
**Alerts → Settings** is the single home for all notification delivery and alert rule configuration. The settings area is organized into dedicated pages:
* **Pushover** — connect and configure Pushover delivery
* **Telegram** — connect and configure Telegram delivery
* **Sim Break Alerts** — manage simultaneous break alert rules
* **Metrics** — configure metric-based alert rules (see below)
Alert groups let you define a named collection of symbols, timeframes, and setups that you want to monitor. You can create multiple groups — for example, one group for your core watchlist on daily and weekly timeframes, and another for futures across all intraday timeframes. Each group can be enabled or disabled independently.
Every alert group supports three filtering dimensions:
* **Symbols** — the tickers you want alerts for (e.g., `SPY`, `AAPL`, `NQ=F`)
* **Timeframes** — the candle periods to monitor (e.g., Daily, Weekly, 60m)
* **Setups** — the specific setup types to match (e.g., `1-2`, `3-2`, `2d-green`)
When you leave the setup selector on **All**, the group fires for every setup that matches your symbols and timeframes — this is the default behavior. To narrow delivery to specific setups, open the **Setup** dropdown in the group form and check the ones you care about. The dropdown uses the same setup labels you see throughout the app, including special candle states like `2d-green (failed)` and `2u-red (failed)`.
A group with no setup selections behaves exactly the same as before — all setups are delivered. Once you select specific setups, only those setups trigger notifications for that group.
Setup filters apply to both **Pushover** and **Telegram** deliveries. When you narrow an alert group to specific setups, only matching setups are sent through your configured push channels — there is no separate setup filter per delivery method.
By default, alerts fire for fresh in-force triggers. When a setup's C1 and CC are both the same directional 2 candle (e.g., 2U-2U), it's a continuation rather than a new setup break. You can allow continuations per alert group if you want to track those moves as well.
Snoozing temporarily silences all push notifications without deleting your settings. Access the snooze control from the header bar or from within the Alerts workspace. Use it when you've already acted on a name and don't need to see repeated triggers during the session.
## Metrics alerts
The **Alerts → Metrics** tab lets you create rules that fire when real-time technical indicators hit conditions you define. Unlike setup-based alerts that track candle structure, metrics alerts monitor computed indicators — RVOL thresholds, VWAP deviation bands, ATR High/Low proximity, Initial Balance session levels, Opening Range Breakout (ORB) levels, and RSI superstacks — and trigger directly from the live metrics pipeline.
Each rule targets equities, futures, or both, and can be scoped to specific symbols or entire watchlists. See [Equities metrics](/scanner/equities-metrics) and [Futures metrics](/scanner/futures-metrics) for the full list of available indicators and how they are computed.
Fires when a symbol's relative volume (RVOL) exceeds a threshold you set. RVOL is evaluated per timeframe using the same `RVOL20` values shown on the live metrics page — so a rule with 60m and D selected can fire independently when either the 60-minute or daily RVOL crosses your threshold. A reading above 2.0 means volume is running at twice the typical pace, which often signals unusual institutional activity.
When creating or editing an RVOL rule, use the inline **Lookup** panel to query current RVOL for any symbol before committing to a threshold — see [Look up current RVOL](#look-up-current-rvol) below.
Fires when price touches or crosses a VWAP sigma band (±2σ or ±3σ). Use this to catch mean-reversion setups or identify overextended moves without watching every chart.
Fires when price approaches or crosses the ATR-derived high or low on any of your selected timeframes. Each rule offers two toggle modes per side (high and low):
| Toggle | Condition |
| ------------ | -------------------------------------------------------------- |
| **Near** | Price enters the proximity zone around the ATR high or ATR low |
| **Crossing** | Price crosses through the ATR high or ATR low level |
You can enable **Near**, **Crossing**, or both independently for highs and lows. For example, you might enable **Near** on the ATR high to get an early warning as price approaches the upper end of its expected range, and **Crossing** on the ATR low to catch confirmed breakdowns.
ATR High/Low rules use the shared timeframe selector, so you can target specific timeframes like 60m and D to monitor intraday and daily ATR levels independently.
Fires when price breaks above or below the initial balance range, or pulls back to the 50% midpoint after a break. The initial balance is defined as the high and low of the first closed 60 minutes of the session — for equities this is the first hour after the regular open. For futures, the initial balance is tracked per session — **Globex** and **NY** each have their own independent IB range that locks once the first 60 minutes of that session close. When creating an Initial Balance rule for futures, you select which sessions to monitor — **Globex**, **NY**, or both. A Globex IB break and an NY IB break on the same contract do not suppress each other. No timeframe selection is needed.
The Initial Balance range expires after 6 hours. Once expired, the range stops producing new alert events — this prevents stale IB levels from generating false signals late in the session when the range is no longer relevant.
Four event types are available:
| Event | Condition |
| --------------------- | ------------------------------------------------------ |
| **Bull break** | Price trades above the IB high |
| **Bear break** | Price trades below the IB low |
| **Bull 50% pullback** | Price pulls back to the IB midpoint after a bull break |
| **Bear 50% pullback** | Price pulls back to the IB midpoint after a bear break |
Pullback events only fire after the corresponding break has occurred in the same session. Both breaks and pullbacks can retrigger within the session, subject to the cooldown you set on the rule. Cooldowns are tracked independently per symbol, session, side, and event type — a bull break cooldown does not block a bear break or a pullback alert.
Fires when price breaks above or below the opening range for a session. The opening range is defined as the high and low of the first completed bar of the selected timeframe — so a 15-minute ORB uses the first 15 minutes of the session, a 30-minute ORB uses the first 30, and a 60-minute ORB uses the first hour.
Two event types are available:
| Event | Condition |
| -------------- | ----------------------------------------- |
| **Bull break** | Price trades above the opening range high |
| **Bear break** | Price trades below the opening range low |
ORB triggers are intrabar — they fire as soon as price crosses the level, without waiting for a candle close. The opening range does not become active until its defining bar has fully closed and the high/low are locked. The range expires after 6 hours, so late-session price action does not trigger alerts against a stale opening range.
ORB rules use a dedicated timeframe selector limited to **15m**, **30m**, and **60m**. You independently toggle **Bull** and **Bear** directions, and optionally enable **Alert retriggers** to allow repeated alerts on the same symbol, session, and direction after the cooldown expires. When retriggers are off, each symbol can only alert once per session, timeframe, and direction.
For futures, you also select which sessions to monitor — **Globex**, **NY**, or both. Each session tracks its own opening range independently, so a Globex ORB and an NY ORB on the same symbol do not suppress each other. Equities always use the NY cash session.
Fires when RSI readings across multiple timeframes align in the same extreme zone — for example, three or more timeframes simultaneously in oversold territory. This highlights symbols under broad, multi-timeframe momentum pressure. New rules default to both **oversold** and **overbought** enabled, so you get alerts on superstacks in either direction out of the box. You can disable either side when creating or editing a rule.
Use **Clone** to spin up a new rule pre-populated from an existing one — handy when you want to fork a working configuration to test a different threshold, narrow the symbol scope, or swap watchlists without rebuilding the rule from scratch.
The Clone button appears next to each saved rule in the list and in the inline editor footer. Clicking it opens a **Clone rule** prompt asking for the copy name. The field is pre-filled with the source rule's name plus a ` Copy` suffix (or ` Copy 2`, ` Copy 3`, … if a copy already exists), so you can press **Clone** straight away or rename it first. The name is required — submitting a blank value surfaces an inline error without creating the copy.
Cloning preserves the source rule's:
* Rule type
* Symbol scope (individual symbols, all equities, all futures, all crypto)
* Attached watchlists
* Cooldown
* Type-specific parameters (thresholds, toggles, sessions)
The new rule is always created **disabled**. Review and adjust the configuration, then toggle it on to start receiving alerts — this prevents duplicate notifications firing from both the original and the clone before you've made your changes.
The Metrics page refreshes in place after a successful clone — no full page reload — and a toast confirms the copy was created.
Picking a useful RVOL threshold is easier when you can see what symbols are printing right now. The RVOL create composer and inline editor include a compact **Lookup** strip that queries live RVOL stats without leaving the form, so you can size the multiplier against real readings before saving.
Enter one or more tickers in the **Lookup** field (comma- or space-separated, up to 25 at a time) and click **Query**. The strip shows the queried symbol as a single `SYMBOL / MARKET` header followed by inline RVOL chips, and exposes compact `<` / `>` icon-width pagination buttons (labeled **Previous** / **Next** for accessibility) plus a `1 / N` page indicator to step through the rest of the entered symbols one at a time. Empty, loading, and error states render as a single inline message — there is no separate **Stats** heading or nested card around the results.
For each symbol, the strip reports the same RVOL values used by the alert engine, with each value rendered as its own chip:
| Row | Source |
| ------------------------------------------------------- | -------------------------------------------------------------- |
| **Daily 10D** | 10-day daily RVOL from the ticker's stored stats |
| **Daily 20D** | 20-day daily RVOL from the ticker's stored stats |
| **5m / 15m / 30m / 60m / 4H / 12H / D / W / M / Q / Y** | Current runtime `RVOL20` for each timeframe that has live data |
Values display as a `2.34x` multiplier — the same convention used for the rule threshold — so a reading of `1.80x` on the 60m chip means a rule set to `1.5x` on 60m would currently be firing for that symbol. Timeframe chips only appear when runtime data is available, so a quiet pre-market session may return only the daily chips.
The lookup is currently RVOL-only. Other metric rule types (VWAP bands, ATR High/Low, Initial Balance, ORB, RSI superstack) do not show the Lookup strip.
Query a few representative names from your watchlist — a high-beta mover, a steady large-cap, and an illiquid small-cap — to see how RVOL ranges differ before you commit to a threshold. A `1.5x` rule that's quiet on liquid names may flood you on thin tickers.
When you create a rule, you choose:
* **Rule type** — RVOL high, VWAP bands, ATR High/Low, Initial Balance, ORB, or RSI superstack
* **Timeframes** — the candle periods the rule evaluates against (RSI, RVOL, and ATR High/Low rules). Available timeframes are **15m, 30m, 60m, 4H, 12H, D, W, M, Q, Y**. By default, rules use 60m, 4H, 12H, D, W, M, Q, and Y. You can narrow or expand the selection per rule — for example, limit an RVOL rule to intraday timeframes only, or enable 15m for faster signals. VWAP bands rules do not show the timeframe selector — they always evaluate against session VWAP. Initial Balance rules do not use timeframe selection — they always use the first closed 60-minute session window. ORB rules have their own timeframe selector limited to **15m, 30m, and 60m**.
* **Symbols** — individual tickers, entire watchlists (using a multi-select dropdown), all equities, all futures, or any combination
* **Cooldown** — minimum seconds between repeated alerts for the same rule, so you aren't flooded during volatile stretches
* **Parameters** — type-specific settings. For Initial Balance rules, you independently toggle **bull** and **bear** sides, and **break** and **pullback** event types; for futures, you also select which sessions to monitor (**Globex**, **NY**, or both). For ATR High/Low rules, you independently toggle **Near** and **Crossing** for highs and lows. For ORB rules, you toggle **Bull** and **Bear** directions, enable **Alert retriggers**, and select **Futures sessions** (Globex, NY). For other rule types, set thresholds like the RVOL multiplier or sigma band level.
Metric alert rules evaluate in real time as metrics update. Each rule fires independently per selected timeframe — an RVOL rule with 60m and D selected can alert on both the 60-minute and daily RVOL independently. Events include the observed value, threshold, symbol, timeframe, direction, and a second-precision detection timestamp. Each event is deduplicated automatically — the same condition on the same bar or trade only fires once per timeframe.
The **Recent Events** table on the Metrics page shows only events detected within the last 15 minutes. Older events roll off automatically so the table stays focused on live, actionable signals. Timestamps display in a compact `HH:MM:SS TZ` format for quick scanning during active sessions.
Metric alerts pair well with setup alerts. Create an RVOL rule on your core watchlist to flag unusual volume, then check the setups table for actionable Strat structures on those names. Add an Initial Balance rule on the same symbols to catch initial balance breaks during the session — when a name breaks the IB high on elevated RVOL, that confluence can signal strong directional conviction. Use ATR High/Low rules to get a heads-up when price is nearing the extremes of its expected range, which can help with timing entries and exits. Add an ORB rule to catch early-session directional momentum — a bull ORB break on elevated RVOL in the first 30 minutes often signals strong follow-through.
## Push notifications
When you step away from the screen, push notifications make sure alerts still reach you. StratAlerts supports two delivery channels.
Pushover delivers alerts to your phone as a clean, glanceable notification. Each message includes the symbol, timeframe, direction, and price so you have everything you need at a glance.
Download the Pushover app on your iOS or Android device and create an account at pushover.net.
In StratAlerts, go to **Alerts → Settings → Pushover** and enter your Pushover user key. Save the settings.
Select which alert groups should trigger Pushover notifications. You can enable push for your core watchlist while keeping crypto or futures alerts screen-only.
Telegram delivery sends alert messages to a Telegram bot linked to your StratAlerts account. Tapping the notification links directly back into your trading workflow.
Go to **Alerts → Settings → Telegram** and follow the setup link to start the StratAlerts bot in Telegram. The bot will send a confirmation code.
Paste the confirmation code into the Telegram settings page in StratAlerts to link the accounts.
Select which alert groups should send Telegram messages, then save. Alerts will begin arriving in Telegram immediately.
Push notifications only deliver for alert groups that have at least one symbol and one timeframe configured. If you've also selected specific setups in a group, only those setups trigger delivery on both Pushover and Telegram — make sure the setup you expect is checked. If you've enabled Pushover or Telegram but aren't receiving notifications, check that your alert groups are set up and enabled under **Alerts → Settings**, and verify that the correct markets are enabled under each delivery method's [market selection](/notifications/pushover#market-selection).
## Live stream reconnection
The alerts stream uses a cursor-based resume flow so you never miss an alert during brief disconnects or page reloads. When the connection opens, the server sends a batch of current in-force alerts along with a **cursor** — an opaque position marker in the alert event stream. If you lose the connection and reconnect, the client sends its last-known cursor back to the server, which replays any alerts that fired between the disconnect and the reconnect. All filtering — timeframes, direction, market, watchlists, alert groups, and market cap — is applied server-side during replay, so the resumed alerts match your active filter state exactly.
Three bootstrap modes can occur on reconnect:
| Mode | When it happens | What you see |
| ------------- | ------------------------------------------- | -------------------------------------------------------------------------- |
| **Bootstrap** | First connection or no cursor saved | Full snapshot of current in-force alerts matching your filters |
| **Replay** | Reconnect with a valid cursor | Only the alerts that fired since your last cursor, filtered server-side |
| **Reset** | Reconnect with an expired or invalid cursor | Full snapshot, same as bootstrap — the stream was too far behind to replay |
You don't need to manage this process manually. The app handles cursor tracking and reconnection automatically. The result is that your alerts panel stays accurate across network interruptions without resorting to periodic polling, and filtered views — including watchlist and alert group scoping — remain consistent because the server applies the same subscription filters during replay that it applies to live events.
If you notice the alerts panel flash a full reload after a long disconnect, that's the reset mode kicking in — the cursor expired and the server sent a fresh snapshot instead of a partial replay. This is expected behavior and ensures you always see a complete, accurate view.
## Keyboard shortcut
| Key | Action |
| ----- | ---------------------------------------------- |
| **A** | Open the Alerts panel from anywhere in the app |
# Charts
Source: https://docs.stratalerts.com/scanner/charts
Build, save, and manage custom multi-symbol chart layouts on the dedicated Charts page.
The Charts page gives you a flexible grid where you can arrange multiple symbols, timeframes, and watchlist-driven views side by side. Layouts persist to your account, so you can switch between purpose-built workspaces — an opening-bell dashboard, a futures monitor, a swing-watchlist view — without rebuilding the grid each session.
## Layout sources
The layout dropdown in the toolbar groups your available views into three sources:
* **Default layouts** — Built-in starter layouts that every account ships with. These cannot be edited or deleted.
* **Custom layouts** — Layouts you create and save. These can be renamed, edited, saved over, and deleted.
* **Watchlist layouts** — Read-only chart grids generated from your watchlists. These follow the underlying watchlist and cannot be deleted from the Charts page — manage them from the [Watchlists](/context/watchlists) page instead.
## Create a custom layout
1. Arrange the grid the way you want it — add cards, drag to reposition, and pick timeframes.
2. Type a name in the layout name input in the toolbar.
3. Click **Create**.
The new layout becomes the active selection and is added to the **Custom layouts** group in the dropdown.
Click **Save** at any time to overwrite the active custom layout with the current grid state.
## Delete a custom layout
When an editable custom layout is active, a red trash icon appears in the toolbar next to **Save**. The control is hidden whenever the active layout is a default or a watchlist-driven view, so you cannot remove layouts that aren't yours to delete.
To delete the active custom layout:
1. Select the layout from the layout dropdown.
2. Click the trash icon in the toolbar.
3. Confirm the prompt.
After deletion, the Charts page automatically switches to the next available layout returned by the server — typically the most recently used layout or a default — so you always land on a working view.
Deletion is permanent. If you want to keep a starting point, duplicate the layout under a new name before deleting the original.
## Price precision on low-priced symbols
Chart cards adapt the price-axis and OHLC strip formatting to the symbol's price range, so low-priced tickers stay readable instead of rounding to two decimals.
* **Normal-priced symbols** — Two decimal places, e.g. `412.35`.
* **Visible bars under `$2`** — At least three decimal places, so DOGE-like prices keep meaningful resolution (for example, `0.187`).
* **Tiny crypto prices** — Up to eight decimal places, preserving PEPE-style values (for example, `0.00001234`).
The same formatting applies to both the initial card render and live updates from the chart websocket and Binance relay, so the price axis, last-price label, and hovered-candle OHLC strip stay consistent as new bars arrive.
You don't need to configure anything — the precision is selected per card from the visible price range.
## Why a layout might not be deletable
The delete control is intentionally suppressed in two cases:
* **Default layouts** — The server omits the delete URL from the layout payload and rejects delete requests for built-in layouts with a `default_layout_not_deletable` error.
* **Watchlist chart sources** — These are projections of a watchlist, not standalone Charts-page layouts. Remove the underlying watchlist or its symbols from the Watchlists page to change what appears here.
If the trash icon is missing while a layout is active, the layout falls into one of those categories.
# Equities Metrics
Source: https://docs.stratalerts.com/scanner/equities-metrics
Real-time technical indicators and VWAP sigma bands computed continuously for every equity in the scanner universe, with configurable metric alerts.
## Real-time technical indicators for equities
StratAlerts computes a set of core technical indicators in real time for every equity symbol in the scanner universe. As trades and candle aggregates stream in during the session, the platform updates each metric continuously — you always see the latest value without refreshing or waiting for a candle close.
Aggregate-driven indicators (EMA, SMA, RSI, ATR) now update live for every runtime timeframe — **15m, 30m, 60m, 4H, D, W, M, Q, Y** — from the developing candle, not just on candle close. This means your metrics reflect the current bar's progress across all timeframes the scanner tracks.
The metrics pipeline covers two categories: **aggregate-driven indicators** derived from candle data (EMA, SMA, RSI, ATR) and **trade-driven indicators** derived from individual trades (session VWAP with sigma bands).
## Available metrics
Exponential moving averages updated on every new candle aggregate. Six periods are available: the 9 and 12 for fast momentum reads, the 20 for short-term trend, the 26 for intermediate confirmation (commonly paired with the 12 for MACD-style analysis), the 50 for swing-level trend, and the 200 for long-term direction.
Simple moving average over the last 20 closing prices. Useful for comparing smoothed price action against the faster EMA equivalents.
Relative strength index with a 14-period lookback. The platform tracks oversold (below 30) and overbought (above 70) transitions and emits events when RSI crosses these thresholds.
Average true range over 14 periods. Gives you a real-time read on volatility for each symbol — useful for sizing positions and setting stops. The platform also tracks ATR-based high/low proximity and fires events when price enters or leaves the zone near the ATR high or ATR low.
Volume-weighted average price computed from individual trades throughout the session. VWAP resets each trading day and reflects the true average price weighted by volume.
Statistical bands at 2 and 3 standard deviations above and below session VWAP. When price touches or crosses a band, the platform fires a metric event you can use to trigger alerts.
Relative volume compared to the 20-day average at the same time of day. An RVOL of 2.0 means volume is running at twice the typical pace for that point in the session. RVOL updates in real time for every runtime timeframe and is available for both equities and futures.
The high and low of the first completed bar of a session, tracked for the 15-minute, 30-minute, and 60-minute timeframes. Once the defining bar closes, the opening range locks and the platform monitors live price against the ORB high and ORB low for the rest of the session. Bull and bear break events fire intrabar — as soon as price crosses the level — so you can set ORB alerts without watching every chart.
## How the metrics work
### Aggregate-driven indicators
EMA, SMA, RSI, and ATR are computed from candle aggregates — the same OHLCV data that powers the setups engine. Each time a new aggregate arrives for a symbol and timeframe, all six EMA periods (9, 12, 20, 26, 50, 200) plus SMA, RSI, and ATR update. Metrics update live for every runtime timeframe (**15m, 30m, 60m, 4H, D, W, M, Q, Y**) from the developing candle path, so you see intrabar progress on higher timeframes without waiting for the bar to close.
Indicator state is bootstrapped from historical candles at startup, so EMA, SMA, RSI, and ATR values are available from the first update of the session — you never see blank or partially seeded metrics while the system catches up.
**RSI threshold events** fire automatically when the indicator crosses key levels:
| Event | Condition |
| ------------------ | ----------------------- |
| Entered oversold | RSI drops below 30 |
| Exited oversold | RSI rises back above 30 |
| Entered overbought | RSI rises above 70 |
| Exited overbought | RSI drops back below 70 |
**ATR proximity events** fire when price approaches or retreats from the ATR-derived high or low:
| Event | Condition |
| --------------------- | -------------------------------------------- |
| Entered ATR high zone | Price moves within proximity of the ATR high |
| Left ATR high zone | Price retreats away from the ATR high |
| Entered ATR low zone | Price moves within proximity of the ATR low |
| Left ATR low zone | Price retreats away from the ATR low |
### Trade-driven indicators
Session VWAP and its sigma bands are computed from individual trade executions, not candle data. Every trade updates the running VWAP and recalculates the standard deviation bands in real time.
The platform tracks where price sits relative to the VWAP bands and fires events on transitions:
| Event | Condition |
| ------------------- | ------------------------------------------------- |
| Touched +2σ | Price moves above the upper 2-sigma band |
| Touched −2σ | Price moves below the lower 2-sigma band |
| Touched +3σ | Price moves above the upper 3-sigma band |
| Touched −3σ | Price moves below the lower 3-sigma band |
| Re-entered from +2σ | Price returns inside the 2-sigma range from above |
| Re-entered from −2σ | Price returns inside the 2-sigma range from below |
| Re-entered from +3σ | Price returns inside the 3-sigma range from above |
| Re-entered from −3σ | Price returns inside the 3-sigma range from below |
VWAP sigma bands are especially useful for identifying mean-reversion opportunities. A stock that touches the −2σ band during an otherwise bullish session may be presenting a pullback entry, while a touch of +3σ could signal overextension.
## Metric alerts
You can create custom metric alert rules from **Alerts → Metrics** that fire when specific indicator conditions occur in real time. There are two layers of metric alerting:
### Custom metric alert rules
Custom rules let you define named alert rules that evaluate directly from the live metrics pipeline. Each rule specifies a **rule type**, **timeframes**, **symbol scope**, and **type-specific parameters**. Go to **Alerts → Metrics** to create and manage rules.
Every rule includes a **timeframe selector** that controls which candle periods the rule evaluates against. Available timeframes are **15m, 30m, 60m, 4H, 12H, D, W, M, Q, Y**. The default selection is 60m, 4H, 12H, D, W, M, Q, and Y. The rule fires independently per selected timeframe — for example, an RVOL rule can alert on 60-minute volume separately from daily volume. VWAP bands rules do not show the timeframe selector — they always evaluate against session VWAP. Initial Balance rules do not use the timeframe selector — they always reference the first closed 60-minute session window. ORB rules have their own timeframe selector limited to **15m, 30m, and 60m**.
Available rule types:
Fires when a symbol's relative volume exceeds a threshold you set on any of your selected timeframes. RVOL compares current volume to the 20-day average at the same time of day. A value of 2.0 means twice the normal volume — often a sign of unusual institutional activity or a catalyst-driven move. The rule evaluates each selected timeframe independently, so you can catch volume spikes on the 60-minute bar without also needing a daily threshold breach.
Fires when price touches or crosses a VWAP sigma band (±2σ or ±3σ). Catches mean-reversion opportunities or flags overextended moves without requiring you to watch every chart.
Fires when price approaches or crosses the ATR-derived high or low level. Each rule provides two per-side toggles — **Near** (price enters the proximity zone) and **Crossing** (price crosses through the level) — that you can enable independently for ATR highs and ATR lows. The rule evaluates on each selected timeframe, so you can monitor intraday ATR levels on the 60m bar while also tracking the daily ATR range. See [Realtime alerts](/scanner/alerts#metrics-alerts) for full configuration details.
Fires when price breaks above or below the initial balance range, or pulls back to the 50% midpoint after a break. The initial balance is the high and low of the first closed 60 minutes after the regular equities session open. Once the first hour closes, the system locks the IB high, IB low, and IB midpoint, then monitors live price against those levels for up to 6 hours. After 6 hours the range expires and stops producing new alert events — this prevents stale levels from firing late in the day when they are no longer meaningful. You independently toggle bull/bear sides and break/pullback event types when creating the rule. See [Realtime alerts](/scanner/alerts#metrics-alerts) for the full list of Initial Balance event types and cooldown behavior.
Fires when price breaks above the opening range high (bull break) or below the opening range low (bear break) during the NY cash session. The opening range is the high and low of the first completed bar of the selected timeframe — choose from **15m**, **30m**, or **60m**. Triggers are intrabar, meaning the alert fires the moment price crosses the level rather than waiting for a candle close. Toggle **Bull** and **Bear** independently, and enable **Alert retriggers** if you want repeated alerts after the cooldown expires. When retriggers are off, each symbol alerts once per session, timeframe, and direction. The opening range expires after 6 hours, so late-session price action against a stale range does not produce spurious alerts. See [Realtime alerts](/scanner/alerts#metrics-alerts) for full configuration details.
Fires when RSI readings across multiple timeframes align in the same extreme zone simultaneously — for example, three or more timeframes all in oversold territory at once. This highlights names under broad, multi-timeframe momentum pressure that may be setting up for a reversal or continuation. New rules default to both **oversold** and **overbought** enabled, so you catch superstacks on both sides of the spectrum without extra configuration. You can disable either side when creating or editing a rule.
Each rule supports flexible symbol targeting:
* **Specific symbols** — enter a comma-separated list of tickers
* **Watchlists** — select one or more watchlists to monitor every symbol in them
* **All equities** — match every equity in the scanner universe
* **All futures** — match every futures contract in the scanner universe
Set a **cooldown** (in seconds) to control the minimum gap between repeated alerts for the same rule. Events are automatically deduplicated per timeframe — the same condition on the same bar only fires once per timeframe, and the cooldown adds a time-based buffer on top.
### Event-level metric alerts
You can also create alert definitions that fire on specific metric transitions. Each definition targets a combination of:
* **Metric family** — RSI, SMA, EMA, ATR, or VWAP
* **Metric key** — the specific indicator (e.g., `rsi_14`, `ema_9`, `ema_12`, `ema_26`, `atr_14`, `session_vwap_2sigma`)
* **Event type** — the transition you want to be notified about (e.g., `rsi_entered_oversold`, `price_touched_vwap_plus_2sigma`, `entered_atr_high_zone`)
* **Symbol** — a specific ticker, or leave blank to match all equities
* **Session mode** — regular session or extended hours
* **Cooldown** — minimum time between repeated alerts for the same definition
Both custom rules and event-level alerts use automatic deduplication. If the same event fires multiple times for the same candle or trade, you only receive one alert. The cooldown setting adds an additional time-based buffer on top of deduplication.
Metric alerts automatically **rearm on reset events**. When a metric enters an extreme zone (for example, RSI crosses into overbought), the alert fires once and is then suppressed while the condition stays active. As soon as the corresponding reset event clears the state (RSI exits overbought), the alert rearms so it can fire again immediately if the condition recurs. This applies to RSI, VWAP sigma band, and ATR proximity alerts — repeated extremes are suppressed while active but can trigger again after each reset.
### Example alert configurations
Create an **RVOL high** rule, select your core watchlist, and set the threshold to 2.0. Select the timeframes you want to monitor — for example, 60m and D to catch both intraday surges and full-day volume spikes. You'll get alerted whenever a name on your list exceeds the threshold on any selected timeframe.
Create an **RSI superstack** rule, enable **All equities**, and set the minimum timeframe count to 3. Both oversold and overbought are enabled by default, so the rule fires on either extreme. You'll be notified when a stock has three or more timeframes simultaneously in an RSI extreme, which often precedes a sharp reversal.
Create a **VWAP bands** rule, enter the ticker you want to monitor (e.g., AAPL), and select the ±2σ band. This fires when the stock pulls back to 2 standard deviations below session VWAP — a potential mean-reversion entry.
Set the metric family to **RSI**, metric key to **rsi\_14**, and event type to **rsi\_entered\_oversold**. Leave the symbol blank to match every equity in the scanner. Set a cooldown of 300 seconds (5 minutes) to avoid repeated alerts during choppy conditions.
Set the metric family to **ATR**, metric key to **atr\_14**, event type to **entered\_atr\_high\_zone**, and symbol to the ticker you want (e.g., `NVDA`). This fires when price moves into the ATR high zone, indicating the stock may be reaching the upper end of its expected daily range.
Create an **Initial Balance** rule, select your core watchlist, enable **Bull** and **Bear** sides, and check **Break**. Set a cooldown of 120 seconds. After the first hour of the regular session closes, you will be alerted whenever a name on your list trades above the IB high or below the IB low. Optionally enable **50% Pullback** to also catch retracements to the midpoint after a break — useful for re-entry or scaling opportunities.
Create an **ATR High/Low** rule, enter the futures symbol (e.g., `ES=F`), select the **D** and **60m** timeframes, and enable **Near** on the ATR high and **Crossing** on the ATR low. You'll get an early warning when the contract approaches the upper end of its daily expected range, and a confirmed alert when it breaks below the lower end on an intraday basis.
Create an **ORB** rule, select your core watchlist, and choose the **30m** timeframe. Enable both **Bull** and **Bear** directions. Leave **Alert retriggers** off so each name only alerts once per direction per session. After the first 30 minutes of the regular session close, you'll be alerted whenever a name on your list breaks above the opening range high or below the opening range low — useful for catching early-session directional momentum.
## Combining metrics with setups
Equities metrics work alongside the existing setups engine — they don't replace it. Use metrics as an additional filter layer on top of your Strat-based workflow:
Start with a setup that matches your criteria on the Setups Table — timeframe, candle structure, and quality score.
Before entering, check whether the equity's RSI is in a favorable zone. A 2U daily setup with RSI below 70 has more room to run than one already in overbought territory.
If price is near the lower VWAP sigma bands during an uptrend setup, the pullback may offer a better entry price than chasing a break at the highs.
Create a metric alert for the specific event you want to confirm — for example, an RSI exit from oversold — so you get notified when conditions align without watching the screen.
Metrics are computed from live market data and update continuously. Values can change rapidly during volatile conditions. Always confirm with the full setup context before acting on a metric signal alone.
# Futures Metrics
Source: https://docs.stratalerts.com/scanner/futures-metrics
Real-time technical indicators, VWAP sigma bands, and RVOL computed continuously for futures contracts in the scanner universe.
## Real-time technical indicators for futures
Futures contracts now flow through the same shared metrics pipeline as equities. As aggregate and session-volume events stream in during the session, the platform computes and updates indicators in real time — you see the latest values without refreshing or waiting for a candle close.
The metrics cover the same indicator families available for equities, adapted for the futures session structure.
## Available metrics
Exponential moving averages updated on every new candle aggregate across all maintained futures timeframes. Six periods are available — the 9 and 12 for fast momentum, 20 for short-term trend, 26 for intermediate confirmation, 50 for swing-level trend, and 200 for long-term direction.
Simple moving average over the last 20 closing prices, computed live for each futures contract.
Relative strength index with a 14-period lookback. The platform tracks oversold and overbought transitions and emits events when RSI crosses the 30 and 70 thresholds.
Average true range over 14 periods. Gives you a real-time read on volatility for each futures contract — useful for sizing positions and setting stops.
Volume-weighted average price computed from session volume data. VWAP resets each trading session and reflects the true average price weighted by volume.
Relative volume compared to the 20-day average at the same time of day. An RVOL of 2.0 means the contract is trading at twice its typical pace for that point in the session. RVOL updates per session minute for each futures symbol.
The high and low of the first completed bar of a session, tracked for the 15-minute, 30-minute, and 60-minute timeframes. For futures, each session — **Globex** and **NY** — has its own independent opening range. Once the defining bar closes, the ORB high and low lock and the platform monitors live price against those levels for the rest of the session. Bull and bear break events fire intrabar as soon as price crosses the level.
## How futures metrics work
Futures metrics use the same computation engine as equities metrics. Aggregate-driven indicators (all six EMA periods, SMA, RSI, ATR) update live for every maintained timeframe from the developing candle, while session VWAP and RVOL are computed from session-volume events.
Indicator state is bootstrapped from historical candles at startup, so EMA, SMA, RSI, and ATR values are available from the first update of the session — you never see blank or partially seeded metrics while the system catches up.
The same RSI threshold events, ATR proximity events, and VWAP sigma band transitions documented on the [equities metrics](/scanner/equities-metrics) page apply to futures as well.
Futures metrics are available for all contracts the scanner tracks. The indicator values and event types are identical to equities — if you already use equities metric alerts, the same rule types work for futures symbols.
## RVOL for futures
RVOL is particularly useful for futures because volume patterns are highly session-dependent. The 20-day lookback compares current volume to the same point in prior sessions, normalizing for time-of-day effects like the open, European session overlap, and the close.
Use RVOL to:
* **Spot unusual activity early** — a spike above 2.0 in the first hour may signal institutional flow or a macro catalyst
* **Confirm breakout strength** — a setup going in force on elevated RVOL is more likely to follow through than one on thin volume
* **Filter noise** — low RVOL readings during the midday lull help you avoid false signals in quiet conditions
## Metric alerts for futures
You can target futures contracts in all six metric alert rule types available under **Alerts → Metrics**:
* **RVOL high** — fires when a futures contract's relative volume exceeds your threshold
* **VWAP bands** — fires when price touches a VWAP sigma band on a futures contract
* **ATR High/Low** — fires when price approaches (**Near**) or crosses through (**Crossing**) the ATR-derived high or low level on any selected timeframe. Enable each toggle independently for highs and lows to control the alert sensitivity you need.
* **Initial Balance** — fires when price breaks above or below the initial balance range, or pulls back to the 50% midpoint after a break. For futures, the initial balance is tracked per session — **Globex** and **NY** each have their own independent IB range. The IB high, IB low, and midpoint lock once the first 60 minutes of the respective session close, and the range stays active for up to 6 hours before expiring. When creating an Initial Balance rule, you select which futures sessions to monitor — **Globex**, **NY**, or both. A Globex IB break and an NY IB break on the same contract do not suppress each other. No timeframe selection is needed.
* **ORB** — fires when price breaks above the opening range high or below the opening range low. For futures, you select which sessions to monitor — **Globex**, **NY**, or both. Each session tracks its own opening range independently, so a Globex ORB break and an NY ORB break on the same contract do not suppress each other. The opening range expires after 6 hours, preventing stale levels from firing late in the session. Choose from **15m**, **30m**, or **60m** timeframes, toggle **Bull** and **Bear** directions independently, and optionally enable **Alert retriggers** to allow repeated alerts after the cooldown expires.
* **RSI superstack** — fires when multiple timeframes align in the same RSI extreme on a futures symbol (new rules default to both oversold and overbought enabled)
When creating a rule, enable **All futures** to monitor every contract, or enter specific futures symbols (e.g., `ES=F`, `NQ=F`) in the symbols field. You can also combine equities and futures in the same rule by enabling both toggles.
See [Realtime alerts](/scanner/alerts#metrics-alerts) for full details on configuring metric alert rules.
Metrics are computed from live market data and update continuously. Values can change rapidly during volatile conditions. Always confirm with the full setup context before acting on a metric signal alone.
# Gappers Scanner
Source: https://docs.stratalerts.com/scanner/gappers
The gappers scanner identifies stocks trading above or below the prior session's range during pre-market hours, ranked by gap size, with kicker detection for outsized moves.
The dedicated gappers page is deprecated and has been removed from the main app sidebar. The page remains accessible at its existing URL during the deprecation window, but you should use the [Setups Table](/scanner/setups-table) with the **Gapper** filter enabled instead — you get the same gap data alongside full setup columns, sorting, saved views, and AI Search. Click here to visit the [Setups Table with Gappers](https://app.stratalerts.com/setups2/?gapper=1).
The gappers scanner watches every active equity symbol during pre-market hours (4:00 AM ET until the open) and flags any stock whose last trade price is above the prior day's high or below the prior day's low. Each result shows the gap direction, percentage, dollar amount, and whether the move qualifies as a kicker. The scanner updates every two seconds during pre-market and freezes its snapshot at the open, so the data stays visible throughout the regular session.
## When to use it
Use the gappers scanner during your pre-market routine to identify names that are already moving outside their prior range before the opening bell. Gapping stocks often carry momentum into the open and can set up actionable Strat triggers — especially when the gap aligns with higher-timeframe continuity.
The gappers scanner covers equities only. Futures and crypto symbols are excluded.
## Where gappers appear
Gapper data surfaces in three places across the app, each tuned for a different workflow.
The **Top Gappers** panel on Mission Control shows the largest gap-up and gap-down movers in a compact summary card, ranked by gap percentage. Configurable row limits let you show between 1 and 20 rows per direction.
The **Gap** column in the [Setups Table](/scanner/setups-table) displays the signed gap percentage on every row. Toggle the **Gapper** filter to restrict the table to symbols currently flagged as gapping. Kicker gaps are visually distinguished.
The standalone gappers page at **Setups > Gappers** provides a full-width table with sortable columns for gap percentage, gap dollar amount, symbol, and direction. It includes TFC context and earnings markers for each row.
## How the scan works
At 4:00 AM ET on trading days, the scanner begins polling real-time last-trade prices for all active equity symbols.
Each symbol's current pre-market price is compared against the previous session's daily high and low. If the price is above the prior high, it's a gap up. If it's below the prior low, it's a gap down. Symbols trading within the prior range are excluded.
For each gapper, the scanner computes the gap percentage and dollar amount relative to the breached level (prior high for gap-up, prior low for gap-down).
A gap qualifies as a **kicker** when the prior day's candle has its open and close near opposite extremes of the range — a full-bodied candle in the direction opposite to the gap. Kickers represent an abrupt sentiment reversal and are highlighted separately.
Results are sorted by absolute gap percentage so the largest movers appear first. The table auto-refreshes every 2 seconds during pre-market.
When the regular session opens, the scanner stops polling and freezes the last pre-market snapshot. This snapshot remains visible throughout the trading day so you can reference gapper context alongside your intraday setups.
## Columns on the gappers page
The dedicated gappers page displays the following columns for each symbol.
| Column | What it shows |
| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| **Ticker** | The equity symbol. Kicker gaps show a **Kicker** badge next to the ticker. Click any symbol to open the ticker overview with news. |
| **TFC** | Timeframe continuity chips for the symbol across higher timeframes, so you can see whether the gap aligns with the broader trend. |
| **DIR** | Gap direction — **UP** (green) or **DOWN** (red). |
| **Gap %** | The percentage move beyond the prior day's high or low. Color-coded green for positive, red for negative. |
| **Gap \$** | The dollar amount of the gap, signed. |
| **ER** | An earnings badge if the company reports within the current weekly window. |
| **Price** | The last pre-market trade price. |
| **Prior H/L** | The prior day's high (for gap-up) or low (for gap-down) — the reference level the price breached. |
| **Last Trade Time** | Timestamp of the most recent pre-market trade used in the calculation. |
## Kicker detection
A kicker is a gap where the prior day's candle was a full-bodied bar in the opposite direction — the open was near one extreme of the range and the close was near the other.
* **Gap up + kicker**: The prior candle was a strong bearish bar (open near high, close near low), and price is now gapping above that high. The sentiment has reversed sharply.
* **Gap down + kicker**: The prior candle was a strong bullish bar (open near low, close near high), and price is now gapping below that low.
Kicker gaps are flagged with a badge on the gappers page and a ring highlight in the Setups Table's Gap column. Hover over the ringed chip in the Setups Table to see a **Kicker** tooltip.
Kicker gaps into a Strat setup — for example, a daily 1-2U where the gap up also qualifies as a kicker — combine two independent signals of directional conviction. These are worth watching closely at the open.
## Using gappers on Mission Control
The **Top Gappers** panel on Mission Control provides a compact pre-market overview without leaving your dashboard layout. It splits results into gap-up and gap-down sections, each ranked by gap percentage.
You can configure how many rows appear per direction:
Click the settings icon on the Top Gappers panel.
Choose between 1 and 20 rows per direction. The default is 3.
Your preference persists across sessions.
Build a pre-market layout on Mission Control that pairs the Top Gappers panel with the overnight context and economic events panels. Switch to your intraday layout at the open — the gapper snapshot stays accessible on the dedicated page.
## Filtering setups by gapper status
In the [Setups Table](/scanner/setups-table), toggle the **Gapper** filter to show only symbols that are currently flagged as gapping. This narrows the table to names with active pre-market gaps, so you can focus on setups forming on gapping stocks.
The **Gap** column displays the signed gap percentage for every row, regardless of filter state. Kicker gaps are visually distinguished with an orange ring highlight — hover over the chip to see a **Kicker** tooltip confirming the flag.
Gapper flags are updated in real time during pre-market and reset after the session opens. If you're looking at the Setups Table during regular hours, the Gapper filter reflects the final pre-market snapshot.
## Sorting
On the dedicated gappers page, click any sortable column header to reorder the table. Available sort fields are:
* **Ticker** — alphabetical
* **Gap %** — by percentage (default: largest absolute gap first)
* **Gap \$** — by dollar amount
## Timing and availability
| Phase | Behavior |
| ---------------------------------- | ------------------------------------------------------------------------------------------- |
| **Pre-market** (4:00 AM – open) | Scanner is active. Table refreshes every 2 seconds. |
| **Regular session** (open – close) | Scanner is paused. Last pre-market snapshot is displayed. Refresh rate slows to 15 seconds. |
| **After hours / weekends** | Scanner is paused. No data displayed. |
The gappers scanner relies on real-time pre-market trade data. Symbols with no pre-market trades will not appear in the results, even if they have significant overnight news.
# Keyboard Shortcuts
Source: https://docs.stratalerts.com/scanner/keyboard-shortcuts
Navigate the StratAlerts app instantly with single-key shortcuts. Press ? anywhere to see the full list in-app.
StratAlerts supports single-key shortcuts that jump you directly to core sections of the app. Press the key anywhere — no modifier required — and the app navigates immediately. Press **?** to open a shortcuts modal inside the app that lists every active shortcut.
## Shortcut reference
| Key | Destination | Notes |
| ----- | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **/** | Quick Search | Search for one or more tickers and load setups |
| **M** | Mission Control | Jumps to your primary trading dashboard |
| **S** | Setups Table | Opens the setups table for filtering and browsing |
| **A** | Alerts | Opens the live in-force alert stream |
| **B** | Simultaneous Breaks | Opens the multi-index directional break panel |
| **W** | Watchlists | Opens your saved watchlists |
| **Q** | AI Search | Opens the AI-powered search modal |
| **E** | Execution | Opens the execution app (staff only) |
| **P** | Open Positions | Opens the open positions view (staff only) |
| **?** | Shortcuts modal / Help menu | Shows all available shortcuts in an overlay. On desktop, the **?** button also appears in the navbar between the universe picker and theme toggle — click it for quick links to **What's New**, **Help**, **Documentation**, and **Feedback**. The menu footer also reminds you that **?** opens shortcuts and **/** opens quick search. |
Shortcuts work from any page in the app. If a text input or modal is focused, shortcuts are suppressed so they don't interfere with typing.
## Using the shortcuts modal
Press **?** at any time to open the shortcuts modal. The modal lists every shortcut currently available to your account. Close it by pressing **Escape** or clicking outside the overlay.
If you're new to the app, pressing **?** is the fastest way to discover navigation options without searching through menus.
# Maps
Source: https://docs.stratalerts.com/scanner/maps
A Finviz-style market treemap that visualizes the entire stock, futures, and crypto landscape grouped by sector or product family, colored by daily gain or loss, and sized by market-specific importance metrics.
The **Maps** page gives you a single-screen visualization of how the market is moving. Each symbol is rendered as a tile inside a sector or product-family group, sized by importance and colored green or red based on its daily percent change. Press the link from the sidebar — the **Maps** entry sits below **Earnings** — or navigate directly to **/maps/**.
## What the map shows
The map is split into the three core market views, each with its own grouping and sizing logic:
Equities grouped by the same broad sector labels used on the [Setups Table](/scanner/setups-table). Tile size is driven by importance metrics like market cap, with sensible fallbacks when full sizing data is unavailable.
Index, energy, metals, and rates futures grouped by product family. Tile size reflects volume-weighted importance for each contract.
Major crypto pairs grouped by product family, sized by market cap importance.
Tiles are colored by daily percent change — bright green for the strongest gainers, deep red for the largest decliners — so you can read leadership and breadth at a glance without scrolling through individual quote panels.
## How prices update
The map uses live trade data when the underlying market is open. When live `change_pct` is unavailable — for example, before the 4 AM ET premarket handoff or over the weekend — the map falls back to the last completed daily close and the prior-day percent move so tiles still show meaningful values instead of going blank.
For stocks and futures, the Friday close-to-close move stays visible until the next session opens. For crypto, where trading is continuous, the map reflects the rolling 24-hour move when live snapshots are temporarily unavailable.
## Interacting with tiles
Hover over any tile to open a detail card showing the symbol, percent change, and supporting context. The hover card automatically flips above or to the left when you hover near the chart edges, so it never covers the symbol you are inspecting at the bottom or right of the map.
Click a sector or product-family header to open a full-screen map card showing only the symbols in that group. Symbol tiles are rendered at full size inside the card, so you can read smaller names that get squeezed out of the top-level overview.
Click any symbol tile to open the [Setups Table](/scanner/setups-table) filtered to that ticker across all timeframes — the same deep-link behavior used by the Setups Feed and Earnings Calendar panels.
## When to use it
Use Maps as a fast pre-session scan to see where leadership is coming from before you commit to a directional bias. If energy is bright green across the board while tech is mixed red, that is a clear signal to look for setups in the leading group first. During the session, refresh the map to confirm whether the move is broadening or narrowing — a single name carrying a sector is a different read than the entire group moving together.
Pair Maps with the [Sector Performance Matrix](/scanner/mission-control#sector-performance-matrix) on Mission Control. The treemap gives you the visual sweep across the entire market; the matrix gives you the sortable, multi-timeframe breakdown for the sectors you want to drill into.
# Mission Control
Source: https://docs.stratalerts.com/scanner/mission-control
Mission Control combines a live alerts stream, metrics alerts, simultaneous breaks, setups feed, and market breadth in one view — your primary scanner surface each session.
## Your Live Trading Dashboard
Mission Control is the main hub you'll work from during a live session. Rather than jumping between separate tools to check alerts, monitor breadth, and scan setups, everything surfaces in one view — updated in real time as the market moves. Press **M** anywhere in the app to jump straight to it.
Look for the **?** button in the desktop navbar — between the universe picker and theme toggle — for quick links to **What's New**, **Help**, **Documentation**, and **Feedback** without leaving your current page.
## Header tape
The header tape is the scrolling ticker strip at the top of Mission Control. It shows live prices and percentage changes for the MAG 7 equities (AAPL, MSFT, NVDA, AMZN, META, GOOGL, TSLA) and major crypto pairs, giving you an at-a-glance read on the market's biggest names without taking up panel space.
Each ticker in the tape is clickable. Click any symbol to open the [Setups Table](/scanner/setups-table) filtered to that symbol across all timeframes — the same deep-link behavior you get from the Setups Feed and Earnings Calendar panels. Crypto tickers link to the crypto view of the Setups Table automatically.
The tape switches between equities and crypto based on your active universe selection, and prices update on a short polling interval so values stay current throughout the session.
## Core panels
Mission Control ships with over 30 panels organized into categories. Use the **Add Panels** chooser to browse available panels by category, read descriptions, and add them to your layout. Below are the core (equities and futures) panels.
### Realtime
Displays in-force alerts the moment a setup triggers. Each row shows the symbol, a dedicated **Detected** column with a time-only `HH:MM:SS` timestamp, timeframe, and setup sequence — keeping the table compact and scannable during fast-moving sessions. New alerts push to the top so the freshest signals are always visible first. The stream uses [cursor-based reconnection](/scanner/alerts#live-stream-reconnection) to replay missed alerts after a disconnect, so your view stays accurate without manual refreshes.
Flags when multiple index futures (ES, NQ, RTY, YM) break the same direction within the same detection window. Each row opens with a **Detected** column showing a time-only `HH:MM:SS` timestamp so you can quickly judge how tightly clustered the breaks were. Coordinated moves appear here as soon as the threshold is crossed.
Streams live events from your active [metric alert rules](/scanner/alerts#metrics-alerts) — RVOL spikes, VWAP band touches, ATR High/Low proximity, Initial Balance breaks, ORB breaks, and RSI superstacks — directly inside Mission Control. The panel shows a compact four-column table (Rule, Symbol, Event, Detected) and connects to the same websocket feed used by the standalone Metrics page, so events appear simultaneously in both places.
### Setups and scanners
A scrollable, real-time view of active setups across the scanned universe. Each row includes candle state (C2, C1, CC), in-force status, P3 flag, and PMG level so you can read a setup at a glance without opening the full table. Click any ticker to open the [Setups Table](/scanner/setups-table) filtered to that symbol across all timeframes, so you can drill into the full setup context without manually entering filters. Futures and crypto rows link directly to their respective market views. The feed auto-refreshes on a short interval while the tab is visible, so expired setups drop out without a manual reload.
Stocks with the largest price gaps from the previous close, ranked by gap size, to help you spot potential opening moves. Kicker gaps are flagged separately.
Ranks pre-trigger setups by how close price is to the trigger level and how fast the current bar is moving toward it — useful for catching setups about to go in force.
Ranks stock setups by session-strength spread versus SPY or a sector ETF, helping you identify names outperforming or underperforming the benchmark.
Tracks the largest percentage moves across core equities, futures, and crypto in real time. Sortable timeframe columns let you compare moves across intraday and daily windows, and matrix-style colored chips make direction obvious at a glance.
High-level scanner activity and flow across your watch universe, giving you a sense of how active the setup landscape is right now.
### Breadth and internals
Shows the distribution of candle types (1, 2U, 2D, 3) across timeframes, giving you a directional read on how broad or narrow participation is before you commit to a trade.
Timeframe continuity and candle type for the major indices (SPY, QQQ, DIA, and IWM), or a custom watchlist of tickers. Both static and [dynamic watchlists](/context/watchlists#dynamic-watchlists) appear in the filter dropdown, so you can scope the matrix to a rule-based symbol set that updates automatically after the close.
Track all major sectors at a glance with sortable timeframe columns to identify the leaders and laggards.
A fast sector-level view showing which groups are leading or lagging at a glance.
Setup counts broken out by direction and timeframe, so you can see how many bullish or bearish setups are active across the scanned universe at any given moment.
Daily breadth charting to frame trend strength and reversals over time.
### Calendar and events
Stay informed about upcoming market-moving events like FOMC, PPI, jobless claims, Fed speakers, PMI, and consumer sentiment.
See which companies report earnings for the week, filtered by level of importance. Click any symbol to open the [Setups Table](/scanner/setups-table) filtered to that ticker across all timeframes, so you can review the setup landscape before or after an earnings event without leaving Mission Control.
### Utility and context
An overview of how the futures indices (ES, NQ, YM, and RTY) traded overnight, using quote-native prior-close percentages that match live futures quote widgets.
A compact VIX visualization with a 7-day chart, numeric labels, and hover values so you can gauge volatility conditions without leaving the dashboard.
A compact snapshot of where the current candle sits across timeframes for the instruments you're watching.
Current and upcoming market session timings at a glance — Globex, Asia, London, and New York — with session countdown badges in the header.
### News and audio
Latest FinancialJuice macro headlines inside Mission Control, so you can monitor news flow without leaving the dashboard.
FinancialJuice squawk controls and playback directly in the dashboard for live audio news during your session.
## Crypto panels
Mission Control includes a dedicated crypto universe with panels tailored for cryptocurrency markets. Switch to the crypto view using the market selector or add crypto-specific panels alongside your core panels.
Live tape for major crypto pairs and market leaders, showing real-time price action as it happens.
Current candle classifications for major crypto pairs across multiple timeframes, similar to the core Ticker Matrix but tuned for the crypto universe.
Top moving crypto pairs with fast relative performance, helping you spot momentum in the crypto market.
Open-interest leaders showing notable derivatives positioning shifts, useful for gauging leveraged sentiment.
Crypto sentiment context from the Fear and Greed Index, giving you a quick read on market psychology.
Global crypto market cap and participation context to frame whether the broader crypto market is expanding or contracting.
Setup counts tuned for the crypto universe and key timeframes.
Crypto breadth overview to see how broad or narrow participation is across the crypto market.
Derivatives-flow snapshot for liquidation and leverage context across crypto markets.
## Panel chooser
Click **Add Panels** to open the panel chooser modal. Panels are grouped by category — Realtime, Setups/Scanners, Breadth/Internals, Calendar/Events, Utility/Context, and News/Audio — with thumbnail previews and descriptions so you can browse what's available before adding anything to your layout. Panels you've already added are marked, and subscription-locked panels show a lock icon with a prompt to upgrade.
## Biggest Movers
The **Biggest Movers** panel surfaces the stocks, futures, and crypto instruments with the largest percentage price moves in real time. It is available for both the **core** (equities and futures) and **crypto** markets.
Each row displays a symbol and its percentage change across multiple timeframe columns. The values render as matrix-style colored chips — green for positive moves, red for negative — so you can read direction without parsing numbers. Columns are sortable: click any timeframe header to rank the universe by that window's move size.
The panel includes selectable timeframe chips — **15m, 30m, 60m, 4H, 12H, D, W, M, Q, Y** — so you can choose which windows appear as columns. A numeric row-count input lets you show anywhere from **1 to 25** symbols at a time, keeping the panel compact or expanded depending on how much screen space you want to dedicate. Your custom row count is saved per layout, so a value like **22** persists across sessions. These preferences reset to the default set (**60m, 4H, D, W, M**) when you clear the panel state.
Use the toggle at the top of the panel to switch between **core** (equities and futures) and **crypto** views. Within the core view, you can further toggle visibility between equities and futures to focus on one asset class at a time.
Check Biggest Movers during a session to identify names with outsized momentum. A stock making the biggest daily move may be reacting to a catalyst worth investigating, and seeing which timeframe is driving the move helps you decide whether the momentum is intraday noise or a developing trend.
Pair Biggest Movers with the Setups Feed. If a name shows up as a top mover and also has an active Strat setup going in force on the same timeframe, that convergence strengthens the signal.
## Sector Performance Matrix
The **Sector Performance Matrix** panel tracks percentage moves for all major sectors across multiple timeframes, giving you a quick read on which sectors are leading or lagging.
Click any timeframe column header to sort sectors by that window's performance. Your sort selection persists across live data refreshes — the panel won't snap back to a default sort every time new data arrives. If you sort by a timeframe column that later becomes hidden, the sort falls back to a visible column instead of breaking silently. Click **Reset** to restore the default **D** (daily) descending sort.
Use the timeframe chips at the top of the panel to choose which columns are visible. When all timeframes are selected, the chips show a filled **All** state. Deselecting individual chips narrows the view. The same pattern applies to sector chips if you want to focus on a subset of sectors. Your selection is preserved across data refreshes.
## Setups Feed drag reordering
When the Setups Feed is grouped by ticker, you can drag ticker-group sections into a custom order. Grab a group header and move it up or down — a bright insertion bar tracks the exact drop edge so you can see where the group will land before you release. Your custom order is saved per layout and persists across page reloads, live data refreshes, and filter changes.
Each ticker group in the feed has a drag handle on its header row. Click and hold the handle, then drag the group to a new position. The feed highlights the target location with a visible insertion bar and a stronger background highlight on the drop zone. Release to confirm the new order.
The reordered arrangement is saved immediately to your layout preferences. Live websocket refreshes and short-interval data updates respect your custom order — the feed does not snap back to a default sort when new data arrives.
Use drag reordering to pin the symbols you care about most to the top of the feed. If you always want to see `NQ=F` and `ES=F` first during a futures session, drag those groups to the top and they stay there — even when other symbols are temporarily filtered out and reappear later.
Your drag order is scoped to the current layout. When you save and reapply a [playbook](/scanner/playbooks), the Setups Feed restores the ticker-group order that was active when the playbook was saved. Switching between playbooks swaps the group order along with your other filter and panel preferences.
Drag reordering loads immediately when the page opens — you do not need to enable it or reload after your first visit. If you want to reset to the default order, clear the panel state from the panel menu.
## Metrics Alerts panel
The **Metrics Alerts** panel gives you a compact, live stream of events from your active [metric alert rules](/scanner/alerts#metrics-alerts) without leaving Mission Control. It reuses the same websocket feed as the standalone **Alerts → Metrics** page, so every event that appears there also appears here — no separate configuration required.
The panel renders a fixed four-column table:
| Column | Description |
| ------------ | ------------------------------------------------------------------------ |
| **Rule** | The name of the metric alert rule that fired |
| **Symbol** | The ticker that triggered the event |
| **Event** | The event type and direction (e.g., `ibal_bull_break`, `rsi_superstack`) |
| **Detected** | Second-precision timestamp of when the event was detected |
Columns like observed value, threshold, and timeframe are omitted to keep the panel compact. Open the standalone [Metrics page](/scanner/alerts#metrics-alerts) when you need the full event detail.
The panel includes a single preference: the rolling time window that controls how far back events are shown. Available windows are **15 minutes**, **30 minutes**, **1 hour**, **2 hours**, and **4 hours**. The default is 30 minutes. Your selection is saved per layout, so different layouts can use different windows.
Open the panel settings (gear icon in the panel header) to change the window.
The Metrics Alerts panel has its own **Voice On/Off** toggle in the panel header, separate from the Realtime Alerts and Sim Breaks voice toggles. When enabled, your browser speaks each new live event in the format ` ` — for example, `TSLA 60 minute are vol entered high` or `NQ Globex initial balance bull break`.
The toggle is off by default. Click **Voice Off** in the panel header to enable it; click **Voice On** to mute. Your preference is saved server-side alongside your other Mission Control voice settings, so it persists across devices and is captured in [playbooks](/scanner/playbooks).
Speech transformations are tuned for trading symbols and rule names:
* **Symbols** — futures `=F` suffixes and `USDT` / `1000` crypto modifiers are stripped. Pronounceable tickers (e.g., `TSLA`) are read as words; non-pronounceable tickers (e.g., `MSFT`) are spelled letter by letter.
* **Timeframes** — `15` / `30` / `60` are spoken as "15 minute" / "30 minute" / "60 minute"; `4H` and `12H` as "4 hour" and "12 hour"; `D`, `W`, `M`, `Q`, `Y` as "daily", "weekly", "monthly", "quarterly", "yearly". Sessions like **Globex**, **NY**, and **London** are spoken as-is.
* **Event labels** — common indicator prefixes are pronounced naturally: `rvol` → "are vol", `atr` → "a t r", `rsi` → "r s i", `vwap` → "vee whop", `ibal` → "initial balance", `orb` → "orb".
Live events are deduplicated, so reconnecting or reloading the page does not re-speak events you already heard.
Add the Metrics Alerts panel when you want to monitor metric-based signals alongside your setup alerts and breadth panels in one view. If you already have RSI superstack, RVOL, VWAP, Initial Balance, ATR High/Low, or ORB rules configured under **Alerts → Metrics**, this panel surfaces those events in real time without switching pages. Enable the panel's voice toggle when you want to step away from the screen and still hear new metric events as they fire.
The Metrics Alerts panel requires active metric alert rules to show events. If the panel is empty, create rules under [Alerts → Metrics](/scanner/alerts#metrics-alerts) first, then add the panel to your Mission Control layout.
## Working through the session
Press **M** to navigate directly to Mission Control. You can also access it from the main navigation. The page loads with your last-used filter state intact.
As setups go in force, alerts appear in real time. Each row shows the symbol, a **Detected** timestamp in `HH:MM:SS` format, timeframe, and setup sequence. The stream is chronological — most recent first.
When two or more index futures break in the same direction within the detection window, the simultaneous breaks panel updates immediately. A threshold badge (2/4, 3/4, or 4/4) shows how many instruments are participating.
Scan the setups feed for names that match your criteria. The feed reflects the same data as the full Setups Table but presents it in a compact, continuously updating view built for monitoring, not deep filtering. Click any ticker to jump to the Setups Table filtered to that symbol across all timeframes for deeper analysis.
Before acting on an alert, glance at the breadth panel. Trading in the direction of the most 2s — and 2s going 3 — is a core principle of the Strat methodology. Breadth tells you whether conditions support that direction broadly or only in isolated names.
## Layouts and sharing
You can create multiple saved layouts, each with its own panel arrangement and sizing. Clone a layout to experiment without losing your current setup, or set a layout as your primary so it loads by default.
To share a layout with another user, generate a short-link code from the layout menu. Anyone with that link can import the layout into their own account. Panels the recipient doesn't have access to are silently stripped so the layout still loads cleanly.
Try building separate layouts for different session phases — a pre-market layout focused on gappers and overnight context, and an intraday layout centered on the alerts stream and simultaneous breaks.
## Playbooks
Layouts control how your dashboard looks. [Playbooks](/scanner/playbooks) control how your scanner behaves. A playbook saves the active filters, panel preferences, timeframe selections, watchlist selections, and scanner voice settings as a reusable preset. Applying a playbook changes the scanner's operating mode without rearranging your panels — your workspace structure stays intact while the focus shifts instantly. Watchlist filters on the Setups Feed are preserved when you save and reapply a playbook, so switching back to a watchlist-based playbook restores the expected ticker list.
Use playbooks when you want one layout to serve multiple scanning routines — for example, an intraday mode with shorter timeframes and tighter thresholds, a swing mode with broader filters, or a sector-focused scan. See the [Playbooks page](/scanner/playbooks) for full details.
## Market filter
The setups feed on Mission Control can be scoped by asset class. Use the market selector to switch between **Stocks**, **Futures**, **Crypto**, or the default **All** view. Your selection narrows the symbols shown in the feed and in the alerts stream.
The simultaneous breaks panel always watches ES, NQ, RTY, and YM regardless of your market filter. Those four instruments are the cohort used for detection.
## Watchlist filters
The setups card, alerts card, and ticker matrix each include a watchlist filter dropdown. Select any of your watchlists — static or [dynamic](/context/watchlists#dynamic-watchlists) — to scope that panel to only the symbols on that list. Dynamic watchlists are labeled in the dropdown so you can tell them apart from manually curated lists.
This is especially useful with dynamic watchlists: define a set of filter rules once, and the resulting symbol list automatically feeds into your Mission Control panels each session without manual updates.
## Panel availability
Not every panel is visible to every user. Panel access depends on your subscription tier and rollout status.
### By subscription tier
Basic plan subscribers can access the Mission Control dashboard, but four panels are reserved for the Founders Plan:
* **Alerts stream** — Founders Plan only
* **Simultaneous breaks** — Founders Plan only
* **Sectors snapshot** — Founders Plan only
* **Sector performance matrix** — Founders Plan only
If you are on the Basic plan, these panels are hidden from the panel chooser and do not appear in your layouts. All other panels — including the setups feed, biggest movers, economic events, overnight context, VIX, earnings calendar, top gappers, relative strength, and top movers into trigger — are available on the Basic plan.
Upgrading to the Founders Plan makes the restricted panels appear automatically. If you have a shared layout that includes Founders-only panels, those panels load as soon as your subscription covers them.
### By rollout status
* **General availability** — most panels are visible to all paid users and appear in the chooser by default.
* **Beta panels** — panels being tested may be available only to beta testers. If you're a beta tester, these panels appear in the chooser alongside general-availability panels. Other users won't see them.
* **Staff-only panels** — a small number of panels are reserved for staff. These never appear in the chooser for non-staff users.
If a panel you previously added to your layout is later restricted, it's automatically removed from your saved layout the next time the page loads — you won't see an empty or broken panel shell. The same applies when you import a shared layout: any panels you don't have access to are silently stripped so the layout still loads cleanly.
If a panel you expected to see is missing from the chooser, it may require the Founders Plan or be in a restricted rollout. Check the [pricing page](/pricing) to compare plans, or reach out to support.
## Mobile access
The core Mission Control workflow holds up on a phone or tablet. The panels stack vertically so you can monitor the alerts stream and check breadth context when you're away from your desk. Push notifications through Pushover or Telegram let alerts reach you even when you're not looking at the screen.
Pair push notifications with Mission Control so you never have to sit in front of the screen waiting for a trigger. Set up your delivery preferences under **Alerts → Settings** and let the notification bring you back to Mission Control when something fires.
## Keyboard shortcut
| Key | Action |
| ----- | ------------------------------------------------ |
| **M** | Jump to Mission Control from anywhere in the app |
# Playbooks
Source: https://docs.stratalerts.com/scanner/playbooks
Playbooks let you save the way your scanner is configured without changing the layout of your dashboard.
## Overview
Think of a playbook as a reusable behavior preset: it remembers the supported filters, panel settings, and scanner voice preferences you are using right now, then lets you apply that same setup again later with a single click.
This is important because there is a big difference between how your scanner looks and how your scanner behaves. Your layout controls structure: which panels are visible, where they sit, how large they are, and how your workspace is arranged on screen. A playbook controls behavior: the active scan settings, panel-specific preference snapshots, and supported voice/alert state that determine what the scanner is focusing on. That separation is what makes playbooks so useful. You can keep a layout that already works for you and switch the scanner's operating mode instantly, without rebuilding the page or loading a completely different dashboard.
## How Playbooks Work
When you create a playbook, the scanner takes a snapshot of the current supported Mission Control state for your active layout. That snapshot includes the playbook-capable panel preferences the system is designed to carry forward, along with the associated voice preferences. In practical terms, that means a playbook can preserve the filters you are scanning with, selected timeframes, thresholds, sector selections, and scanner voice behavior, depending on the panel.
Once saved, that playbook becomes a named, reusable preset in your personal scanner workspace. You can:
* Save the current scanner state as a new playbook
* Apply an existing playbook to the current layout
* Overwrite a playbook with your latest scanner state
* Delete playbooks you no longer use
* Restore layout defaults when you want to remove playbook-driven behavior and go back to the baseline state for the current layout
Applying a playbook does not swap you into a new layout. Instead, it copies the playbook's supported behavior settings onto the layout you are already using. That means your panel placement, overall geometry, and workspace structure stay intact while the scanner's operating profile changes underneath it.
## What Playbooks Save, and What They Do Not
A good way to understand playbooks is to think of them as behavior snapshots, not layout snapshots.
A playbook is designed to save the parts of the scanner that affect how it scans and how certain panels behave. This can include supported filter state, timeframe selections, thresholds, sector selections, and scanner voice preferences. These settings change the character of the scan.
A playbook is intentionally not designed to rearrange your workspace. It does not replace your layout, move your panels, resize them, or turn the feature into a layout-cloning system. That boundary is deliberate. Layouts and playbooks solve different problems:
* Layouts define your workspace structure
* Playbooks define your scanner behavior
That separation makes the system much easier to use. If you want a different workspace arrangement, use layouts. If you want the same workspace to behave differently for a different scanning job, use a playbook.
## Why Playbooks Matter
Playbooks are powerful because they remove repetitive setup work from the scanning process. Many users don't want to rebuild filters, reset panel preferences, and reconfigure scanner behavior every time they switch from one kind of market read to another. Playbooks turn those repeated setup patterns into one-click workflows.
They are especially valuable because they keep your mental model clean. Instead of asking, "Do I need a new layout for this?" you can keep one layout you already like and simply apply a different playbook. That makes the scanner feel faster, more flexible, and easier to trust. Your screen stays familiar, but the scanner's focus changes instantly.
They also improve consistency. If you discover a setup that works well for a specific use case, you can save it as a playbook and reuse it exactly, instead of trying to recreate it from memory. That is useful for anyone who has multiple scanner routines, multiple market conditions they watch for, or different workflows throughout the trading day.
In other words, playbooks help turn the scanner from a configurable tool into a repeatable operating system. They let you move from "I need to set this up again" to "I already have a saved operating mode for this."
### Real Scanner Workflow Example
In a live scanner, speed and repeatability matter. Users often shift between different modes of analysis:
* An intraday scanning mode focused on shorter timeframes and tighter thresholds
* A swing-oriented mode with broader timeframes and different filtering logic
* A sector-focused mode that changes what the scanner emphasizes
* A quieter or more active voice/alert mode, depending on what they want the scanner to surface
Without playbooks, changing between those modes means manually editing multiple controls and hoping nothing important gets missed. With playbooks, the scanner can jump directly into the right mode while the workspace itself stays stable.
That is a better experience because users usually want continuity in the dashboard they have already built. They want their familiar panel arrangement, but they also want the freedom to tell the scanner, "Now behave like my intraday setup," or "Now switch to my higher-timeframe review mode." Playbooks are what make that possible.
## Restore Layout Defaults
One of the most useful parts of the feature is the ability to restore layout defaults. This gives users a clean way to remove playbook-applied behavior from the current layout without disturbing the layout itself.
That matters because playbooks are meant to be layered on top of your existing workspace. The restore action acts as the inverse of apply: it clears the playbook-managed behavior and returns supported settings to the layout's default baseline, while leaving panel placement and overall geometry unchanged. This gives users confidence to experiment, because applying a playbook never feels permanent or risky.
## Watch a Demo
# Setups Table
Source: https://docs.stratalerts.com/scanner/setups-table
The Setups Table shows every active Strat setup across all scanned instruments. Sort, filter by sequence or timeframe, save views, and run AI Search queries.
The full Setups Table requires an active **Basic** or **Founders Plan** subscription. Free accounts can browse a limited view, but filtering, saved views, and AI Search require a paid plan. [Compare plans →](/pricing)
## Filter and Browse Active Strat Setups
The Setups Table is where you go when you want to scan broadly rather than react to a single alert. It presents every active setup across the entire universe — stocks, futures, and crypto — in a sortable, filterable grid. Press **S** anywhere in the app to open it directly.
## Columns at a glance
Each row represents one active setup on one timeframe. The table ships with a default column set you can reorder and hide to fit your workflow.
**Symbol** is the ticker. **TF** (Timeframe) is the candle period the setup lives on — 15m, 30m, 60m, 4H, 12H, D, W, M, Q, or Y. Most traders focus on daily and higher timeframes for swing setups and intraday timeframes for session-day entries.
Shows the alignment of directional candles across higher timeframes. A fully green TFC column on a daily setup means the weekly, monthly, quarterly, and yearly candles are all pointing the same direction — a strong tailwind for the trade.
**Failed-state chips** are flagged with a distinct visual treatment when a timeframe's TFC color contradicts its candle state — a green chip displaying a `2D` candle, or a red chip displaying a `2U`. These signal a higher-timeframe candle that has failed against the prevailing continuity, which often precedes a reversal or compression. Use failed-state chips as a heads-up that the trend on that timeframe is breaking down, even if the broader TFC stack still looks aligned.
The three-candle setup structure: **C2** is the target candle (the one you're aiming for), **C1** is the trigger candle (the one whose high or low gets breached to activate the setup), and **CC** is the current candle forming right now. Each cell shows the candle ID: 1 (inside), 2U (up), 2D (down), or 3 (outside).
A setup goes in force when price breaks above the trigger high (bullish) or below the trigger low (bearish). The **IF** column flags setups that are currently active — price has already crossed the trigger level and the trade is live.
The **P3** flag marks setups where the current candle is a 3 (outside bar), creating a potential three-candle outside bar setup. P3 setups in force carry elevated urgency because an outside bar can resolve quickly in either direction.
**PMG** shows the price level where the setup reaches its maximum potential gain — typically the magnitude level derived from the target candle's range projected outward. It gives you a reference for where the move could go if it runs.
The candlestick pattern of the trigger candle — hammer, shooter, doji, or standard. Shape context helps you evaluate the quality of the trigger before acting.
**ATR** (Average True Range) quantifies expected daily movement. **RVOL** shows relative volume compared to the 10-day average, displayed as a plus or minus deviation. High RVOL alongside a trigger often means participation is expanding.
**Vol** is the symbol's session volume so far, formatted compactly (for example, `1.23M` or `45.6K`). It updates throughout the regular session and gives you a quick read on whether participation is unusually heavy or light alongside RVOL.
**PM Vol** is the cumulative pre-market volume for the current session, sourced from real-time stock aggregate trades during the 4:00 AM ET to 9:30 AM ET pre-market window. It's available for equities only — futures and crypto rows leave the column empty. Use it alongside the **Gap** column to confirm that pre-market gaps are backed by real participation rather than a few thin prints.
Both columns are sortable and accept numeric header filters (for example, typing `1000000` shows only rows with at least 1M volume). They're hidden by default on narrow layouts — right-click any column header to toggle them on. The PM Vol value persists through the regular session so morning context stays visible all day.
The **Gap** column shows the signed premarket gap percentage for each symbol. Kicker gaps — unusually large moves relative to recent range — are highlighted with an orange ring so they stand out. Hover over a ringed chip to see a **Kicker** tooltip confirming the flag. Use this column alongside the **Gapper** filter to focus on names gapping into potential setups. See the [gappers scanner](/scanner/gappers) page for details on how gaps and kickers are detected.
**ATH** (All-Time High) and **ATL** (All-Time Low) columns show how close the current price is to the historical extremes. Available for equities and crypto. Use the **Near ATH** or **Near ATL** filter to surface symbols approaching these levels — breakouts at all-time highs or reversals at all-time lows often attract heavier participation.
**Sector** groups the symbol into its SPDR sector for context. **ER** (Earnings) badges flag symbols with earnings inside the current weekly window so you can factor event risk before entering.
## Filtering setups
The filter panel above the table lets you narrow the universe to exactly the setups you care about. Filters stack — combine as many as you need. Admins can also edit the same filters in the [filter modal](#filter-modal) launched from the toolbar when they want a larger, focused view of every control.
Pick a C2-C1 or C2-C1-CC sequence from the setup dropdown: for example, **1-2U** (inside day into up candle), **2D-3** (down candle into outside bar), or **1-2-2** (inside day, two-candle sequence into another two). The filter expands shorthand entries automatically — typing `2` matches both `2U` and `2D` continuations.
Filter by the state of the current candle: **1** (inside), **2U**, **2D**, **3**, **2D-green** (failed bearish), **2U-red** (failed bullish), **3-green**, or **3-red**. The detail values let you filter on candle color as well as candle type.
Scope the table to a single timeframe or click **All** to view setups across every timeframe at once. This is useful when preparing for the open and you only want to see daily setups, or during the session when you're scanning 60m names.
Toggle the **In-Force** filter to show only setups where price has already cleared the trigger. These setups are live trades, not pending ones.
A continuation occurs when C1 and CC are the same directional 2 candle (e.g., 2U trigger with a 2U current candle). Toggle **Hide Continuations** to remove these from the table and focus on fresh triggers instead.
Use the **Favorites** filter to restrict the table to symbols on your watchlists. Use the **Gapper** filter to surface symbols showing significant pre-market gap moves — useful for morning setups. Kicker gaps are flagged separately for outsized moves. Learn more about how gap detection works on the [gappers scanner](/scanner/gappers) page.
The **C2 Color** and **C1 Color** filters let you narrow results by the color of the target or trigger candle — for example, only setups where C1 closed green (bullish trigger) or C2 was red (bearish target). Candle-color filters are preserved in saved views.
## Filter modal
The **Filters** toolbar button that opens this modal is currently gated to superuser accounts while we finish rolling out the roomier layout. The persistent filter panel above the table — and the mobile slide-over drawer — remain available to everyone, with the same controls. If you don't see the **Filters** button in the desktop toolbar, you have full access to the same filters from the panel directly above the table.
The persistent filter panel above the table stays visible on desktop, so the controls you reach for most are always one click away. When you want a roomier layout — for example, when reviewing every filter at once or working on a smaller laptop screen — superusers can open the **Filters** modal from the toolbar above the table.
Click **Filters** in the toolbar (next to the row count and pagination). The button only appears for superuser accounts. The modal opens centered on screen and temporarily hosts the same filter form used by the persistent panel.
The modal lays the controls out in a condensed three-column grid with inline labels — symbol, market, ticker group, and watchlists on the left; In-Force, TFC, P3, C1 shape, and CC in the middle; and a combined market-cap min/max row, C2/C1 color, near extremes, earnings, hide continuations, and limit on the right. Advanced filters appear inline alongside the rest of the controls, so the **Advanced** toggle from the persistent panel is hidden while the modal is open. The setup-sequence dropdown is the one persistent-panel control that's omitted from the modal — keep using the persistent panel for that. Anything you change is applied to the same underlying form.
Submit the form to reload the table with the new filters, or click the **×** in the modal header to dismiss it. The persistent panel reflects the same state as soon as the modal closes.
The modal is a desktop convenience layer on top of the existing panel — not a replacement. On phones and small tablets the filters still open as a full-screen slide-over drawer from the **Filters** button in the mobile toolbar.
## Sorting
Click any column header to sort the table by that column. The first click sorts in descending order, the second sorts in ascending order, and the third clears the sort.
### Multi-column sorting
Hold **Shift** and click additional column headers to stack multiple sorts at once. The table uses the order you clicked — the first column you sort on stays the primary sort, and each subsequent **Shift**-click adds a secondary, tertiary, and so on.
When sorting by change-percent columns across several timeframes, click the broadest timeframe first and work inward. For example, **Shift**-click **Y**, then **Q**, then **M**, then **W**, then **D** to keep yearly as the primary sort and daily as the last tiebreaker. This way, the broader trend context stays dominant.
Multi-column sorting is especially useful for finding symbols that are trending consistently across timeframes — sort by yearly first, then quarterly and monthly, and the top rows will show names with strong alignment from macro down to micro.
## Saved views
Once you've built a filter combination you use regularly, save it as a named view.
Set up the combination of setup sequence, CC state, timeframe, and other filters that defines the view you want to save.
Click the save icon in the filter bar and give the view a name. Your saved views appear in the views menu and persist across sessions.
Open the **Views** dropdown to see all your saved views. Each row has an **Apply** button to load that view's filters and a **Delete** button to remove it. You can delete any view directly from the list without needing to select it first.
Frequently used views can be pinned to the filter toolbar as chips. One click activates the full filter state — no need to open the views menu.
Saved views are available to all logged-in users — no active subscription is required. You can create, update, and delete views as soon as you have an account.
Good candidates for saved views: "Daily in-force," "Weekly P3 setups," "Intraday 1-2U," or "Stocks only, no continuations." Build views that match your actual session workflow so switching between contexts takes a single click.
## AI Search
Click the **wand button** (✦) next to the gear menu in the toolbar to open AI Search, or press **Q** on your keyboard. The AI Search bar accepts natural language queries and translates them into table filters for you. Instead of manually selecting options, type what you're looking for.
AI Search understands Rob Smith's Strat terminology natively — candle IDs (`1`, `2U`, `2D`, `3`), failed states (`failed 2D`, `failed 2U`), setup sequences (`1-2U`, `2D-3`, `1-2-2`), and qualifiers like "in force," "continuation," or "gapper" all work as expected. A bare `2` expands to match both `2U` and `2D`.
**Example queries:**
* `all inside days` — shows setups with a 1 (inside) candle on the daily timeframe
* `2U weeks in force` — weekly setups where C1 is 2U and price is above the trigger
* `daily outside bars going up` — daily 3 candles with an up direction flag
* `1-2U intraday with high volume` — 15m through 4H setups matching that sequence, sorted by RVOL
* `1-2D green on the daily` — daily 1-2D setups where the trigger candle (C1) closed green
* `red C2 on the weekly` — weekly setups where the target candle is red
* `week and month are 2U` — multi-timeframe query returning symbols that are 2U on both weekly and monthly
* `day in force and week in force` — symbols in force on both the daily and weekly timeframes
When you include a candle color like "green" or "red" alongside a setup sequence, AI Search applies the color to the trigger candle (C1) by default. To target the target candle instead, say "green C2" or "red target candle" explicitly.
## Multi-timeframe analysis (MTA)
MTA mode lets you walk through a sequence of timeframe conditions step by step to find symbols that meet requirements at multiple levels simultaneously.
Click **MTA** in the filter area to open the step builder. Each step represents one timeframe condition. The base table's own filters act as Step 1; click **Add Step** to stack additional steps on top.
For each step, choose a timeframe and the conditions you want — for example, Step 1: Weekly 2U in force. Step 2: Daily 1 candle. The builder lets you chain as many steps as you need. Click **Apply MTA** to run the analysis.
The table returns only symbols that satisfy every step simultaneously. A name that is weekly 2U in force with a daily inside bar is a much higher-conviction candidate than one that only meets one condition.
### Per-step candle filters
Each step exposes the same filter set as the base table, organized into two rows so you can dial in a specific candle structure on every timeframe:
**Primary row** — top-level filters that define the setup itself:
| Filter | Options |
| --------- | ----------------------------------------------------------- |
| **TF** | 15m, 30m, 60m, 4H, 12H, D, W, M, Q, Y |
| **Setup** | Multi-select of setup combos (e.g., `1-2`, `1-2-2`, `2D-3`) |
| **IF** | In-force only |
| **P3** | Three-candle outside bar (`up`, `down`, or any) |
| **Shape** | C1 candle shape — `hammer` or `shooter` |
**State row** — per-candle structure and color filters for the three candles in the setup:
| Filter | Options |
| ------------ | -------------------------------------------------------------- |
| **C2** value | `1`, `2U`, `2D`, `3` |
| **C2** color | `green`, `red` |
| **C1** value | `1`, `2U`, `2D`, `3` |
| **C1** color | `green`, `red` |
| **CC** value | `1`, `2U`, `2D`, `3`, `2D-GREEN`, `2U-RED`, `3-GREEN`, `3-RED` |
| **CC** color | `green`, `red` |
Any field left on **All** matches everything for that timeframe, so you can isolate exactly the structure you want without overconstraining the step. Filters apply independently per step — a green C1 on the weekly does not constrain C1 color on the daily.
### Example
Find symbols that are bullish on the weekly with a fresh inside-bar trigger on the daily:
* **Step 1** — TF: **W**, Setup: `1-2U`, IF: on, C1 color: **green**
* **Step 2** — TF: **D**, CC: **1** (inside)
The table shows only names that satisfy both conditions at once. Continuations are hidden by default so a higher-timeframe `1-2` step does not match symbols already showing the same direction on a lower timeframe.
### Saved views
MTA configurations save with your views. The view summary captures each step compactly — for example, `W: 1-2U · IF · C1 green | D: CC 1` — so you can tell at a glance what a saved MTA scan does before applying it.
MTA works best when you lead with a higher timeframe direction and let lower timeframes provide the entry trigger. A weekly 2U in force gives you the bias; a daily 1 candle gives you the setup to watch.
## Guided tour
The first time you open the Setups Table on a larger screen, a guided walkthrough appears. The tour walks you through the core controls — timeframe selectors, filters, saved views, columns, and the MTA builder — and creates a real **Inside Bars** saved view with a toolbar chip so you can see how saved views work in practice. Your existing filters, sort order, and layout are saved before the tour starts and restored when it ends, so nothing is lost.
You can skip or exit the tour at any time. A replay hint appears near the gear menu afterward in case you want to run through it again later.
The tour is a good starting point if you're new to the scanner. It covers the same workflow most experienced users follow: pick a timeframe, narrow with filters, save the view, and optionally layer MTA steps for multi-timeframe conviction.
## Mobile layout
The Setups Table adapts to smaller screens with a mobile-optimized layout. On phones, the timeframe row scrolls horizontally, the top bar condenses into a compact row count, filters, and actions strip, and filter and action panels open as full-screen drawers with explicit close buttons. Column resizing is locked on touch devices so horizontal scrolling works without accidentally grabbing a resize handle.
Saved views, column controls, and the reset action are accessible from the **Actions** menu on mobile, which opens as a popover that stays on-screen.
The Setups Table requires you to be logged in. If you visit the page while signed out, you are redirected to the login screen.
## Column customization
Right-click any column header to toggle visibility or drag headers to reorder them. Your layout preferences are saved automatically and persist across sessions for each asset class (core markets and crypto are saved separately).
When viewing setups across all timeframes at once, a dedicated **TF** column appears next to **Symbol** so you can tell which timeframe each row belongs to without changing the normal single-timeframe layout.
## Table help
Open the gear menu (⚙) at the top-right of the table and click **Table Help** to view a quick-reference modal that covers sorting and header-filter syntax. This is useful when you can't remember the exact filter format for a column type.
The modal covers:
* **Sorting** — single-click, Shift-click stacking, and the recommended broad-to-narrow timeframe order.
* **Text columns** — case-insensitive contains match. Typing part of a value is enough.
* **Numeric columns** — plain numbers like `50` are treated as "greater than or equal to" for columns such as **Last**, **ATH**, **ATL**, and **ATR**.
* **Change-percent columns** (D / W / M / Q / Y) — signed thresholds. `5` means "at least +5.0%", while `-5` means "at most −5.0%".
* **RVOL** — filters by absolute magnitude. `20` matches values at or beyond +20% or −20%.
* **Boolean columns** (IF, CT, ER) — accepts `true`/`false`, `t`/`f`, `y`/`n`, or `1`/`0`.
* **P3** — accepts its text values like `up` and `down` in addition to boolean shortcuts.
* **Gap** — accepts explicit comparisons like `>=5` or `<=-3`. A plain number matches either direction by magnitude.
Header filters run inside the table grid itself. They work independently from the top filter bar and can be combined with it for precise control.
## Keyboard shortcut
| Key | Action |
| ----- | ---------------------------------------------- |
| **S** | Open the Setups Table from anywhere in the app |
# Simultaneous Breaks
Source: https://docs.stratalerts.com/scanner/simultaneous-breaks
Simultaneous breaks fire when ES, NQ, RTY, and YM all break the same direction together — a signal of broad market participation across the index complex.
Simultaneous breaks require the **Founders Plan**. This includes the dedicated panel, the Mission Control simultaneous breaks card, and push notifications for sim break events. [Compare plans →](/pricing)
A simultaneous break occurs when two or more index futures — ES, NQ, RTY, and YM — go in force in the same direction within the same detection window. A single instrument breaking is notable; multiple instruments breaking together is a different signal entirely. Broadening participation across the index complex is one of the strongest short-term confirming signals in the Strat methodology. Press **B** anywhere in the app to jump to the Simultaneous Breaks panel.
## Why it matters
When one index breaks, it could be rotation, a quirk in that instrument, or a sector-specific move. When all four major index futures break the same direction within a short window, you're seeing correlated directional conviction across the entire equity complex. Simultaneous breaks don't generate trades on their own — they're a context layer that raises or lowers the probability of an individual setup working in the same direction.
The cohort for simultaneous break detection is always **ES=F, NQ=F, RTY=F, and YM=F**. These four instruments are watched regardless of your market filter settings anywhere else in the app.
## Thresholds
Simultaneous break events fire at three threshold levels, each representing a different degree of participation.
Two index futures have broken the same direction within the window. A meaningful signal — participation is spreading beyond a single instrument.
Three instruments are aligned. Conviction is meaningfully broader. Most traders treat a 3/4 break as a strong directional read for the session.
All four index futures are breaking together. The broadest possible signal from this cohort — all major parts of the equity complex are moving in unison.
## What the panel shows
Each row in the panel represents one simultaneous break event. The columns give you the full context of the event at a glance.
| Column | What it tells you |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| **Detected** | A time-only `HH:MM:SS` timestamp showing when the break was detected, displayed in a fixed-width font for easy scanning |
| **Symbols** | The specific index futures involved in this break event, listed in the order they triggered |
| **Direction** | Whether the break is **up** (all went in force above trigger highs) or **down** (all went in force below trigger lows) |
| **Timeframe** | The candle period the setups fired on — you can see a 60m simultaneous break and a daily simultaneous break as separate events |
| **Threshold** | The participation level: 2, 3, or 4 instruments |
| **Window** | The time span from the first trigger to the last within the detection window |
## Detection windows
The detection window adapts to the timeframe of the setups breaking. Shorter timeframes use tighter windows because intraday candles resolve faster.
| Timeframe | Detection window |
| ------------- | ---------------- |
| 15m | 5 minutes |
| 30m | 5 minutes |
| 60m | 10 minutes |
| 4H | 15 minutes |
| 12H | 20 minutes |
| D, W, M, Q, Y | 15 minutes |
A daily simultaneous break that fires within a few minutes — all four futures crossing triggers in a tight cluster — carries more weight than one where the breaks are spread across the full 15-minute window. Both fire as events, but timing matters for how you read conviction.
## Filtering events
Use the filter controls at the top of the panel to focus on the events relevant to your current session context.
Narrow the panel to simultaneous breaks on a specific timeframe. When you're preparing for an intraday session, filter to 60m or 4H. When reviewing swing context, look at daily or weekly events.
Show only **up** breaks, only **down** breaks, or all breaks. If you've established a bullish bias for the session, filtering to upside simultaneous breaks removes noise from the opposing side.
Filter to a minimum threshold — for example, show only **3/4** and **4/4** events to focus on the highest-conviction breaks. The default shows all thresholds (2, 3, and 4).
## Push notifications for simultaneous breaks
Simultaneous breaks can be delivered to your phone via Pushover or Telegram so you catch them even when you're away from the screen. Configure delivery in **Alerts → Settings → Simultaneous Break Alerts**.
Navigate to **Alerts → Settings** and find the **Simultaneous Break Alerts** section.
Enable Pushover, Telegram, or both. If you haven't connected a channel yet, follow the setup flow from the same settings page.
Choose the minimum threshold that should trigger a push notification. Many traders only want a push for 3/4 or 4/4 events to avoid notification fatigue from 2/4 breaks.
Simultaneous break push notifications use the same delivery infrastructure as in-force alerts. If your Pushover or Telegram connection is not active, no notifications will be sent. Verify your connection is working under **Alerts → Settings** before relying on push delivery during a live session.
## Keyboard shortcut
| Key | Action |
| ----- | ----------------------------------------------------------- |
| **B** | Open the Simultaneous Breaks panel from anywhere in the app |
# Voice Armed
Source: https://docs.stratalerts.com/scanner/voice-armed
Hands-free voice control for Mission Control and the Setups Table. Use the Hey Scanner wake phrase to apply filters, change markets, switch saved views, and navigate without leaving the chart.
Voice Armed is an experimental feature available to active subscribers, free-access users, beta testers, staff, and superusers. It is currently **desktop-only** — mobile and coarse-pointer devices do not show the navbar voice control and cannot arm voice mode.
**Voice Armed** lets you drive the scanner with your voice while your hands are on the chart or away from the keyboard entirely. Once armed, the browser listens for the **Hey Scanner** wake phrase, then interprets the command that follows — applying filters, switching markets, navigating between Mission Control and Setups, or applying a saved view.
## Arming voice mode
Voice Armed is reachable from two places on Mission Control and the Setups Table:
The navbar exposes a Voice Armed button that toggles between **Voice Off**, **Allow Mic**, **Starting**, **Listening**, and **Voice Error** states. Click it once to request microphone permission. After the browser grants access, the button shifts to **Listening** and the scanner waits for the wake phrase.
On any registered voice page, press **v** to arm voice mode without using the mouse. The hotkey ignores text inputs and selects, so it does not trigger while you are typing in a filter field.
The button label updates to reflect the current state at all times. While armed, heard transcripts and command feedback render directly in the navbar so you can confirm what the scanner thinks you said before it acts on it.
## Wake phrase
The default wake phrase is **Hey Scanner**. The scanner also accepts **A Scanner** and **Hay Scanner** as fallbacks, because some browser speech-recognition engines drop or mishear the leading "hey." When the wake phrase is detected, the next utterance is treated as a command.
Speak the wake phrase and the command in one breath — for example:
```text theme={null}
Hey Scanner, futures
Hey Scanner, show 15 minute setups
Hey Scanner, clear setup filters
Hey Scanner, apply saved view Momentum Weekly
Hey Scanner, take me to setups
```
A short bloop sound plays when a command is recognized so you know the scanner heard you without checking the screen.
## Deterministic Setups commands
Setups Table commands are matched against a deterministic vocabulary first, before any AI interpretation runs. That means the most common commands fire instantly and visibly with no AI roundtrip.
Switch the market scope from voice with phrases like:
* `Hey Scanner futures`
* `Hey Scanner stocks`
* `Hey Scanner crypto`
* `Hey Scanner stocks and futures`
* `Hey Scanner change market to stocks`
Apply timeframe filters with phrases like:
* `Hey Scanner show 15 minute setups`
* `Hey Scanner 15 minute in force`
* `Hey Scanner monthly`
* `Hey Scanner 12H`
Apply structural setup filters with phrases like:
* `Hey Scanner 11 setups` (1-1 sequence)
* `Hey Scanner 31 setups` (3-1 sequence)
* `Hey Scanner inside bar setups`
* `Hey Scanner 1-2D` / `Hey Scanner 1-2`
* `Hey Scanner weekly hammers`
* `Hey Scanner inside weeks`
Set CC and shape filters with phrases like:
* `Hey Scanner current candle 2 down green`
* `Hey Scanner 2 down` / `Hey Scanner 2 up`
* `Hey Scanner potential 3s` / `Hey Scanner p3` (failed-2 / P3 true)
Toggle the Earnings advanced filter with:
* `Hey Scanner setups with earnings`
* `Hey Scanner no earnings`
Filter to common ticker groups with phrases like:
* `Hey Scanner MAG 7`
* `Hey Scanner S&P 500`
* `Hey Scanner NASDAQ 100`
* `Hey Scanner DOW 30`
* `Hey Scanner ETFs`
* `Hey Scanner SPDR sectors`
Apply any saved view by name. The phrase is matched against the saved-view list visible on the current page:
```text theme={null}
Hey Scanner apply saved view Momentum Weekly
```
If the name does not match a saved view, the command is rejected and the heard transcript stays visible in the navbar so you can retry.
Reset filters individually or as a group:
* `Hey Scanner clear setup filters`
* `Hey Scanner clear filters`
## Navigation commands
Voice Armed recognizes navigation phrases without an AI interpretation step:
```text theme={null}
Hey Scanner, take me to setups
Hey Scanner, go to setups page
Hey Scanner, switch to mission control
```
When a command navigates to a filtered URL, voice mode stays armed on the destination page and re-enters wake-listening automatically — you do not need to re-arm after every navigation.
## Staying armed
After a command navigates to a different page, voice mode re-arms on the new page using the page re-arm token. The navbar label returns to **Listening** without any extra clicks.
Browser speech-recognition errors that the engine reports as recoverable do not drop you out of armed mode. The navbar stays on **Listening** and the error appears in the debug popup so you know what happened.
Pressing **v** on a page that supports Voice Armed re-enters wake-listening even after a previous voice session ended. Pressing **v** while typing in a text input or select does nothing, so it cannot disrupt filter editing.
## Voice On/Off for Metrics Alerts
Mission Control's [Metrics Alerts](/scanner/mission-control#metrics-alerts-panel) panel exposes its own **Voice On/Off** mode independent of Voice Armed. When Metrics Voice is on, the scanner reads each new metric alert aloud — symbol, timeframe(s), and event — using metric-prefix pronunciations for **RVOL**, **ATR**, **RSI**, **ORB**, **IBAL**, and **VWAP**. Use this when you want to listen to alert flow during the session without watching the panel.
Voice Armed does not share state with Metrics Voice — you can leave the metrics panel reading alerts aloud while you arm voice commands separately to apply filters or change markets.
## Troubleshooting
* **The button stays on Voice Off.** Click it once and accept the browser microphone permission. Voice Armed will not arm until the browser has granted access.
* **Commands are heard but ignored.** The deterministic vocabulary requires the wake phrase first. Open the on-page debug popup (visible while armed) to confirm whether the wake phrase was detected.
* **Commands seem stuck on a previous utterance.** Voice Armed ignores older cumulative browser speech-recognition results — wait for the next utterance and try again.
* **The button shows Voice Error.** This usually indicates the OpenAI Realtime client-secret response failed. Refresh the page and retry; subscription, beta, and staff entitlements all need to resolve before the secret request succeeds.