— Overview
Architecture & Operations

Trading Signals
Platform

From Excel spreadsheets to automated quantitative signal generation — a Python-based pipeline managing six strategies across two Interactive Brokers accounts.

6
Strategies
2
IB Accounts
19K+
Lines of Code
704+
Tests

February 2026 · v2.0.0a1 · Built with Python 3.11 + LLM-assisted development

Section I

The Journey

From Excel workbooks to automated signal generation.

The original setup was a set of heavy Excel files that depended on a Bloomberg terminal connection to run. These files combined everything — backtests, research, and daily signal generation — into single workbooks. They crashed frequently, and any formula error could silently produce wrong signals.

This repo separates those purposes. Research and backtesting stay in Excel where they belong. Signal generation lives here — standalone Python code with no Bloomberg dependency, designed to do one thing well: tell me exactly what to trade today, for both accounts, across all six strategies.

The benefits are straightforward:

Before
  • Signal generation mixed with research and backtests
  • Depended on Bloomberg connection
  • Frequent crashes
  • Formula errors could go unnoticed
  • Couldn't run away from my desk
After
  • Signal generation is its own codebase, separate from research
  • Uses Polygon API and IQFeed — no Bloomberg needed
  • Automated pipeline with validation at every step
  • Reduces trading mistakes through systematic checks
  • Can run remotely via Discord from my phone

The core principle behind this project: separate signal generation from research. Everything else follows from that.

The goal is simple: generate correct orders every day and avoid trading mistakes. Every signal is reproducible, every run is logged, and every order is reconciled against the broker before and after execution.

Section II

Architecture Overview

A modular, pipeline-driven design that separates configuration from state, strategies from I/O, and data providers from consumers.

The architecture follows several deliberate design principles. Configuration files — edited only by humans — are strictly separated from state files written only by automation. Strategies are pure functions: they receive data and return signals, with no file I/O or network calls permitted inside compute(). A DataRouter abstracts the mapping from symbols to data providers, so strategies never call APIs directly. This separation makes the system testable, reproducible, and safe to operate.

Repository Structure

trading-signals/
1trading-signals/
2 pyproject.toml # Installable package — pip install -e . → signals run
3 config/ # STATIC — edited by humans only
4 accounts.yaml # Account metadata + strategy assignments
5 contracts.yaml # Futures specs, multipliers, asset classes
6 tws_config.yaml # TWS connection settings
7 notifications.yaml # Discord/Telegram config
8 strategies/ # Per-strategy YAML parameters
9 rph.yaml # Risk Premia Harvesting
10 sb_rebalance.yaml # Stocks & Bonds End-of-Month
11 vxx_slayer.yaml # VXX Slayer
12 uga_holiday.yaml # UGA Gasoline Holidays
13 ung_holiday.yaml # UNG Natural Gas Holidays
14 ng_winter.yaml # Natural Gas Winter Short
15 data/ # Market data (not in git)
16 raw/ # Static reference data
17 market/ # Mutable market data files
18 cache/ # API response cache
19 state/ # DYNAMIC — only written by automation
20 positions.yaml # Live NAV + positions (TWS sync only)
21 checkpoints/ # Post-trade position snapshots
22 src/trading_signals/ # The Python package
23 cli.py # Unified CLI (Typer-based)
24 pipeline.py # preflight → compute → postcheck → output
25 run_context.py # Frozen RunContext per pipeline run
26 models.py # Shared data models
27 data/ # Data providers
28 router.py # Symbol → provider resolution
29 polygon_client.py # Equities/ETFs via Polygon API
30 databento_client.py # Futures via Databento
31 iqfeed_client.py # VIX futures via IQFeed
32 strategies/ # Strategy implementations
33 base.py # Abstract base class (pure compute)
34 registry.py # Strategy registry
35 rph.py # Risk Premia Harvesting
36 sb_rebalance.py # Stocks & Bonds End-of-Month
37 vxx_slayer/ # VXX Slayer (sub-package)
38 uga_holiday.py # UGA Gasoline Holidays
39 ung_holiday.py # UNG Natural Gas Holidays
40 ng_winter.py # Natural Gas Winter Short
41 commands/ # CLI command implementations
42 utils/ # Shared utilities
43 tests/ # 34 test files, 704+ tests
44 golden/ # Golden regression tests
45 test_strategy_purity.py # Purity enforcement
46 discord_signal_bot.py # Discord bot for mobile access

