# Autopilot Architecture

This document describes the architecture of the Autopilot system, including both Pattern-Based and ML-Based modes.

## Overview

The Autopilot system provides autonomous trading signal generation using an **Intelligent Autopilot** powered by machine learning-based strategy selection.

## Architecture Diagram

```
┌─────────────────────────────────────────────────────────────┐
│                    Unified Autopilot API                    │
│                  (/api/autopilot/start-unified)            │
└───────────────────────┬─────────────────────────────────────┘
                        │
        ┌───────────────┴───────────────┐
        │                               │
        ▼                               ▼
┌───────────────────┐         ┌───────────────────┐
│ ML-Based          │         │  Signal Display   │
│ Autopilot         │         │  (Dashboard)      │
├───────────────────┤         └───────────────────┘
│ MarketAnalyzer    │
│ StrategySelector  │
│ PerformanceTracker│
└───────────────────┘
        │
        ▼
┌───────────────────────┐
│   Signal Generation   │
│   (StrategySignal)    │
└───────────────────────┘
        │
        ▼
┌───────────────────┐
│  Auto-Execution   │
│  (Optional)       │
└───────────────────┘
```

## ML-Based Autopilot Flow

> [!NOTE]
> **Global Model Architecture**: The system uses a single "Global Model" trained on data from *all* configured symbols. This allows for shared learning (patterns from BTC help predict ETH) and efficient resource usage.

> [!IMPORTANT]
> **Single-Asset Focus**: The current ML model is designed for **single-asset strategies** (e.g., Momentum, RSI, Grid). It analyzes each coin in isolation. It does **NOT** currently support multi-asset strategies like **Arbitrage**, which require analyzing correlations between multiple coins simultaneously.

```
Market Data (OHLCV)
        │
        ▼
┌───────────────────┐
│ MarketAnalyzer    │
│  - Analyze        │
│    conditions     │
│  - Determine      │
│    regime         │
└─────────┬─────────┘
          │
          ▼
┌───────────────────┐
│ StrategySelector   │
│  - Global ML Model │
│  - Select best     │
│    strategy        │
│  - Calculate       │
│    confidence      │
└─────────┬─────────┘
          │
          ▼
┌───────────────────┐
│ Selected Strategy │
│  - Generate signal│
│  - Calculate size  │
└─────────┬─────────┘
          │
          ▼
    StrategySignal
```

## API Endpoints

### Unified Endpoints

- `POST /api/autopilot/start-unified` - Start autopilot
- `POST /api/autopilot/stop-unified` - Stop autopilot
- `GET /api/autopilot/status-unified/{symbol}` - Get autopilot status

### Legacy Endpoints (Removed)

- `POST /api/autopilot/start` - (Removed)
- `POST /api/autopilot/intelligent/start` - (Removed)

## Mode Selection Logic

The unified endpoints now exclusively support the "intelligent" mode. Code handling other modes has been removed.

```python
def start_unified_autopilot(config: UnifiedAutopilotConfig):
    # Always starts intelligent autopilot
    autopilot = get_intelligent_autopilot(
        symbol=config.symbol,
        exchange_id=config.exchange_id,
        timeframe=config.timeframe,
        interval=config.interval,
        paper_trading=config.paper_trading
    )
    
    if config.auto_execute:
        autopilot.enable_auto_execution = True
    
    autopilot.start()
```

## Auto-Execution Integration

Auto-execution is integrated directly into the ML-based workflow:

```python
# Auto-Execution
if auto_execute and signal and confidence > threshold:
    trading_engine.execute_order(
        symbol=signal.symbol,
        side=signal.signal_type,
        quantity=strategy.calculate_position_size(signal, balance),
        ...
    )
```

## Pre-Flight Order Validation

Before submitting orders, the autopilot validates that the order will succeed:

```python
async def _can_execute_order(side, quantity, price) -> Tuple[bool, str]:
    # 1. Check minimum order value ($1 USD)
    if order_value < 1.0:
        return False, "Order value below minimum"
    
    # 2. For BUY: check sufficient balance (with fee buffer)
    if side == BUY:
        if balance < (order_value + fee_estimate):
            return False, "Insufficient funds"
    
    # 3. For SELL: check position exists
    if side == SELL:
        if no_position:
            return False, "No position to sell"
    
    return True, "OK"
```

