Investep Service Documentation
Symbol-specific earnings research is published separately so a dated market snapshot is never confused with the service's enduring operating contract. See the ORCL post-report intraday study: opening candles, returns after the first 15 minutes and hour, and Bollinger context across 15min/1h/1D. BMO uses the report session; AMC uses the next trading session.
Investep combines a public market-reference table, scheduled technical scans, strategy-specific alerts, deterministic replay, and a daily health report. It supports trading decisions; it does not place or close trades.
When enabled, the EOD workflow writes one policy-neutral Cambio tendencia 1D
leveraged-ETF candidate. The separate alpaca-trade service owns the paper-only
30% allocation, +1.25% target, -0.75% stop, one-trade-per-session gate,
PostgreSQL lifecycle state, and the 15:55 ET close.
Public surfaces
- Signals — filterable large-cap market reference.
- Señales activas — configured detection and preparation rules.
- Estrategias — academy-method reference and reviewed print PDFs.
- Docs — this service guide.
The screened table contains large-cap NYSE and NASDAQ securities with usable
market data. Its exact membership changes with the market-cap screen and data
availability.
Explicit stocks from config/stock_additions.yml are also included outside
the screen. UUUU (Energy Fuels, AMEX) remains a stock: all target, earnings,
technical and freshness gates still apply. Membership propagates through the
table snapshot to table-scoped alerts; method-specific universes are unchanged.
Its leveraged ETF candidates are issuer-verified UUUG (2×)
and UUUC (2×), selected by live 10-day average
volume after leverage. No live exact UUUU inverse was verified on 2026-09-18;
that field remains blank rather than substituting a sector inverse. A filing
alone is not a tradable listing; future exact matches can be discovered normally.
WhatsApp review windows
The generated channel matrix below defines each review window; the signal catalog identifies the destination of every strategy.
Opportunity messages contain one strategy and direction, actual send time in New York and the number of listed assets. Per-symbol blocks show price, the relevant ETF if available, CALL/PUT only for optionable assets, up to three readable confirmations and the original TradingView link. The header links to full rules. Existing caps and ranking remain unchanged: combined BB uses weekly percentage distance, greatest first; trend alerts use market capitalization.
No candidates means no opportunity message. Control's daily health report shows the last technical evaluations, including zero matches, evaluation errors and missing/stale observations. These counts are not WhatsApp delivery receipts; API acceptance likewise does not prove receipt on a phone. Intraday dedup counts do not represent all daily notifications.
“También cumple” highlights another enabled strategy observed for that symbol, same direction and destination within 30 minutes on the same New York date. It is not a probability estimate, a delivery claim or a synchronized rescan. Later evaluations do not retroactively edit messages already sent.
Deployment requires renaming the existing Swing group to Investep Cierre and Diario to Investep Control, preserving their participants and group IDs. After merge, coordinate the rename and checkout update between scheduled runs; validate all four destinations before resuming sends. Do not create duplicate groups or deploy the new names before the existing groups are renamed. Rollback restores both old names and the prior checkout. No live renames occur during PR review.
Schedule matrix
| Workflow | Cron | Command |
|---|---|---|
| Investep Hourly Gaps | 45 12,15 * * 1-5 | entrypoint.py gaps |
| Investep Premarket BB 15min | 25 9 * * 1-5 | entrypoint.py premarket |
| Investep Daily Signal | 0 9 * * 1-5 | entrypoint.py scan |
| Investep Intraday Tick | 13,28,43,58 9-15 * * 1-5 | entrypoint.py tick |
| Investep Daily Trend Signals | 30 15 * * 1-5 | alpaca-trading trade investep --candidate /candidate.json --window close |
| Investep Daily Check | 30 16 * * 1-5 | entrypoint.py health |
| Investep Combined Bollinger Returns 1W 1M | 30 12,15 * * 1-5 | entrypoint.py bollinger --timeframe 1w1m |
| Investep Monthly Bollinger Returns (retired no-op) | 30 12,15 * * 1-5 | entrypoint.py bollinger --timeframe 1m |
This table is generated from checked-in n8n workflow JSON. It describes intended commands and cron expressions, not proof that a live workflow is active, uses a particular timezone, or matches the repository. Operational status must be verified against n8n at runtime.
Execution flow
The repository currently has a transitional execution model:
- Morning scan uses the complete legacy scanner to build the screened universe, fundamentals snapshot, table, summary, and compact 200-candle 1H cache.
- The package tick evaluates configured engine strategies on the forming candle. ATH runs every tick; the mirrored 1H trend rules run at :58 ET before each market-hour candle closes. A forced weekday run after 16:00 ET instead evaluates the completed 15:00–16:00 ET hour from that same session. The job dispatches alerts, saves successful-delivery dedup, then refreshes existing table rows.
- At 15:30 ET the pre-close job rebuilds the table, applies the strict mirrored
“Cambio tendencia 1D” rules, sends the top three matches per direction
to Diario, and then runs any other configured
eodstrategies in an isolated engine pass. It writes the highest-ranked directional ETF candidate; n8n then invokesalpaca-tradeto validate and execute it. - Long-term jobs fetch native Alpaca 1W or 1M candles for the table universe. Each timeframe owns two independent return signals: upper requires price above BB Upper and a falling daily close versus the previous daily close; lower requires price below BB Lower and a rising daily close. Each sends its three farthest matches by percentage distance. Both run each trading day 30 minutes before the exchange close: the 12:30/15:30 ET checks consult the exchange calendar, selecting early/normal close and skipping holidays. Separate dedup files avoid concurrent job writes; daily dedup allows a new qualifying return on a subsequent session.
- Health reads artifacts and the live intraday workflow to produce a daily proof-of-life report.
The scan/EOD implementation remains transitional. The historical intraday CLI is now a wrapper around the engine and cannot restore deleted signals. Repository workflow definitions and live n8n state can differ, so this page does not claim that checked-in intent is deployed.
Signal catalog
Premarket reference
The premarket 15-minute strategies compare the latest available IEX trade with frozen BB(20,2) from the previous regular close. Bands use the final 20 complete SIP 15-minute regular-session candles, excluding extended hours; the close is the last of those candles. Alpaca's exchange calendar identifies the actual prior session, including holidays and early closes. Missing bars or a price older than 180 seconds suppress that symbol; zero usable evidence is an execution error, not a no-match result. IEX is real-time but not consolidated market data.
The signal is indicative preparation, not a guaranteed opening price. It uses only the crossing/inside-band rules shown in the catalog, not the separate trend signals' earnings, target, or moving-average gates. Each direction keeps the three largest matches by market cap and journals only delivered symbols. The job cannot send at or after 09:30 New York, even if its data fetch runs late.
The generated active-signals catalog is the single public inventory of enabled detection rules. It derives status, execution, scope, channel, and user-facing conditions from configuration. “Active” does not by itself prove that the live scheduler invokes the owning job.
Hourly and daily trend strategies use strict AND semantics: missing or unmeasurable evidence fails the setup. ATH retains its documented optional-data leniency.
The two hourly trend signals still measure the consecutive setup before the candidate candle, but the minimum is temporarily 0 for diagnosis, so this measurement does not currently filter opportunities. Bullish signals measure prior closes below their contemporaneous MA20; bearish signals measure closes above it. The count excludes the candidate candle, equality breaks the streak, and hourly signals measure 1H candles. Daily signals do not require or display a prior-MA20 candle streak. On the signal timeframe, MA20 confirms the breakout. For 1H, MA40 must also be positive for bullish signals and negative for bearish signals. For 1D Momentum (stocks and ETFs), MA40 is positive for bullish signals and negative for bearish signals, and the unrounded current MM20 1D must be strictly above/below its previous-session value respectively. Missing values or equal averages do not pass. MA100 and MA200 retain the broader-trend gate: both must be negative for bullish signals and positive for bearish signals. Hourly and daily evaluation therefore require at least 200 candles on their respective signal timeframes. The daily signals retain their separate 1H MA20/40/100/200 confirmation: all positive for up, all negative for down. Momentum does not require a daily candle classification or Worden threshold. The daily upper BB distance stays negative for up; lower BB stays positive for down.
Universe scopes
| Scope | Membership |
|---|---|
table | Screened NYSE, NASDAQ; market cap ≥ $10B |
strategies | SPY, NVDA, TSLA, META, AAPL, GOOG, AMZN |
Each strategy declares one scope. The engine unions only the scopes needed by a run, fetches each symbol once, and evaluates the strategy against its own scope.
Data sources and candle timing
| Data | Source |
|---|---|
| Screened universe, shares outstanding and book value per share | Yahoo Finance screener |
| Intraday, daily, weekly and monthly bars | Alpaca Market Data: IEX for latency-sensitive 15-minute checks; native SIP candles for broader and long-term scans |
| Average, low and high analyst targets, recommendation, sector, earnings and ATH/ATL | TradingView/FactSet scanner |
| Single-stock ETF liquidity | TradingView ETF scanner; exact ticker-to-underlying matching |
| Notifications | Self-hosted Evolution API |
The fundamental group presents Low Target, Avg Target, and High Target
in that order. Each shows the analyst target price and signed percentage distance:
(target − table price) / table price × 100. Dollar distances are not displayed.
Sorting and filters use percentage distance. Targets refresh with the full
scan; their distances refresh with the intraday table price. Missing/invalid
targets and ETF targets show a dash, never zero. These are analyst estimates,
not entry signals; existing alert rules continue using the average target.
TradingView fields are price_target_low and price_target_high; Finviz values
may differ by source update time, and its displayed percentages may use a
different price snapshot.
Intraday checks inspect the latest forming candle shortly before close. Hourly trend changes also require the unrounded MA20 1H to rise (up) or fall (down) versus the previous hourly bar. The difference must be strictly positive or negative respectively; flat or unavailable values suppress the signal for stocks and ETFs. This is a one-bar SMA change, not an angle threshold. Current session filtering retains bucket starts from 09:00 through 15:59 ET, so the first hourly bucket includes the 09:00 and 09:15 premarket bars. It differs from a TradingView hour anchored at the 09:30 regular-session open.
The only hourly freshness exception is explicit and fail-closed: after 16:00
ET, tick --force can use the final regular-market hour only if its latest IEX
bar is the 15:45 bucket from the tick's own weekday session. It does not reuse
an incomplete hour or the previous trading day's final hour. Normal scheduled
ticks retain the current-bar freshness requirement. The engine applies this
exception only while dispatching the two hourly trend strategies; ATH retains
its strict current-bar requirement.
The morning scan stores the last 200 native 1H candles per table symbol in an atomic cache. At :58, the engine overlays the current IEX-built hour onto that history before calculating MA20/40/100/200, Worden, candle type, and Bollinger distance. After alert delivery it persists the merged history for the next hour; dry-runs do not mutate the cache. If the cache is absent, corrupt, or short for a symbol, its hourly trend checks fail closed without blocking ATH or the table refresh.
Bearish notification eligibility
Every bearish WhatsApp candidate (stocks and ETFs) must have either a
selected associated inverse ETF or Opcionable = Sí in the Alpaca catalog.
Missing/unknown optionability without an inverse blocks the notification.
A leveraged long ETF or stock shortability does not satisfy this rule.
Each symbol block starts with icon, symbol and price under its strategy header. The second line names
its directional ETF when known: “ETF apalancado” for bullish moves or “ETF inverso”
for bearish moves. The next line shows CALL/PUT and underlying price only when
catalog optionability is explicitly true; the percentage plan remains limited
to the styles that already displayed it. False/unknown omits
that entire line. Bullish candidates without a leveraged ETF still send;
bearish candidates without either an inverse or known options do not.
An inverse ticker with missing leverage is still named,
without inventing a multiplier. TradingView links and journal symbols continue
to identify the original underlying, not its associated ETF.
Optionability carries the catalog limitations described below; it does not
guarantee a specific active put contract, liquidity or account permissions.
This is a delivery filter, applied before ordering/top-three selection in the shared dispatcher, the daily-trend sender and bearish daily-summary lists. Suppressed candidates do not consume notification slots, mark delivery dedup or create Google Sheets rows. If the daily bearish list is empty, no bearish daily notification is sent. Premarket/gap jobs distinguish deliberate suppression from an actual delivery failure. Bullish notifications and technical detection rules are unchanged; the table's strategy checklist can still show technical bearish matches that are not eligible for notification.
The full scan propagates optionability and its query timestamp into the shared universe snapshot, so all jobs use the same metadata as the table. Older snapshots without these fields allow bearish notifications only for known inverse ETFs.
Daily volume, optionability and strategy filters
Vol 1D shows accumulated share volume from the latest native Alpaca SIP daily
candle, with its New York session date. It is not average volume or a sum of
IEX bars. During the session it is partial and may lag 15 minutes; on weekends
or before a new daily bar exists, the date identifies the previous session.
The tooltip includes the exact share count and query time. The full scan loads
it and intraday ticks refresh it after alert delivery. A failed volume request
retains the previous value and query time; a missing symbol shows a dash.
Opcionable is Sí, No or a dash (unknown), using Alpaca's active US-equity
catalog and its has_options / legacy options_enabled attribute. It covers
both stocks and ETFs and refreshes with the full scan. This is a listing flag,
not account permission or a liquidity check. In particular, Alpaca documents
that has_options can remain for historical/expired contracts; it does not
prove a particular active call/put expiration is available. Provider failures
and absent assets remain unknown, never No.
Source: Alpaca assets API.
The Estrategias checklist above the table lists only enabled strategies from the same configuration as the public signal catalog. Select several to show the union (any selected strategy), intersected with the ordinary column filters. Clear all resets both. Each entry shows the timestamp, match count and evaluation coverage of its latest actual strategy run. An unavailable snapshot is disabled, not displayed as zero matches. A later zero-match run clears previous matches.
These are last-evaluation matches, not live setups at the latest table price. Premarket, hourly, pre-close and daily jobs evaluate at different times; their timestamps remain visible even after the table refreshes. All passing candidates are included before notification caps and delivery deduplication. No alert rules, schedules, WhatsApp messages or Sheets deduplication change. Disabled strategies are excluded even if an old snapshot file remains. The interface fetches the latest available snapshots on page load; reload to retrieve subsequent runs.
The market table shows analyst Recom on the familiar 1–5 scale (1 strong
buy, 3 hold, 5 strong sell), calculated from FactSet consensus counts. It also
publishes SHS Outstand from Yahoo's implied shares outstanding, falling back
to basic shares when needed, and Book/share from Yahoo's book-value field.
Book/share displays its signed percentage distance from the current row price:
(Book/share − price) / price × 100. It recalculates whenever the table loads
updated prices. Zero and negative book values are valid; a negative book value
can produce a distance below −100%. Missing book values show a dash; an invalid
or nonpositive price suppresses only the percentage. Sorting/filtering retain
their existing book-value basis. Book value is accounting data, not a price target.
Those definitions align with the corresponding Finviz concepts more closely
than the superficially similar TradingView fields. ETF
columns prefer leverage before liquidity: long 3×, 2×, then 1.5×; inverse 3×,
2×, then 1×; equal-leverage candidates use 10-day average share volume. Stocks
require exact single-stock matches. Curated fund associations are maintained in
config/fund_etfs.yml with issuer sources and require a current TradingView fund
listing. Related (non-identical) exposures are marked ≈ in the table and explicitly
labeled in WhatsApp; an unavailable product remains blank. The ten Bollinger columns are signed
value and percentage distances from close to the upper/lower BB(20,2) on 15M,
1H, 1D, 1W and 1M; they are context, not a replacement for internal alert logic.
The moving-average group ends with MA20 15min, immediately after MA200 1H,
and refreshes that value during each intraday table update.
Curated ETFs
The table and table-scoped alert universe include GLD, USO, SLV, BITO, SOXX, VGT, XLE, XBI, IYR, KRE and XLI, plus SPY and QQQ. These explicit additions bypass the company market-cap floor, not technical or freshness requirements. For each hourly/daily trend direction, ETFs alone are exempt from target price and earnings gates; stocks retain both. Fund AUM and NAV/share come from Yahoo and are separate from company market cap and book value. Inapplicable company fundamentals remain null; missing fund statistics do not remove a fund. Market-cap ordering remains unchanged, with missing values last (AUM is not substituted). Native Alpaca bars supply the same indicators as for stocks.
Every directional alert mentions the selected leveraged ETF on an upward signal or inverse ETF on a downward signal when available. QQQ down can mention SQQQ; the TradingView URL, dedup key and Google Sheets journal retain QQQ. Candidates are selected by leverage and then current average volume from the curated catalog, not by a hardcoded volume ranking. KRE has no verified inverse in this catalog. Leveraged products reset daily; related commodity, crypto and sector exposures are not exact replicas or guaranteed hedges.
The table is arranged in decision order: identity and freshness; Bollinger (50%); moving averages (25%); technical confirmation; price levels; trading vehicles; and fundamental analysis last. Within technical groups, the table moves top-down from 1M to 1W to 1D to 1H to 15M. Trend notification blocks list the largest market caps first. Weekly/monthly Bollinger return notifications instead rank by absolute percentage distance beyond the weekly band, greatest first; monthly exposure is a gate only.
Each hourly trend direction is capped independently at three displayed symbols after market-cap ordering. Every displayed hourly symbol includes its generic TradingView chart URL, and only that displayed set is deduplicated and written to the Signals journal. Bullish hourly setups additionally require price above MA20 15M; bearish setups require price below MA20 15M.
The two combined Bollinger returns require a fresh fetch of the latest available 1D candle, neutral/bearish
for downward returns and neutral/bullish for upward returns. Classification
matches the table, including wick-based reversals. The 1D candle can still be
forming at the daily pre-close run. Its close must also strictly rise/fall
versus the preceding 1D close for upward/downward returns respectively.
Missing or invalid OHLC or previous daily close excludes the symbol.
They are journaled independently under their public names:
Regreso BB 1W 1M a la baja and Regreso BB 1W 1M al alza.
Both native closes must remain outside the same-side band on both 1W and 1M.
Missing either timeframe excludes the symbol. Each message shows both percentage
distances; the top three use weekly absolute percentage distance as score, greatest first.
Monthly distance does not influence selection or ordering.
Superior is a PUT (arriba → abajo); inferior is a CALL (abajo → arriba). Each
is capped at three and includes close, daily return move, weekly/monthly
percentage distances and the TradingView link. Full rules are linked in the header.
Rollout: update the existing weekly n8n workflow in place to invoke
bollinger --timeframe 1w1m, then deactivate the existing monthly workflow.
The checked-in monthly workflow is inactive; that flag does not deactivate a live instance.
Legacy --timeframe 1w is an alias sharing the combined dedup file;
--timeframe 1m is a no-op, preventing duplicate sends during migration.
One combined job runs each trading day 30 minutes before the exchange close.
Preserve historical Signals rows; new deliveries use only the two combined names.
Refresh the public catalog/table evaluations on deployment.
Two additional signals, Regreso BB 1D al alza and Regreso BB 1D a la baja,
run through the existing 09:25 America/New_York premarket job. They use SMA20
and two population standard deviations of the last 20 completed daily SIP
closes, frozen before today's premarket. The fresh IEX trade must satisfy
previous regular close < price < frozen Lower for up, or
frozen Upper < price < previous regular close for down. Equality is excluded;
no forming daily candle or premarket sample enters the bands. Calendar gaps,
missing final bars, duplicates and prices older than 180 seconds fail closed.
Each direction sends the top three by percentage distance, independently of
market-cap-ranked 15-minute alerts. Both include stocks and ETFs without
earnings/target gates, the directional associated ETF when available, and the
original symbol's TradingView URL. Accepted messages are journaled in Signals.
Salto 1H
The two mirrored gap alerts run once per trading session, 15 minutes before the calendar close: 15:45 New York normally, 12:45 on early closes. Up requires positive MA20/40 and negative MA100/200 hourly distances, at least 35 consecutive prior closes below their contemporary MA40, and current price above the previous regular daily close. Down mirrors every comparison. The candidate is excluded from the streak, and equality breaks it; 35 candles is only approximately five days. Stocks require a directional analyst target and earnings more than five days away; ETFs are exempt. No candle, Worden, Bollinger or 15-minute MA gate applies.
The last 199 completed cached hourly bars plus a fresh IEX trade form the 200-bar calculation; missing/stale hourly history excludes a symbol. Prior daily close is fetched from the previous exchange session's SIP bar. Each direction sends at most three symbols by market cap to Diario, preserving directional ETF associations, original TradingView links and Signals journaling.
Alert channels
| Channel | Destination | Purpose |
|---|---|---|
apertura | Investep Apertura | Premarket: Cambio tendencia BB 15min y Regreso BB 1D. |
intradia | Investep Intradía | Cambio tendencia 1H y ruptura de máximo histórico durante la sesión. |
cierre | Investep Cierre | Momentum 1D, Regreso BB 1W 1M y Saltos: revisión al cierre. |
control | Investep Control | Resumen del mercado, estado de las evaluaciones y fallos de envío. |
Each strategy routes to exactly one channel. Channels represent reaction time, not strategy taxonomy.
After a WhatsApp strategy notification is accepted, its Bogotá timestamp,
strategy name, displayed symbol count, and symbols are appended to the
Signals worksheet in the configured Google Sheet. n8n owns Google
authentication. Dry-runs, failed WhatsApp deliveries, health reports, and
routine morning summaries do not create strategy-journal rows.
Failure and degradation behavior
| Condition | Outcome |
|---|---|
| Missing fundamentals snapshot | Table-scoped tick strategies have no universe and emit nothing. |
| Missing or fewer than 200 candles in the hourly cache | Hourly trend checks cannot evaluate MA200 and fail closed; ATH and table refresh continue. |
| Missing or stale symbol bar | That symbol cannot produce a current signal. Forced post-close hourly evaluation accepts only the same session's completed 15:00–16:00 ET hour. |
| Engine batch failure | Other strategy/direction batches continue, including in the same group; failed delivery is not confirmed in dedup. |
| Engine site-refresh failure | Logged after alerts; successful alerts remain delivered. |
| Pre-close engine-pass failure | Logged after the legacy table/trend pass; the published table remains available. |
| Google Sheets journal failure | WhatsApp remains delivered; n8n raises the append failure through its global error workflow. |
These guarantees apply to the engine tick; scan/EOD failure boundaries remain documented separately in the operational context.
Health report scope
The daily report checks table readability and age, the state date when present, last technical evaluation snapshots, enabled strategies missing a job, and the live command of the intraday workflow. It does not prove that every workflow is active or that committed systemd units are installed.
Limitations
- Signals are entry-side decision support; orders and exits are not automated.
- Premarket and the combined long-term return job check the exchange-holiday calendar; other jobs retain their existing scheduling behavior.
- Third-party feed coverage and latency can suppress an otherwise valid setup.
- Repository configuration and live scheduler state require separate checks.
Disclaimer
Investep provides informational market analysis. It is not investment advice and does not guarantee results. Confirm the complete setup, data freshness, risk plan, and order details before acting.