Key Architectural Decisions

Config vs State Separation

Configuration files (config/) are edited only by humans and define strategy parameters, account assignments, and connection settings. State files (state/) are written only by automation — positions synced from TWS, checkpoints saved after runs. This prevents the dangerous failure mode where the system reads its own predictions as reality. The rule is enforced by convention and by agent rules in CLAUDE.md: "Never write to state/positions.yaml from signal generation."

Pure Strategy Functions

Every strategy extends BaseStrategy and implements a compute(as_of_date, data, config) method that is strictly pure — no file I/O, no network calls, no print() statements. This is enforced by purity tests that patch open, requests, and urllib during test execution.

strategies/base.py(Python)
1class BaseStrategy(ABC):
2 required_data_ops: ClassVar[frozenset[str]]
3 routed_symbols: ClassVar[tuple[str, ...]]
4
5 @abstractmethod
6 def compute(
7 self,
8 as_of_date: date,
9 data: dict,
10 config: dict,
11 ) -> list[PositionSignal]:
12 """Pure function: data in → signals out. No I/O."""
13 ...

DataRouter Abstraction

The DataRouter resolves symbols to the appropriate data provider using contracts.yaml. Equities and ETFs route to the Polygon API, futures route to Databento, and VIX term structure data routes to IQFeed. Strategies declare their data requirements via required_data_ops and routed_symbols class variables, and the pipeline fetches everything before calling compute().

Data Flow

Market data flows from multiple providers through the DataRouter into pure strategy computations, producing signals that are validated, formatted, and delivered through multiple channels. The interactive diagram below shows every connection in the system.

provider
core
strategy
output
delivery
← scroll to see full diagram →
DATA SOURCES
Polygon API
Equities & ETFs
Databento
Futures
IQFeed
VIX Futures
TWS (IB)
Broker
PROCESSING
DataRouter
Symbol → Provider
Pipeline
preflight → compute → postcheck → output
STRATEGIES
RPH
Risk Premia
S&B Rebal
End-of-Month
VXX Slayer
Vol Carry
UGA Holiday
Gasoline
UNG Holiday
Nat Gas
NG Winter
Short Futures
OUTPUTS
Signals CSV
signals.csv
Order Sheet
HTML Report
DELIVERY
Discord Bot
Mobile Alerts
Telegram
Notifications
Local HTML
Browser View
Market Data → DataRouter → Pure Compute → Signal Output → Multi-Channel Delivery

Tap any node to see details

Data Provider Routing
ProviderAsset TypesOperationsUse Case
PolygonEquities, ETFsdaily_bars, close, snapshotVTI, VGLT, GLD, IBIT, SPY, TLT, UGA, UNG, KOLD
DatabentoFuturesdaily_bars, last_tradeMES (micro E-mini S&P 500)
IQFeedVIX Futuresterm_structureVX1–VX9 continuous contracts
TWS (IB)Allpositions, nav, ordersAccount sync, order reconciliation

Live Config Explorer

Browse the actual configuration directory tree. Click any file to view its contents — hover over lines to see inline annotations explaining what each parameter does.

config/strategies/rph.yaml
1account_a:
2 vol_target_vti: 6.0
3 vol_target_vglt: 4.0
4 vol_target_gld: 2.0
5 vol_target_ibit: 1.0
6 rebalance_band: 0.05
7 ewma_lambda: 0.94
8
9account_b:
10 vol_target_vti: 4.0
11 vol_target_vglt: 3.0
12 vol_target_gld: 1.5
13 vol_target_ibit: 0.5
14 rebalance_band: 0.05
15 ewma_lambda: 0.94
Section III