**Benefits:**
- Prevents creation of PENDING orders that would be REJECTED
- Cleaner order history (no garbage orders)
- Faster execution (skip validation at execution layer)

## Smart Order Type Selection

The autopilot intelligently chooses between LIMIT and MARKET orders:

| Scenario | Order Type | Rationale |
|----------|-----------|-----------|
| Strong signal (>80%) | MARKET | High confidence, execute now |
| Normal BUY signal | LIMIT (-0.1%) | Get better entry, pay maker fees |
| Take-profit SELL | LIMIT (+0.1%) | Get better exit price |
| Stop-loss SELL | MARKET | Urgent exit, protect capital |

```python
def _determine_order_type_and_price(side, signal_strength, price, is_stop_loss):
    # Strong signals or stop-losses use MARKET
    if signal_strength > 0.8 or is_stop_loss:
        return MARKET, None
    
    # Normal signals use LIMIT with 0.1% better price
    if side == BUY:
        limit_price = price * 0.999  # 0.1% below market
    else:
        limit_price = price * 1.001  # 0.1% above market
    
    return LIMIT, limit_price
```

**Stop-Loss vs Take-Profit Detection:**
- If `current_price < entry_price`: Stop-loss (use MARKET)
- If `current_price > entry_price`: Take-profit (use LIMIT)

## Data Flow

1. **Market Data Collection**: OHLCV data from database
2. **Market Analysis**: MarketAnalyzer determines conditions
3. **Strategy Selection**: ML model selects best strategy
4. **Signal Generation**: Selected strategy generates signal
5. **Opportunity Evaluation**: Check confidence and criteria
6. **Execution** (if enabled): Execute trade
7. **Learning**: Record trade for model improvement

## Component Responsibilities

- **MarketAnalyzer**: Analyzes market conditions and determines regime
- **StrategySelector**: ML model for selecting optimal strategy
- **PerformanceTracker**: Tracks strategy performance for learning
- **IntelligentAutopilot**: Orchestrates ML-based selection and execution

## Configuration

```python
{
    "symbol": "BTC/USD",
    "exchange_id": 1,
    "timeframe": "1h",
    "interval": 60.0,  # Analysis cycle in seconds
    "paper_trading": True,
    "min_confidence_threshold": 0.75,
    "max_trades_per_day": 10,
    "auto_execute": False
}
```

## State Management

- `_running`: Boolean flag
- `_last_analysis`: Last analysis result
- `_selected_strategy`: Currently selected strategy
- `_trades_today`: Trade count for daily limit
- `_ohlcv_data`: Current market data
- `_strategy_instances`: Cached strategy instances
- `_intelligent_autopilots`: Global registry of active instances

## Error Handling

Both modes implement error handling:

- **Market Data Errors**: Fallback to cached data or skip cycle
- **Pattern Detection Errors**: Return no pattern, continue monitoring
- **Sentiment Analysis Errors**: Use neutral sentiment, continue
- **ML Model Errors**: Fallback to rule-based selection
- **Execution Errors**: Log error, continue monitoring

## Performance Considerations

- **Moderate**: ML model adds overhead but is optimized for speed
- **Adaptive**: Performance improves with more training data
- **Scalable**: Model can handle multiple symbols with shared learning

## ML Model Training

The ML model training system supports background training via Celery with configurable parameters.

### Training Configuration

Training is configured via the Bootstrap Config API and persisted in the application config:

| Parameter | Description | Default |
|-----------|-------------|---------|
| `days` | Historical data (days) to fetch | 90 |
| `timeframe` | OHLCV candle timeframe | `1h` |
| `min_samples_per_strategy` | Minimum samples needed per strategy | 10 |
| `symbols` | Cryptocurrencies to train on | `["BTC/USD", "ETH/USD"]` |

### API Endpoints

```
GET  /api/autopilot/bootstrap-config     # Get current config
PUT  /api/autopilot/bootstrap-config     # Update config
POST /api/autopilot/intelligent/retrain  # Trigger retraining
GET  /api/autopilot/tasks/{task_id}      # Poll training status
GET  /api/autopilot/intelligent/model-info  # Get model info
POST /api/autopilot/intelligent/reset    # Reset model
```

