# Bytelyst Trading Bot Service

Autonomous multi-profile crypto/equity trading bot with a pluggable rule-based strategy engine, per-profile execution, real-time dashboard integration, and AI-powered sentiment analysis.

## Architecture

```
┌─────────────────────────────────────────────────────────┐
│                    Trading Loop                          │
│  for each symbol → for each profile → ProStrategyEngine │
│                                                          │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐              │
│  │TrendBias │→ │ Session  │→ │  Zone    │→ ...          │
│  │  Rule    │  │  Rule    │  │  Rule    │               │
│  └──────────┘  └──────────┘  └──────────┘              │
│                                                          │
│  Signal → AutoTrader → RiskEngine → TradeExecutor       │
│                                       ↓                  │
│                              ┌────────────────┐         │
│                              │  Alpaca / CCXT  │         │
│                              └────────────────┘         │
└─────────────────────────────────────────────────────────┘
         ↕ Socket.IO + REST          ↕ Supabase
┌──────────────────┐        ┌──────────────────┐
│    Dashboard      │        │    PostgreSQL     │
│   (React App)     │        │  (Supabase DB)   │
└──────────────────┘        └──────────────────┘
```

## Features

- **Multi-Profile Execution** — Each trade profile runs its own strategy rules, risk limits, and capital allocation independently
- **7-Rule Strategy Pipeline** — TrendBias → Session → Zone → Momentum → EntryTrigger → RiskManagement → AIAnalysis
- **Per-Profile Rule Config** — Enable/disable rules, set parameters, and control execution order per profile
- **Profile Hot-Reload** — New profiles created from the dashboard are picked up automatically within 60 seconds
- **Pluggable Exchanges** — Alpaca (stocks/crypto) and CCXT (130+ exchanges) via factory pattern
- **AI Sentiment Analysis** — Perplexity, OpenAI, and Gemini with automatic fallback chain
- **Real-Time Dashboard** — Socket.IO for live price updates, signals, and position tracking
- **Profile-Mapped Orders** — Every order and trade history record is tagged with `profile_id`
- **Configurable Everything** — All thresholds, intervals, and parameters are configurable via env vars or per-profile JSON

## Quick Start

### Prerequisites

- Node.js 18+
- Supabase project (for auth, users, profiles, orders, trade history)
- Alpaca account (for trade execution) or CCXT-compatible exchange

### Installation

```bash
git clone https://github.com/saravanakumardb/bytelyst-trading-bot-service.git
cd bytelyst-trading-bot-service
npm install
```

### Configuration

Copy the example environment file:

```bash
cp .env.example .env
```