The Six Strategies

Each strategy is a self-contained module with its own configuration, documentation, and test suite. Click any card to expand its parameters.

Abstract visualization of six interconnected trading strategies

Strategy Registry

All strategies are registered in a central registry, enabling the pipeline to discover and execute them dynamically:

strategies/registry.py(Python)
1STRATEGY_REGISTRY = {
2 "rph": RiskPremiaStrategy,
3 "sb_rebalance": SBRebalanceStrategy,
4 "vxx_slayer": VXXSlayerStrategy,
5 "uga_holiday": UGAHolidayStrategy,
6 "ung_holiday": UNGHolidayStrategy,
7 "ng_winter": NGWinterStrategy,
8}

Strategy Comparison

A side-by-side view of all six strategies — sortable by any column, filterable by asset class. Click a row to see its risk approach.

Filter:
← scroll to see all columns →
StrategyAsset ClassInstrumentsFrequencyData SourcesAccountsOrder
RPHRisk Premia HarvestingMulti-AssetVTI, VGLT, GLD, IBITDaily (drift-band)PolygonA + BMOC
S&B RebalStocks & Bonds End-of-MonthEquity + Fixed IncomeSPY, TLTMonthly (LD-5 → T+5)Polygon, DatabentoA + BMOC
VXX SlayerVXX Long/ShortVolatilityVXX, VIX FuturesDailyPolygon, IQFeedA onlyOPG
UGA HolidayGasoline Holiday SeasonalCommoditiesUGA~10 periods/yearPolygonA + BMOC
UNG HolidayNatural Gas Holiday SeasonalCommoditiesUNG~10 periods/yearPolygonA + BMOC
NG WinterNatural Gas Winter ShortCommoditiesKOLD (from UNG signal)Daily (Oct–Mar)PolygonA + BMOC

Click any row to expand details · Click column headers to sort

Strategy Activity Calendar

A visual calendar showing when each strategy is active. RPH and VXX Slayer run daily, S&B Rebalance activates around month-end, holiday strategies fire near US holidays, and NG Winter covers October through March. Navigate between months to see the overlap.

February 2026NG WINTER ACTIVE
Mon
Tue
Wed
Thu
Fri
Sat
Sun
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
H
17
18
19
20
21
22
23
24
25
26
27
28
19 trading days this monthHover any day to see active strategies
Section IV

Daily Pipeline

The operational heart of the system — a five-stage pipeline that runs every trading day, from data fetch through signal delivery.

Interactive Pipeline Walkthrough

Click "Run Pipeline" to watch each stage execute in sequence, or click any stage to explore its details.

Pipeline Execution Flow

Click each stage to see inputs, outputs, and timing

1. Fetch Market Data
~8s

DataRouter queries Polygon.io, Yahoo Finance, and FRED for prices, volatility surfaces, and macro indicators. Each provider has automatic retry with exponential backoff.

Inputs
  • config/tickers.yaml
  • API keys from .env
Outputs
  • state/market_data.json
  • state/vix_term_structure.json

Sample Output

Here is what the pipeline produces each morning — a signals CSV with every position target, and a styled HTML order worksheet for manual review before entering orders in TWS:

strategy,ticker,direction,target_pct,current_pct,delta_shares,price,notional
vol_premium,SPY,SELL_PUT,0.15,0.12,+2,585.40,1170.80
gasoline_seasonal,UGA,LONG,0.08,0.08,0,57.20,0.00
mean_reversion,TLT,LONG,0.10,0.07,+5,92.15,460.75
sector_momentum,XLK,LONG,0.12,0.12,0,220.30,0.00
bond_rotation,SHY,LONG,0.05,0.05,0,82.40,0.00
tail_hedge,UVXY,LONG,0.02,0.02,0,28.90,0.00

Daily Automation Schedule

The pipeline runs on a fixed schedule every trading day, managed by Windows Task Scheduler with a Discord bot as the mobile fallback:

