Dashboard & Visualization

Generate interactive web dashboards to visualize backtest results, trades, and equity curves. Export to JSON for custom integrations.

Web
Interactive Charts
JSON
Export Format
Live
Auto-refresh
8000
Default Port

Web Dashboard Demo

Visualization~100 linesVue.jsCharts

Complete example showing how to generate test data, run a simple backtest, and launch an interactive web dashboard with trade visualization.

web_dashboard_demo.pyFull example
#!/usr/bin/env python3
"""
RLX Web Dashboard Demo
Demonstrates launching the dashboard via dashboard_gen.plot()
"""

import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from rlxbt import rlx


def create_test_data():
    """Create test data for demonstration"""
    print("šŸ“Š Creating test data...")

    np.random.seed(42)
    n_bars = 1000
    base_price = 50000.0

    # Create timestamps (hourly)
    start_time = datetime(2024, 1, 1)
    timestamps = [
        int((start_time + timedelta(hours=i)).timestamp()) 
        for i in range(n_bars)
    ]

    # Generate prices with trend and volatility
    prices = []
    current_price = base_price

    for i in range(n_bars):
        trend = 0.0001 * i
        volatility = np.random.normal(0, 0.001) * current_price
        current_price += trend + volatility

        prices.append({
            "timestamp": timestamps[i],
            "open": current_price,
            "high": current_price * (1 + abs(np.random.normal(0, 0.001))),
            "low": current_price * (1 - abs(np.random.normal(0, 0.001))),
            "close": current_price + np.random.normal(0, 0.0005) * current_price,
            "volume": np.random.randint(100, 1000),
        })
        current_price = prices[-1]["close"]

    df = pd.DataFrame(prices)
    print(f"āœ… Created {len(df)} bars")
    return df


def create_simple_signals(df):
    """Create simple SMA crossover signals"""
    print("šŸ“ˆ Generating trading signals...")

    signals = []
    in_position = False
    max_positions = 50
    position_count = 0

    # Simple SMA strategy
    df["sma_short"] = df["close"].rolling(window=10).mean()
    df["sma_long"] = df["close"].rolling(window=30).mean()

    for i in range(len(df)):
        signal = 0

        if i < 30:
            signals.append(signal)
            continue

        short_sma = df["sma_short"].iloc[i]
        long_sma = df["sma_long"].iloc[i]
        prev_short = df["sma_short"].iloc[i - 1]
        prev_long = df["sma_long"].iloc[i - 1]

        # Buy: short SMA crosses above long SMA
        if (not in_position and position_count < max_positions
                and prev_short <= prev_long and short_sma > long_sma):
            signal = 1
            in_position = True
            position_count += 1

        # Sell: short SMA crosses below long SMA
        elif in_position and prev_short >= prev_long and short_sma < long_sma:
            signal = -1
            in_position = False

        signals.append(signal)

    print(f"āœ… Generated {sum(1 for s in signals if s != 0)} signals")
    return signals

Running the Dashboard

Main function with dashboard launch
def main():
    """Main function for testing RLX web dashboard"""
    print("šŸš€ Starting RLX Web Dashboard Test...")

    # Create test data and signals
    test_data = create_test_data()
    signals = create_simple_signals(test_data)

    # Backtest settings
    initial_capital = 100_000.0
    commission = 0.001  # 0.1%
    slippage = 0.0005   # 0.05%

    print("šŸ”§ Initializing TradingEngine...")

    # Create Rust backtesting engine
    engine = rlx.TradingEngine(
        initial_capital=initial_capital,
        commission=commission,
        slippage=slippage,
        contract_size=1.0,
        enable_dynamic_tp_sl=False,
    )

    print("šŸ“Š Running backtest...")

    # Add signals to DataFrame
    test_data["signal"] = signals

    # Run backtest
    backtest_result = engine.run_with_signals(test_data, "signal")

    print("āœ… Backtest complete!")
    print(f"   šŸ“ˆ Trades: {len(backtest_result.trades)}")
    print(f"   šŸ’° Final Capital: ${backtest_result.final_capital:.2f}")
    print(f"   šŸ“Š Total Return: {backtest_result.total_return:.2f}%")

    if len(backtest_result.trades) == 0:
        print("āš ļø  No trades to display")
        return

    print("šŸŽØ Creating dashboard...")

    # Create dashboard generator
    dashboard_gen = rlx.DashboardGenerator(
        initial_capital=initial_capital,
        commission=commission,
        slippage=slippage,
        use_intrabar_resolution=False,
        contract_size=1.0,
    )

    # Generate dashboard data
    dashboard_result = dashboard_gen.generate_dashboard(backtest_result, test_data)

    print("šŸš€ Launching Web Dashboard...")
    print("šŸ’” Dashboard available at: http://localhost:8000")
    print("šŸ”„ Press Ctrl+C to stop server")

    try:
        # Launch web dashboard (blocks execution)
        dashboard_gen.plot(
            dashboard_result,
            port=8000,
            auto_open=True,  # Automatically open browser
        )
    except KeyboardInterrupt:
        print("\nšŸ‘‹ Server stopped by user")


if __name__ == "__main__":
    main()

DashboardGenerator API

Constructor Parameters

Parameter Type Description
initial_capital float Starting capital for metrics calculation
commissionfloatCommission rate (0.001 = 0.1%)
slippagefloatSlippage rate
use_intrabar_resolution boolEnable high-resolution intrabar data
contract_size floatContract size multiplier

Methods

generate_dashboard(result, data, intrabar_data?)
Generate dashboard data from backtest result
plot(dashboard_result, port, auto_open)
Launch web server and open browser
export_to_json(dashboard_result, path)
Export dashboard data to JSON file

Dashboard Features

  • āœ“ Interactive equity curve chart
  • āœ“ Trade markers on price chart
  • āœ“ Drawdown visualization
  • āœ“ Trade list with details
  • āœ“ Performance metrics summary
  • āœ“ Monthly returns heatmap

JSON Export

Export dashboard data for custom integrations or external tools:

Export to JSON
# Export dashboard data to JSON
dashboard_gen.export_to_json(dashboard_result, "my_backtest.json")

# Load and use in custom application
import json
with open("my_backtest.json") as f:
    data = json.load(f)

print(f"Metrics: {data['metrics']}")
print(f"Trades: {len(data['trades'])}")
print(f"Equity points: {len(data['equity_curve'])}")