Edit `.env` with your credentials (see [Environment Variables](#environment-variables) below).

### Database Setup

Run the schema migration in your Supabase SQL Editor:

```bash
# Full schema setup (creates all tables + adds missing columns)
# Copy and paste the contents of:
schema/004_full_schema_sync.sql
```

### Run

```bash
# Development (with hot-reload via tsx)
npm run dev

# Production
npm start
```

## Project Structure

```
src/
├── config/
│   └── index.ts              # All configuration (env vars + defaults)
├── connectors/
│   ├── alpaca.ts              # Alpaca exchange connector
│   ├── ccxt.ts                # CCXT multi-exchange connector
│   ├── factory.ts             # Connector factory (pluggable)
│   └── types.ts               # IExchangeConnector interface
├── services/
│   ├── AutoTrader.ts          # Signal → trade decision logic
│   ├── TradeExecutor.ts       # Order execution + position tracking
│   ├── riskEngine.ts          # Position sizing + SL/TP calculation
│   ├── tradeMonitor.ts        # Background SL/trailing stop monitor
│   ├── SupabaseService.ts     # DB operations (orders, history, profiles)
│   ├── apiServer.ts           # REST + Socket.IO API for dashboard
│   ├── notifier.ts            # WhatsApp/webhook notifications
│   ├── aiClient.ts            # Multi-provider AI sentiment analysis
│   ├── ManualTrader.ts        # Manual trade execution via dashboard
│   └── MetricsService.ts      # Trading metrics calculation
├── strategies/
│   ├── ProStrategyEngine.ts   # Main strategy orchestrator
│   ├── directionTracker.ts    # Legacy signal tracker
│   └── rules/
│       ├── types.ts           # IRule interface, MarketContext, RuleResult
│       ├── TrendBiasRule.ts   # EMA50/200 trend direction (4H)
│       ├── SessionRule.ts     # Market session filter (London/NY)
│       ├── ZoneRule.ts        # Price-to-EMA proximity check
│       ├── MomentumRule.ts    # RSI momentum confirmation
│       ├── EntryTriggerRule.ts# EMA reclaim / wick patterns
│       ├── RiskManagementRule.ts # ATR-based SL/TP/position sizing
│       └── AIAnalysisRule.ts  # LLM sentiment validation
├── utils/
│   ├── indicators.ts          # EMA, RSI, ATR calculations
│   ├── logger.ts              # Winston logger
│   └── symbolMapper.ts        # Symbol format conversion
└── index.ts                   # Main entry point + trading loop
```

## Environment Variables

### Required

| Variable | Description | Example |
|---|---|---|
| `SUPABASE_URL` | Supabase project URL | `https://xxx.supabase.co` |
| `SUPABASE_KEY` | Supabase service role key | `eyJ...` |
| `PROVIDER` | Default exchange provider | `alpaca` or `ccxt` |
| `ALPACA_API_KEY` | Alpaca API key | `PK...` |
| `ALPACA_API_SECRET` | Alpaca secret key | `...` |

### Exchange Configuration

| Variable | Default | Description |
|---|---|---|
| `DATA_PROVIDER` | `$PROVIDER` | Provider for market data |
| `EXECUTION_PROVIDER` | `$PROVIDER` | Provider for order execution |
| `EXCHANGE` | `binance` | CCXT exchange (if using ccxt) |
| `CCXT_API_KEY` | — | CCXT exchange API key |
| `CCXT_API_SECRET` | — | CCXT exchange secret |
| `PAPER_TRADING` | `false` | Use paper trading keys |
| `ASSET_CLASS` | `crypto` | `crypto` or `us_equity` |

### Trading Symbols & Intervals

| Variable | Default | Description |
|---|---|---|
| `SYMBOLS` | `BTC/USD` | Comma-separated trading pairs |
| `POLLING_INTERVAL` | `60000` | Main loop interval (ms) |
| `SYMBOL_DELAY_MS` | `2000` | Delay between symbol processing |
| `TIMEFRAME` | `1Min` | Legacy candle timeframe |

### Execution & Risk

| Variable | Default | Description |
|---|---|---|
| `ENABLE_TRADING` | `false` | Enable live trade execution |
| `TOTAL_CAPITAL` | `1000` | Default total capital ($) |
| `MAX_OPEN_TRADES` | `3` | Max concurrent positions |
| `COOLDOWN_MS` | `3600000` | Post-trade cooldown (ms) |
| `PROFIT_EXIT_PERCENT` | `1.0` | Auto-exit profit threshold (%) |
| `TRAILING_STOP_PERCENT` | `0.001` | Trailing stop pullback (0.1%) |

### Strategy Parameters

| Variable | Default | Description |
|---|---|---|
| `ENABLED_RULES` | all 7 rules | Comma-separated rule list |
| `R_TREND_TIMEFRAME` | `4h` | Trend bias timeframe |
| `R_TREND_EMA_FAST` | `50` | Fast EMA period |
| `R_TREND_EMA_SLOW` | `200` | Slow EMA period |
| `R_RSI_PERIOD` | `14` | RSI calculation period |
| `R_RSI_OVERBOUGHT` | `70` | RSI overbought threshold |
| `R_RSI_OVERSOLD` | `30` | RSI oversold threshold |
| `R_ZONE_EMA_PERIOD` | `20` | Zone EMA period |
| `R_ATR_PERIOD` | `14` | ATR calculation period |
| `R_RISK_PER_TRADE` | `0.01` | Risk per trade (1%) |
| `R_RISK_REWARD_RATIO` | `1.5` | Risk/reward ratio |
| `R_SL_MULTIPLIER` | `1.5` | Stop loss ATR multiplier |
| `R_SESSION_WINDOWS` | JSON array | Session time windows |

### AI Configuration

| Variable | Default | Description |
|---|---|---|
| `AI_PROVIDER` | `openai` | Primary AI provider |
| `PERPLEXITY_API_KEY` | — | Perplexity API key |
| `OPENAI_API_KEY` | — | OpenAI API key |
| `GEMINI_API_KEY` | — | Google Gemini API key |
| `AI_FALLBACK_LIST` | `openai,perplexity,gemini` | Fallback chain |
| `AI_MODEL` | `gpt-4o` | AI model to use |
| `AI_CONFIDENCE_THRESHOLD` | `70` | Min confidence score |
| `AI_CACHE_HOURS` | `4` | Cache duration (hours) |

### Server & Notifications

| Variable | Default | Description |
|---|---|---|
| `API_PORT` | `5000` | API server port |
| `NOTIFICATION_PHONE_NUMBERS` | — | Comma-separated phone numbers |
| `NOTIFICATION_API_HOST` | `www.zenhustles.com` | Notification API host |
| `NOTIFICATION_API_PATH` | `/api/whatsapp/send` | Notification API path |
| `WEBHOOK_URL` | — | Legacy webhook URL |

### System Intervals

| Variable | Default | Description |
|---|---|---|
| `PROFILE_SYNC_INTERVAL_MS` | `60000` | Profile hot-reload interval |
| `MONITOR_INTERVAL_MS` | `60000` | Position monitor polling |

## Database Schema

7 tables are used (see `schema/004_full_schema_sync.sql` for full DDL):

| Table | Purpose |
|---|---|
| `users` | User accounts + exchange API keys |
| `entries` | Watchlist & manual positions |
| `trade_profiles` | Strategy profiles with per-profile rule config |
| `orders` | Active/pending orders (with `profile_id`) |
| `trade_history` | Completed trade ledger (with `profile_id`) |
| `bot_config` | Global config key-value store |
| `dynamic_config` | Runtime config overrides |

### strategy_config JSON Structure

Each profile stores its strategy configuration as a `jsonb` column:

```json
{
  "rules": [
    { "ruleId": "TrendBiasRule", "enabled": true, "params": { "emaFast": 50, "emaSlow": 200 } },
    { "ruleId": "SessionRule", "enabled": true, "params": { "allowedSessions": ["NY", "LDN"] } },
    { "ruleId": "ZoneRule", "enabled": true, "params": { "emaPeriod": 20 } },
    { "ruleId": "MomentumRule", "enabled": true, "params": { "rsiPeriod": 14 } },
    { "ruleId": "EntryTriggerRule", "enabled": true, "params": {} },
    { "ruleId": "RiskManagementRule", "enabled": true, "params": { "atrPeriod": 14 } },
    { "ruleId": "AIAnalysisRule", "enabled": false, "params": { "minConfidence": 80 } }
  ],
  "riskLimits": {
    "maxDailyLossUsd": 50,
    "dailyProfitTargetUsd": 100,
    "maxConsecutiveLosses": 2,
    "maxOpenTrades": 3
  },
  "execution": {
    "orderType": "market",
    "cooldownMinutes": 30,
    "minRulePassRatio": 0.70
  }
}
```

## API Endpoints

### REST

| Method | Endpoint | Description |
|---|---|---|
| `GET` | `/health` | Health check with uptime |
| `GET` | `/api/status` | Bot status, settings, symbols, positions |
| `GET` | `/api/config` | Current bot configuration (non-secret) |
| `GET` | `/api/alerts` | Recent alerts (supports `?limit=N`) |
| `GET` | `/api/symbol/:symbol` | Single symbol data |
| `POST` | `/api/trade` | Execute manual trade |
| `POST` | `/api/chat` | AI-powered profile generation (see below) |

### POST /api/chat — AI Strategy Assistant

Translates plain English into structured trading profile configurations using the bot's AI fallback chain (Perplexity → OpenAI → Gemini).

**Request:**
```json
{
  "message": "Create a conservative BTC swing trader with $2000 capital",
  "context": [{ "id": "...", "name": "Existing Profile", "allocated_capital": 1000, ... }]
}
```

**Response:**
```json
{
  "action": "create_profile",
  "profile": {
    "name": "Conservative BTC Swing Trader",
    "allocated_capital": 2000,
    "risk_per_trade_percent": 1,
    "symbols": "BTC/USDT",
    "is_active": true,
    "strategy_config": { "rules": [...], "riskLimits": {...}, "execution": {...} }
  },
  "summary": "Created a conservative BTC swing trading profile with $2000 capital and 1% risk per trade.",
  "reasoning": "Conservative profiles use lower risk and fewer aggressive rules."
}
```

**Supported actions:** `create_profile`, `update_profile`, `explain`

### Socket.IO Events

| Event | Direction | Description |
|---|---|---|
| `state` | Server → Client | Full bot state update |
| `symbol_update` | Server → Client | Single symbol price/signal update |
| `new_alert` | Server → Client | New trading alert |
| `orders_update` | Server → Client | Order status change |
| `positions_update` | Server → Client | Aggregated positions from all profiles |

## License

ISC