Time (ET)EventDescription
~15:30Safety-net runFull pipeline re-runs, reconciles against any pending orders
~15:45Signal generationMOC orders calculated based on latest market data
~15:50Manual reviewOperator reviews signals and enters MOC orders in TWS
~16:00Market closeMOC orders execute at closing price
~16:10Auto-verifyCompares actual fills against signal targets, posts to Discord

Remote Access & Mobile Operations

The system supports full remote operation through multiple channels, enabling the operator to monitor and trigger the pipeline from any device:

Discord Bot

9 slash commands: /daily, /signals, /preview, /calendar, /reconcile, /verify, /update_accounts, /update_data, /bot_status. Scheduled safety-net at 15:30 ET and auto-verify at 16:10 ET.

Notifications

Discord webhooks and Telegram messages deliver signal summaries, verification results, and alerts. Configurable per-channel routing.

GitHub Gist Reports

Styled HTML reports uploaded to GitHub Gist for mobile-friendly viewing. Clickable links instead of file attachments.

CLI Interface

The entire system is operated through a unified Typer-based CLI, installed as the signals command:

Terminal
1$ signals run # Full daily pipeline
2$ signals run --only rph,ng_winter # Run specific strategies
3$ signals run --date 2025-12-15 # Backtest mode
4$ signals run --dry-run # No output files
5$ signals run --strict # Abort on any warning
6$ signals preview # Offline signal preview
7$ signals reconcile # Compare TWS orders vs signals
8$ signals verify # Post-close position check
9$ signals update-accounts # Sync positions from TWS
10$ signals update-data # Refresh VIX futures data
11$ signals calendar # Show upcoming strategy actions
Section V

How a Signal Is Born

An end-to-end walkthrough tracing a single RPH signal for VTI — from raw Polygon API data through every pipeline stage to the final MOC order on your phone.

The previous sections explain what each piece of the system does. This section shows how they work together by tracing one concrete signal through the entire pipeline. Every number below comes from the actual source code — the config values from rph.yaml, the formulas from rph.py, and the checks from postcheck.py.

The Scenario

It's Tuesday, February 10, 2026 at 4:35 PM ET. The market just closed. The RPH (Risk Premia Harvesting) strategy needs to check whether VTI has drifted outside its 5% rebalance band in Account A. The account holds 195 shares of VTI with a NAV of $150,000 and a 6% volatility target. Let's trace exactly what happens.

Stage 1: Preflight

~2s

Validate everything before touching the market

It's 4:35 PM ET on a Tuesday. The pipeline starts by asking: is it safe to run? Preflight loads every YAML config through Pydantic with extra='forbid' — a single unexpected field kills the run. It checks the trading calendar, verifies positions.yaml was synced from TWS within the last 26 hours, and confirms the DataRouter can resolve all symbols. Only when every check passes does the pipeline advance.

Config validationrph.yaml parsed → RPHConfig (Pydantic, extra=forbid)
Calendar checkTuesday Feb 10, 2026 → valid trading day ✓
Positions freshnesspositions.yaml modified 3.2h ago (< 26h limit) ✓
Router validationVTI → Polygon, VGLT → Polygon, GLD → Polygon, IBIT → Polygon ✓
Mode detectionreference_date = today → mode = 'live'
Execution Trace
0/12
1
preflight_issues = run_preflight(ctx, project_root, strategies, router=router)Entry point
2
# 1. Config validation
3
config = RPHConfig.parse_yaml('config/strategies/rph.yaml')
4
# 2. Calendar check
5
assert is_trading_day(ctx.reference_date)
6
# 3. Positions freshness
7
age = now() - mtime('state/positions.yaml')
8
# 4. Router validation
9
for sym in ['VTI','VGLT','GLD','IBIT']:
10
router.resolve(sym)
11
# 5. Mode detection
12
ctx.mode = 'live' # reference_date == today
All preflight checks pass. Pipeline advances to data fetch.
Section VI

Safety & Risk Management

