A fully-typed, modular toolkit for building algorithmic trading bots in TypeScript β from technical indicators up to a Telegram-controlled live bot.
This monorepo is home to the popular trading-signals library (tested in production and trusted by hundreds of projects worldwide) along with everything you need to turn those signals into a running trading bot: strategies, an exchange abstraction, and a chatbot front-end.
Every piece is independently usable. Pick a package, drop it into your app, or run the whole stack and command your bot from your phone.
- Streaming-first indicators β SMA, EMA, RSI, MACD, Bollinger Bands, and many more, with replace-mode and lazy evaluation for backtests and live use.
- Composable strategies β a tiny
Strategyinterface (return anOrderAdviceper candle) lets you focus on signal logic while the framework owns session state, order placement, fills, and broker quirks. Ships with ready-to-use building blocks and aProtectedStrategybase that adds self-cleaning stop-loss / take-profit kill switches. - Visual backtesting in your browser β try any strategy against historical candles with interactive charts, trade markers, and P&L stats at typedtrader.com/backtest. Tune parameters, see the results instantly, no setup required.
- Broker-agnostic execution β a unified exchange interface with type-safe schemas (Zod), WebSocket streaming, and paper-trading support. Ships with Alpaca Trading out of the box but is designed for any additional broker or exchange to plug in.
- Control your bot from Telegram β add accounts, spin up strategies via conversational wizards, watch prices, schedule recurring reports, and inspect live strategy state and config, all from a chat.
- Modern TypeScript stack β Latest TypeScript version, ESM-native, Node LTS, Lerna-managed workspaces, Vitest-covered, drizzle-backed persistence.
npm install
# Run the full test matrix across all packages
npm test
# Launch the indicator showcase (Next.js)
npm run start:docs
# Start the Telegram bot (requires TELEGRAM_BOT_TOKEN in your env)
npm run start:botThis project uses Lerna to manage a monorepo with independent versioning.
| Package | Description |
|---|---|
| trading-signals | Technical indicators (SMA, EMA, RSI, MACD, Bollinger Bands, ...) for algorithmic trading with streaming updates, replace mode, lazy evaluation, and memory efficiency. Battle-tested in production. |
| trading-strategies | Trading strategies that combine indicators into actionable advice. Ships with a library of ready-to-use strategies and a ProtectedStrategy base that wires stop-loss and take-profit kill switches into any subclass. |
| @typedtrader/exchange | Unified exchange interface for different brokers (currently Alpaca). Type-safe data transformation, WebSocket candles and order updates, paper- and live-trading environments behind a single API. |
| @typedtrader/messaging | Remote-control layer for your personal trading bot via Telegram. Add accounts, run strategies, watch prices, schedule reports, and inspect live strategy state β all from chat. Persistence via SQLite + Drizzle ORM. |
| trading-signals-docs | Interactive showcase and visual backtester built with Next.js. Explore every indicator in action, then backtest strategies against real historical candles with charts, trade markers, and P&L stats. |
At the foundation, trading-signals provides technical indicators like SMA, EMA, RSI, and Bollinger Bands. trading-strategies builds on top of them to produce actionable trading advice and ships kill-switch protection out of the box. @typedtrader/exchange abstracts away broker differences so strategies can run against any supported exchange. Finally, @typedtrader/messaging ties it all together into a chatbot that lets you operate your bot remotely.
graph TD
messaging["@typedtrader/messaging (Chatbot)"]
messaging --> strategies["trading-strategies"]
messaging --> exchange["@typedtrader/exchange"]
strategies --> signals["trading-signals"]
signals --> SMA
signals --> EMA
signals --> RSI
signals --> BBANDS["Bollinger Bands"]
signals --> MACD
signals --> more["..."]
exchange --> Alpaca
exchange --> IB["Interactive Brokers"]
exchange --> more-exchanges["..."]