5.1 KiB
5.1 KiB
Module: app
Purpose
The app module provides a real-time Dash web application for visualizing OHLC candlestick charts, volume data, Order Book Imbalance (OBI) metrics, and orderbook depth. It implements a polling-based architecture that reads JSON data files and renders interactive charts with a dark theme.
Public Interface
Functions
build_empty_ohlc_fig() -> go.Figure: Create empty OHLC chart with proper stylingbuild_empty_depth_fig() -> go.Figure: Create empty depth chart with proper stylingbuild_ohlc_fig(data: List[list], metrics: List[list]) -> go.Figure: Build complete OHLC+Volume+OBI chartbuild_depth_fig(depth_data: dict) -> go.Figure: Build orderbook depth visualization
Global Variables
_LAST_DATA: Cached OHLC data for error recovery_LAST_DEPTH: Cached depth data for error recovery_LAST_METRICS: Cached metrics data for error recovery
Dash Application
app: Main Dash application instance with Bootstrap theme- Layout with responsive grid (9:3 ratio for OHLC:Depth charts)
- 500ms polling interval for real-time updates
Usage Examples
Running the Application
# Start the Dash server
uv run python app.py
# Access the web interface
# Open http://localhost:8050 in your browser
Programmatic Usage
from app import build_ohlc_fig, build_depth_fig
# Build charts with sample data
ohlc_data = [[1640995200000, 50000, 50100, 49900, 50050, 125.5]]
metrics_data = [[1640995200000, 0.15, 0.22, 0.08, 0.18]]
depth_data = {
"bids": [[49990, 1.5], [49985, 2.1]],
"asks": [[50010, 1.2], [50015, 1.8]]
}
ohlc_fig = build_ohlc_fig(ohlc_data, metrics_data)
depth_fig = build_depth_fig(depth_data)
Dependencies
Internal
viz_io: Data file paths and JSON readingviz_io.DATA_FILE: OHLC data sourceviz_io.DEPTH_FILE: Depth data sourceviz_io.METRICS_FILE: Metrics data source
External
dash: Web application frameworkdash.html,dash.dcc: HTML and core componentsdash_bootstrap_components: Bootstrap stylingplotly.graph_objs: Chart objectsplotly.subplots: Multiple subplot supportpandas: Data manipulation (minimal usage)json: JSON file parsinglogging: Error and debug loggingpathlib: File path handling
Chart Architecture
OHLC Chart (Left Panel, 9/12 width)
- Main subplot: Candlestick chart with OHLC data
- Volume subplot: Bar chart sharing x-axis with main chart
- OBI subplot: Order Book Imbalance candlestick chart in blue tones
- Shared x-axis: Synchronized zooming and panning across subplots
Depth Chart (Right Panel, 3/12 width)
- Cumulative depth: Stepped line chart showing bid/ask liquidity
- Color coding: Green for bids, red for asks
- Real-time updates: Reflects current orderbook state
Styling and Theme
Dark Theme Configuration
- Background: Black (
#000000) - Text: White (
#ffffff) - Grid: Dark gray with transparency
- Candlesticks: Green (up) / Red (down)
- Volume: Gray bars
- OBI: Blue tones for candlesticks
- Depth: Green (bids) / Red (asks)
Responsive Design
- Bootstrap grid system for layout
- Fluid container for full-width usage
- 100vh height for full viewport coverage
- Configurable chart display modes
Data Polling and Error Handling
Polling Strategy
- Interval: 500ms for near real-time updates
- Graceful degradation: Uses cached data on JSON read errors
- Atomic reads: Tolerates partial writes during file updates
- Logging: Warnings for data inconsistencies
Error Recovery
# Pseudocode for error handling pattern
try:
with open(data_file) as f:
new_data = json.load(f)
_LAST_DATA = new_data # Cache successful read
except (FileNotFoundError, json.JSONDecodeError):
logging.warning("Using cached data due to read error")
new_data = _LAST_DATA # Use cached data
Performance Characteristics
- Client-side rendering: Plotly.js handles chart rendering
- Efficient updates: Only redraws when data changes
- Memory bounded: Limited by max bars in data files (1000)
- Network efficient: Local file polling (no external API calls)
Testing
Run application tests:
uv run pytest test_app.py -v
Test coverage includes:
- Chart building functions
- Data loading and caching
- Error handling scenarios
- Layout rendering
- Callback functionality
Configuration Options
Server Configuration
- Host:
0.0.0.0(accessible from network) - Port:
8050(default Dash port) - Debug mode: Disabled in production
Chart Configuration
- Update interval: 500ms (configurable via dcc.Interval)
- Display mode bar: Enabled for user interaction
- Logo display: Disabled for clean interface
Known Issues
- High CPU usage during rapid data updates
- Memory usage grows with chart history
- No authentication or access control
- Limited mobile responsiveness for complex charts
Development Notes
- Uses Flask development server (not suitable for production)
- Callback exceptions suppressed for partial data scenarios
- Bootstrap CSS loaded from CDN
- Chart configurations optimized for financial data visualization