Defense-in-depth for a solo trading operation — multiple independent layers that catch errors before they become costly mistakes.

The safety architecture follows a propose-and-confirm pattern: the system generates signals and proposes orders, but a human reviews and confirms before submission to the broker. This is a deliberate choice — full automation is on the roadmap, but the current priority is ensuring correctness over speed. Every layer below is designed to catch errors before they reach the confirmation step.

Pure Strategy Functions

No side effects in compute() means signals are deterministic and reproducible. Given the same data and config, the same signals are always produced. Enforced by purity tests that patch I/O primitives.

Config vs State Separation

Configuration (human-edited) and state (machine-written) are never mixed. The system cannot read its own predictions as ground truth. Agent rules explicitly forbid writing to state/positions.yaml from signal generation.

Large Trade Guardrails

Post-check flags any single order exceeding 30% of account NAV. This catches data errors, miscalculations, or configuration mistakes before they become outsized positions.

Strict Mode

The --strict flag blocks execution if any data staleness warning, validation issue, or preflight concern is detected. Used for production runs where zero tolerance is required.

Run Manifests

Every pipeline run records a manifest.json with the git SHA, config hash, file hashes, timing, and any warnings. Any signal can be traced back to the exact code and configuration that produced it.

Post-Close Verification

After market close (~16:10 ET), the auto-verify command compares actual TWS positions against the intended signal targets. Discrepancies are flagged and posted to Discord immediately.

Strategy-Aware Reconciliation

Order reconciliation uses strategy-specific tolerances: RPH uses drift-band tolerance (since it rebalances within bands), while other strategies use flat NAV percentage thresholds. Stale fills from prior TWS sessions are filtered by execution date.

Error Scenarios in Action

Select a scenario below to see exactly how the safety layers respond — step by step — when something goes wrong:

Trigger

Polygon API returns data older than expected trading day

1

Preflight detects data timestamp mismatch

WARN
2

Warning logged: "Market data is 2 days stale"

WARN
3

In --strict mode: pipeline ABORTS immediately

BLOCK
4

In normal mode: continues with stale-data warning in manifest

PASS
5

Operator sees warning in Discord notification

INFO
OUTCOME: EXECUTION BLOCKED

Stale data is never silently used. Strict mode blocks execution; normal mode flags it prominently for human review.

Config Hash Reproducibility

Every pipeline run records a SHA-256 hash of the complete configuration. This ensures full auditability — any signal can be traced back to the exact parameters that produced it:

Config Hash Demo

Every pipeline run records a SHA-256 hash of the config files used. Edit the config below and watch the hash change — proving that any modification is detectable.

Config Hash

67a182b9

In production, this is a full SHA-256 hash. The manifest records it alongside the run timestamp, so any config drift between runs is immediately visible.

Why This Architecture?

Anticipating the questions someone reviewing this system might ask — here are the design decisions, explained.

Section VII

Technology Stack

The tools and integrations that power the platform — chosen for reliability, testability, and operational simplicity.

Core
Python 3.11+— Primary language
pyproject.toml— Package management
Typer— CLI framework
Pydantic— Config validation (extra=forbid)
pandas + numpy— Data manipulation
Data Providers
Polygon API— Equities, ETFs, real-time snapshots
Databento— Futures (MES)
IQFeed— VIX futures term structure
ib_insync— TWS broker integration
Testing
pytest— Test framework (704+ tests)
Golden tests— Regression against captured fixtures
Purity tests— Enforce no I/O in compute()
Backtest mode— Validate against historical results
Automation
Task Scheduler— Windows daily automation
Discord bot— 9 slash commands + scheduled tasks
Telegram— Signal delivery + alerts
GitHub Gist— Styled HTML reports
Development
Git / GitHub— Version control (private repo)
Cursor AI— LLM-assisted development
Claude— AI coding assistant
.cursor/rules/— Agent-compatible conventions
Configuration
YAML— Strategy + account configs
contracts.yaml— Instrument metadata for DataRouter
Dataclasses— Shared data models
CLAUDE.md / AGENTS.md— AI agent rule files

