The backtesting engine uses BacktestConfig to control all aspects of simulation realism, from network latency to fill probabilities.
BacktestConfig Structure
The main configuration is defined in nano-backtest/src/config.rs:11-29:
Initial Capital
Starting capital in USD for the backtest.
Latency Configuration
Realistic latency simulation is critical for HFT backtesting. The LatencyConfig struct (config.rs:104-132) models network and exchange delays:
Latency Components
Jitter Models
The latency simulator supports multiple jitter models (latency.rs:26-52):
- None: Deterministic latency (no variance)
- Uniform: Random jitter in range
[-max_jitter, +max_jitter]
- Normal: Gaussian distribution with configurable std dev
- LogNormal: Realistic network latency distribution
- Empirical: Based on historical percentile data
[p50, p75, p90, p95, p99]
Preset Latency Profiles
Aurora (CME Primary Colo) - latency.rs:215-220:
Aggressive HFT - config.rs:47-56:
Conservative - config.rs:76-82:
Fee Configuration
The FeeConfig struct (config.rs:134-172) models exchange and clearing fees:
CME Default Fees
Fee Calculation
Total fee per trade:
Example for a 10-contract maker trade:
Risk Configuration
The RiskConfig struct (config.rs:174-207) defines position limits and risk controls:
Default Risk Limits
Risk Presets
Aggressive HFT:
Conservative:
Execution Configuration
The ExecutionConfig struct (config.rs:209-242) controls fill simulation realism:
Fill Simulation
Queue Position Tracking (execution.rs:63-68):
- Tracks order position in the limit order book queue
- Fill probability decays exponentially:
decay^queue_position
- Default decay: 0.9 (90% probability at front, 81% at position 2, etc.)
Partial Fills (execution.rs:185-198):
- Simulates realistic partial execution
- Default 20% probability of partial fill
- Fill size randomly chosen between
min_partial_fill and remaining quantity
Adverse Selection (execution.rs:171-177):
- Models the tendency to get filled when market moves against you
- Default 10% probability that fill doesn’t occur due to adverse selection
- Critical for realistic maker strategy backtesting
Default Execution Settings
Conservative Preset (config.rs:93-97):
Output Configuration
The OutputConfig struct (config.rs:244-273) controls logging and data recording:
Default Output Settings
Enabling record_tick_pnl = true can significantly impact performance and memory usage for high-frequency strategies.
Example Configuration
Create a backtest_config.toml file:
Rust API
Configuration Presets
Two built-in presets are available:
Aggressive HFT (config.rs:45-69)
Optimized for sub-millisecond strategies:
- Ultra-low latency (50μs orders)
- Tight risk limits (50 max position)
- Realistic fill simulation
Conservative (config.rs:71-100)
Optimized for strategy validation:
- Higher latency (200μs orders)
- Buffered fees (1.2x CME rates)
- Conservative fill model (70% decay)
- Tighter drawdown limit (3%)