### Background Training Architecture

```
┌─────────────────┐     ┌──────────────┐     ┌─────────────────┐
│ Settings Page   │────▶│ FastAPI      │────▶│ Celery Worker   │
│ (React)         │     │ Backend      │     │ (train_task)    │
└─────────────────┘     └──────────────┘     └─────────────────┘
        │                      │                      │
        │ Poll status          │ get_config()         │ Reset singletons
        │◀─────────────────────│                      │ Bootstrap data
        │                      │                      │ Train model
        │                      │                      │ Save to disk
        │                      │◀─────────────────────│
        │ SUCCESS + metrics    │                      │
        │◀─────────────────────│                      │
        │                      │                      │
        ▼                      ▼                      ▼
  UI shows results      Model auto-loads       Model file saved
```

### Training Task Flow

1. **Singleton Reset**: Reset `StrategySelector`, `PerformanceTracker`, and `Database` singletons to prevent async conflicts
2. **Check Existing Data**: Query performance tracker for existing training samples
3. **Bootstrap (if needed)**: Fetch OHLCV data for each symbol with progress updates
4. **Train Model**: Train ML model with cross-validation and walk-forward validation
5. **Save Model**: Persist trained model to `~/.local/share/crypto_trader/models/`
6. **Return Metrics**: Return training accuracy and model metadata

### Model Auto-Reload

The `StrategySelector.get_model_info()` method automatically checks for new model files:

```python
def get_model_info(self):
    # Always check if a newer model is available on disk
    self._try_load_saved_model()  # Compare timestamps, reload if newer
    return {...}
```

This ensures the API process picks up newly trained models without restart.

### Error Handling

- **Celery Task Errors**: Serialized to JSON with traceback for frontend display
- **Polling Errors**: Frontend stops polling after 3 consecutive failures
- **Connection Errors**: Singletons reset to prevent `asyncpg.InterfaceError`

## Strategy Grouping

To improve ML accuracy, individual strategies are grouped into 5 logical categories. The model predicts the best **group**, then rule-based logic selects the optimal strategy within that group.

### Strategy Groups

| Group | Strategies | Market Conditions |
|-------|-----------|-------------------|
| **Trend Following** | moving_average, macd, confirmed | Strong trends (ADX > 25) |
| **Mean Reversion** | rsi, bollinger_mean_reversion, grid, divergence | Ranging markets, oversold/overbought |
| **Momentum** | momentum, volatility_breakout | High volume spikes, breakouts |
| **Market Making** | market_making, dca | Low volatility, stable markets |
| **Sentiment Based** | sentiment, pairs_trading, consensus | External signals available |

### Benefits

- **Reduced Classes**: 5 groups vs 14 strategies (~20% random baseline vs ~7%)
- **Better Generalization**: Model learns group characteristics rather than memorizing individual strategies
- **Combined Confidence**: `group_confidence × strategy_confidence` for final score

## Improved Bootstrap Sampling

Training data is collected using intelligent sampling rather than fixed intervals:

### Sampling Strategies

1. **Regime-Change Detection**: Sample when market regime changes (e.g., trending → ranging)
2. **Minimum Time Spacing**: 24-hour gaps between samples for 1h timeframe
3. **Periodic Sampling**: Every 48 hours regardless of regime changes

### Timeframe Spacing

| Timeframe | Min Spacing (candles) | Actual Time |
|-----------|----------------------|-------------|
| 1m | 1440 | 24 hours |
| 15m | 96 | 24 hours |
| 1h | 24 | 24 hours |
| 4h | 6 | 24 hours |
| 1d | 1 | 24 hours |

## Security Considerations

- **Auto-Execution**: Requires explicit user confirmation
- **Paper Trading**: Default mode for safety
- **Risk Limits**: Enforced regardless of mode
- **API Keys**: Encrypted storage
- **Audit Logging**: All autopilot actions logged

## Future Enhancements

- Hybrid mode combining both approaches
- Real-time mode switching
- Multi-symbol autopilot management
- Advanced risk management integration
- Performance analytics dashboard
- Persistent training configuration (file/database storage)