Dependency Map

An interactive visualization of the Python package ecosystem powering the platform. Hover over any node to see its role and connections.

Python Dependencies
17 packages9 critical
CORE
PythonCRITICAL
3.11+

Primary runtime — type hints, match statements, tomllib

Everything
PydanticCRITICAL
2.x

Config validation with extra=forbid — catches typos and schema violations at load time

depends on:Python
pipeline.pymodels.pyAll configs
pandasCRITICAL
2.x

DataFrame operations for market data manipulation, OHLCV processing, and signal computation

depends on:Pythonnumpy
All strategiesData clients
numpyCRITICAL
1.26+

Numerical operations — EWMA calculations, volatility estimation, z-scores

depends on:Python
RPHVXX SlayerVolatility utils
PyYAMLCRITICAL
6.x

YAML parsing for all configuration files — accounts, contracts, strategies

depends on:Python
Config loadingState management
Typer
0.12+

CLI framework — provides the `signals` command with subcommands and --flags

depends on:Python
cli.py
DATA PROVIDERS
polygon-api-clientCRITICAL
1.x

Official Polygon.io client — fetches equity/ETF OHLCV, snapshots, and reference data

depends on:Pythonrequests
polygon_client.pyRPHS&BUGA+2 more
databentoCRITICAL
0.x

Databento client — fetches MES futures data for S&B Rebalance futures exposure sizing

depends on:Pythonpandas
databento_client.pyS&B Rebalance
requests
2.x

HTTP client for IQFeed REST API — VIX futures term structure data

depends on:Python
iqfeed_client.pyVXX Slayer
BROKER
ib_insyncCRITICAL
0.9+

Interactive Brokers TWS API wrapper — position sync, order submission, account data

depends on:Python
update-accountsreconcileverify
TESTING
pytestCRITICAL
8.x

Test framework — runs 704+ tests including golden regression and purity enforcement

depends on:Python
All test files
pytest-cov
5.x

Coverage reporting — tracks which code paths are exercised by tests

depends on:Pythonpytest
CI pipeline
DELIVERY
discord.py
2.x

Discord bot framework — 9 slash commands, scheduled signal delivery, alert notifications

depends on:Python
discord_signal_bot.py
python-telegram-bot
20.x

Telegram integration — signal delivery and operational alerts to mobile

depends on:Python
notifications
Jinja2
3.x

HTML template engine — generates styled order worksheets and signal reports

depends on:Python
Output formattingGitHub Gist
DEVELOPMENT
ruff
0.x

Fast Python linter and formatter — enforces code style and catches common errors

depends on:Python
Development
mypy
1.x

Static type checker — validates type annotations across the codebase

depends on:Python
Development
Section VIII

Testing & Quality

A multi-layered testing approach that ensures correctness at every level — from individual strategy logic to full pipeline integration.

The test suite comprises 34 test files with 704+ individual tests, all running offline by default — no live API calls required. The testing philosophy emphasizes three pillars: strategy correctness (unit tests), behavioral stability (golden regression tests), and architectural integrity (purity enforcement tests).

Test Coverage by Category
CategoryFilesWhat It Tests
Strategy Unit Tests6 filesEach strategy's compute() logic with fixture data
Golden Regression1 file + fixturesExact signal output match against captured baselines
Purity Enforcement1 fileVerifies compute() makes no I/O calls (patches open, print, requests, urllib)
Data Client Tests3 filesPolygon, Databento, TWS client behavior
Utility Tests3 filesVolatility calculations, calendar math, price service
Integration Tests6 filesCheckpoint, reconciliation, preview, NAV estimation, output formatting

Purity Enforcement

The purity test is one of the most important architectural guardrails. It patches Python's I/O primitives during strategy execution via pytest and fails if any strategy attempts to read files, make network calls, or print output:

