robinhood-options-mobile

Backtesting Interface

Comprehensive backtesting interface for testing trading strategies on historical data using the same multi-indicator system as live trading.

Features

Historical Data Access

Strategy Builder

Performance Metrics

Enhanced Pattern Detection

Visual Results

Enhanced Reporting

Export Reports

Architecture

Frontend (Flutter/Dart)

Models (lib/model/backtesting_models.dart)

Provider (lib/model/backtesting_provider.dart)

UI (lib/widgets/backtesting_widget.dart)

Backend (Firebase Functions)

Function (functions/src/backtesting.ts)

Usage

Running a Backtest

  1. Navigate to User Settings → Backtesting
  2. Configure backtest parameters:
    • Symbol: Stock ticker (e.g., AAPL, TSLA)
    • Date Range: Start and end dates
    • Interval: 1d, 1h, or 15m
    • Capital: Initial investment amount
    • Trade Quantity: Shares per trade
    • Risk Management: TP/SL percentages
  3. Enable desired indicators (default: all 19 enabled)
  4. Optionally configure advanced settings
  5. Click “Run Backtest”

Viewing Results

Results show:

Saving Templates

Save frequently used configurations:

  1. Configure desired settings
  2. After running backtest, save as template
  3. Access templates from Templates tab
  4. Load template to quickly run similar backtests

Comparing Results

  1. Run multiple backtests with different configurations
  2. View results in History tab
  3. Use comparison feature to analyze differences:
    • Return differences
    • Win rate differences
    • Risk metric comparisons

Technical Details

Backtest Simulation Logic

The backtest simulation follows this flow:

  1. Data Preparation
    • Fetch historical OHLCV data for symbol and market index
    • Determine start/end indices based on date range
    • Prepare data arrays for indicator calculation
  2. Bar-by-Bar Processing For each historical bar:
    • Calculate indicators using data up to current point
    • Evaluate all enabled indicators via evaluateAllIndicators()
    • Check exit conditions for open positions (TP/SL/trailing stop)
    • Check entry conditions if no position open (all indicators BUY)
    • Record trades and update equity curve
  3. Position Management
    • Entry: When all enabled indicators signal BUY
    • Exit:
      • Take Profit: Price increases by TP%
      • Stop Loss: Price decreases by SL%
      • Trailing Stop: Price drops TS% from highest point
    • End of Backtest: Close any open positions
  4. Metrics Calculation
    • Calculate trade statistics (wins, losses, averages)
    • Calculate risk metrics (Sharpe ratio, max drawdown)
    • Build equity curve for visualization
    • Compute hold times and other analytics

Integration with Live Trading

The backtesting system uses the exact same logic as live trading:

This ensures backtest results accurately reflect live trading performance.

Firebase Function Parameters

The runBacktest function accepts:

{
  symbol: string;
  startDate: string;  // ISO 8601
  endDate: string;    // ISO 8601
  initialCapital: number;
  interval: '1d' | '1h' | '15m';
  enabledIndicators: { [key: string]: boolean };
  tradeQuantity: number;
  takeProfitPercent: number;
  stopLossPercent: number;
  trailingStopEnabled: boolean;
  trailingStopPercent: number;
  rsiPeriod: number;
  smaPeriodFast: number;
  smaPeriodSlow: number;
  marketIndexSymbol: string;
}

Returns:

{
  config: BacktestConfig;
  trades: BacktestTrade[];
  finalCapital: number;
  totalReturn: number;
  totalReturnPercent: number;
  totalTrades: number;
  winningTrades: number;
  losingTrades: number;
  winRate: number;
  averageWin: number;
  averageLoss: number;
  largestWin: number;
  largestLoss: number;
  profitFactor: number;
  sharpeRatio: number;
  maxDrawdown: number;
  maxDrawdownPercent: number;
  averageHoldTimeSeconds: number;
  totalDurationSeconds: number;
  equityCurve: { timestamp: string; equity: number }[];
  performanceByIndicator: { [key: string]: any };
}

Firestore Structure

Backtest History

users/{userId}/backtest_history/{backtestId}
  - result: BacktestResult
  - createdAt: Timestamp

Templates

users/{userId}/backtest_templates/{templateId}
  - id: string
  - name: string
  - description: string
  - config: BacktestConfig
  - createdAt: string
  - lastUsedAt: string

Best Practices

Choosing Date Ranges

Indicator Selection

Risk Management

Result Interpretation

Avoiding Overfitting

Limitations

Current Limitations

  1. Commission: Currently set to $0 (can be added per trade)
  2. Slippage: Not simulated (assumes fills at close price)
  3. Liquidity: Doesn’t account for order book depth
  4. Market Impact: Assumes no price impact from orders
  5. Splits/Dividends: Not currently handled

Data Limitations

Future Enhancements

Planned Features

Advanced Analytics

Troubleshooting

Backtest Fails to Run

Check:

  1. Symbol is valid and supported by Yahoo Finance
  2. Date range contains sufficient data
  3. Start date is before end date
  4. Internet connection is stable
  5. Firebase Functions are deployed correctly

Note: The system now automatically handles NaN and Infinity values in underlying calculations to prevent data transmission errors.

No Trades Generated

Likely causes:

  1. No periods where all indicators align
  2. Indicator parameters too restrictive
  3. Insufficient capital for trade quantity
  4. Date range too short

Solutions:

Unrealistic Results

Consider:

  1. Commission and slippage not included
  2. Perfect fill assumptions
  3. Look-ahead bias if using future data
  4. Overfitting to specific time period

Solutions:

Slow Performance

Optimization:

  1. Reduce date range for initial tests
  2. Use daily interval instead of intraday
  3. Limit enabled indicators for faster computation
  4. Cache results for repeated tests

Integration Points

With Live Trading

With Trade Signals

With Firebase

Support

For issues or questions:

  1. Review this documentation
  2. Check Firebase Functions logs for errors
  3. Verify historical data availability
  4. Test with shorter date ranges first
  5. File a GitHub issue with backtest configuration and error details