On this pagePublic surfacesWhatsApp review windowsSchedule matrixExecution flowSignal catalogUniverse scopesData sources and candle timingSalto 1HAlert channelsFailure and degradation behaviorHealth report scopeLimitationsDisclaimer

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

WorkflowCronCommand
Investep Hourly Gaps45 12,15 * * 1-5entrypoint.py gaps
Investep Premarket BB 15min25 9 * * 1-5entrypoint.py premarket
Investep Daily Signal0 9 * * 1-5entrypoint.py scan
Investep Intraday Tick13,28,43,58 9-15 * * 1-5entrypoint.py tick
Investep Daily Trend Signals30 15 * * 1-5alpaca-trading trade investep --candidate /candidate.json --window close
Investep Daily Check30 16 * * 1-5entrypoint.py health
Investep Combined Bollinger Returns 1W 1M30 12,15 * * 1-5entrypoint.py bollinger --timeframe 1w1m
Investep Monthly Bollinger Returns (retired no-op)30 12,15 * * 1-5entrypoint.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:

  1. Morning scan uses the complete legacy scanner to build the screened universe, fundamentals snapshot, table, summary, and compact 200-candle 1H cache.
  2. 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.
  3. 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 eod strategies in an isolated engine pass. It writes the highest-ranked directional ETF candidate; n8n then invokes alpaca-trade to validate and execute it.
  4. 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.
  5. 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

ScopeMembership
tableScreened NYSE, NASDAQ; market cap ≥ $10B
strategiesSPY, 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 , 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

ChannelDestinationPurpose
aperturaInvestep AperturaPremarket: Cambio tendencia BB 15min y Regreso BB 1D.
intradiaInvestep IntradíaCambio tendencia 1H y ruptura de máximo histórico durante la sesión.
cierreInvestep CierreMomentum 1D, Regreso BB 1W 1M y Saltos: revisión al cierre.
controlInvestep ControlResumen 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.

Generated from docs/service.md, YAML, and workflow JSON. Do not edit this HTML directly.