tests/test_strategy_purity.py(Python)
1def _purity_patches():
2 """Patch I/O primitives to detect impure strategy code."""
3 return [
4 patch("builtins.open", side_effect=AssertionError("I/O in compute()")),
5 patch("builtins.print", side_effect=AssertionError("print in compute()")),
6 patch("requests.get", side_effect=AssertionError("network in compute()")),
7 patch("urllib.request.urlopen", side_effect=AssertionError("network")),
8 ]
9
10# For every registered strategy:
11patches = _purity_patches()
12for p in patches:
13 p.start()
14try:
15 signals = strategy.compute(REF_DATE, data, config)
16 assert len(signals) > 0 # Must produce output
17finally:
18 for p in patches:
19 p.stop()

Golden Regression Tests

Golden tests capture the exact output of each strategy against a fixed set of market data fixtures. When code changes, the test compares new output against the captured baseline. Any difference — even a rounding change — must be explicitly acknowledged and the fixture re-captured. This catches subtle regressions that unit tests might miss.

Terminal
1# Capture new golden fixtures
2$ python tests/golden/capture_fixtures.py --only rph
3
4# Run golden regression tests
5$ pytest tests/golden/test_golden.py -v
6
7# Run full test suite
8$ pytest # All 704+ tests
9$ pytest tests/test_rph.py -v # Single strategy
10$ pytest --tb=short # Brief traceback

Manifest Inspector

Every pipeline run produces a manifest.json — a complete audit trail. Expand each section below to explore a sample manifest:

output/2026-02-10/manifest.jsonsample

Every pipeline run produces a manifest.json — a complete audit trail of what ran, when, and with what configuration.

Section IX

Glossary

A searchable reference of technical terms, architectural concepts, and domain-specific vocabulary used throughout this platform.

This glossary collects the key terms and concepts referenced throughout the site — from architectural patterns like the DataRouter and RunContext, to strategy-specific vocabulary like drift-band rebalancing and MAD z-scores, to operational concepts like config hashing and purity testing. Click any term to expand its full definition, and use the related terms to navigate between connected concepts.

Technical Glossary28 terms
B
C
D
E
G
I
M
O
P
R
S
T
V
Showing 28 of 28 terms
Section X

Technical FAQ & Feature Guide

A comprehensive reference covering every subsystem — architecture decisions, pipeline internals, safety layers, strategy purity, daily operations, and testing infrastructure.

This section presents the full technical documentation in a browsable format. Each chapter covers a major subsystem with plain-English explanations of what it is, why it exists, and how it works — including code examples, configuration snippets, and operational details. Use the search bar to find specific topics, or expand chapters to read through sequentially.

Quick Mental Model

This is a trading signals system. Every day, it: (1) pulls account data from Interactive Brokers, (2) fetches market prices from several data providers, (3) runs 6 independent strategy functions that each say "buy X shares of Y" or "hold", (4) checks the output for obvious mistakes, and (5) writes everything to files so you can enter orders and verify them later. The whole thing is wrapped in safety layers and can be operated from the terminal, a Discord bot on your phone, or a Jupyter notebook.

8 chapters · 41 sections
Section XI

What's Next

The platform is fully operational with all six strategies running daily. The roadmap focuses on deeper automation, observability, and performance tracking.

Automated Order Submission

Planned

Move from propose-and-confirm to full automation via the TWS API. The human review step becomes optional, with configurable guardrails for when manual confirmation is required.

Signal Ledger

Complete

SQLite run ledger (state/ledger.db) with two tables: runs (one row per pipeline run) and signals (one row per PositionSignal). Queryable via signals history for historical analysis, strategy attribution, and audit trails.

Performance Analytics

Planned

Programmatic tracking of strategy returns, attribution analysis, and risk metrics. Replace manual Excel-based performance tracking with automated dashboards.

Contract Roll Management

Planned

Automated handling of futures expiry — detecting upcoming rolls, calculating roll dates, and adjusting positions across contract months.

Enhanced Observability

In Progress

Richer run manifests, operational dashboards, and proactive alerting. The goal is to know about problems before the market opens, not after it closes.