Same functionality, new name and branding. Update references to RustTI in your projects to Centaur Technical Indicators. This change aligns with the Centaur Capital ecosystem. Where you'll find explanations, tutorials, and more.
A highly configurable and high-performance technical indicators library written in pure Rust.
Designed for flexibility, speed, and advanced use cases in quantitative and algorithmic trading.
Part of the Centaur Research and Technologies ecosystem — visit https://centaurresearchtechnologies.com/ for more.
Looking for the Python bindings? See: CentaurTechnicalIndicators-Python
Looking for the WASM bindings? See: CentaurTechnicalIndicators-JS
The fastest way to get up and running with Centaur Technical Indicators.
1. Add Centaur Technical Indicators to your project:
cargo add centaur_technical_indicatorsOr, manually in your Cargo.toml:
centaur_technical_indicators = "1.2.1"2. Calculate your first indicator:
use centaur_technical_indicators;
let prices = vec![100.2, 100.46, 100.53, 100.38, 100.19];
let ma = centaur_technical_indicators::moving_average::single::moving_average(
&prices,
centaur_technical_indicators::MovingAverageType::Simple
);
println!("Simple Moving Average: {}", ma);Expected output:
Simple Moving Average: 100.352
3. Explore more tutorials
- Getting started tutorial
- Choosing the right model
- Building your first strategy
- Backtesting tutorial
- Visualization tutorial
Task-oriented guides for common problems and advanced scenarios.
- Load CSV Price Data: Parse OHLC prices from a file and calculate RSI
- When to use a bulk vs single module: Understand when to use bulk functions or single functions
- Choosing the right constant model type: Programmatically determine the best
ConstantModelType - Choosing the right deviation model: Programmatically determine the best deviation model
- Choosing the right period: Programmatically determine the best period
- How to use the Personalised Moving Average: Programmatically determine the alpha of the moving average
- How to use the McGinley dynamic variation of functions: Quick guide on how to use the McGinley Dynamic functions
(Contributions welcome! Submit your favorite how-to guide as a PR.)
For complete API details, see docs.rs/centaur_technical_indicators.
A reference of how to call each function can be found
Clone and run:
cargo build
cargo run --example reference- Modules based on their analysis areas (
moving_average,momentum_indicators,strength_indicators...) bulk&singlesubmodulesbulk: Compute indicator over rolling periods, returns a vector.single: Compute indicator for the entire vector, returns a single value.
- Types used to personalise the technical indicators (
MovingAverageType,DeviationModel,Position...)
For machine-readable discovery of all public indicator functions, use:
docs/indicator_registry.json(canonical registry)docs/indicator_registry.schema.json(registry schema)
- Performance: Pure Rust implementation for maximal speed, safety, and zero dependencies.
- Configurability: Most indicators are highly customizable—tweak calculation methods, periods, or even use medians instead of means.
- Breadth: Covers a wide range of technical indicators out of the box.
- Advanced Use: Designed for users who understand technical analysis and want deep control.
Note: Some features may require background in technical analysis. See Investopedia: Technical Analysis for a primer.
All indicators are grouped and split into modules based on their analysis area.
Each module has bulk (vector output) and single (scalar output) submodules.
- Simple, Smoothed, Exponential Moving Average, Bollinger Bands, MACD, RSI
- Absolute Deviation, Log, Mean, Median, Mode, Std. Deviation, Variance, Max/Min
- Ichimoku Cloud, Moving Constant Bands/Envelopes, Donchian Channels, Keltner, Supertrend
- Trend break down, overall trends, peak/valley trends
- Correlate asset prices
- Chaikin Oscillator, CCI, MACD, Money Flow Index, On Balance Volume, ROC, RSI, Williams %R
- McGinley Dynamic, Moving Average
- ROI, True Range, ATR, Internal Bar Strength
- Accumulation/Distribution, PVI, NVI, RVI
- Aroon (Up/Down/Oscillator), Parabolic, DM, Volume-Price Trend, TSI
- Ulcer Index
Want to know how fast Centaur Technical Indicators runs in real-world scenarios?
We provide detailed, reproducible benchmarks using realistic OHLCV data and a variety of indicators.
| Function | Time per Operation |
|---|---|
relative_strength_index |
573.86 µs |
stochastic_oscillator |
784.13 µs |
williams_percent_r |
76.256 µs |
money_flow_index |
150.69 µs |
rate_of_change |
5.3984 µs |
on_balance_volume |
17.405 µs |
commodity_channel_index |
103.19 µs |
mcginley_dynamic_commodity_channel_index |
66.044 µs |
macd_line |
51.482 µs |
mcginley_dynamic_macd_line |
44.461 µs |
chaikin_oscillator |
258.33 µs |
percentage_price_oscillator |
58.060 µs |
chande_momentum_oscillator |
370.14 µs |
| Function | Time per Operation |
|---|---|
moving_constant_envelopes |
37.572 µs |
mcginley_dynamic_envelopes |
39.264 µs |
moving_constant_bands |
119.70 µs |
mcginley_dynamic_bands |
43.219 µs |
ichimoku_cloud |
192.93 µs |
donchian_channels |
28.481 µs |
keltner_channel |
318.05 µs |
supertrend |
148.80 µs |
| Function | Time per Operation |
|---|---|
aroon_up |
16.531 µs |
aroon_down |
16.592 µs |
aroon_indicator |
66.468 µs |
parabolic_time_price_system |
43.939 µs |
directional_movement_system |
88.965 µs |
volume_price_trend |
6.2801 µs |
true_strength_index |
705.25 µs |
| Function | Time per Operation |
|---|---|
accumulation_distribution |
8.2935 µs |
positive_volume_index |
7.6977 µs |
negative_volume_index |
7.6167 µs |
relative_vigor_index |
505.34 µs |
| Function | Time per Operation |
|---|---|
return_on_investment |
40.962 µs |
true_range |
3.4663 µs |
average_true_range |
122.08 µs |
internal_bar_strength |
5.3943 µs |
positivity_indicator |
20.683 µs |
| Function | Time per Operation |
|---|---|
mean |
5.7432 µs |
median |
333.68 µs |
mode |
931.09 µs |
log |
20.335 µs |
log_difference |
42.223 µs |
variance |
20.921 µs |
standard_deviation |
24.095 µs |
absolute_deviation(Mean) |
26.991 µs |
absolute_deviation(Median) |
345.14 µs |
absolute_deviation(Mode) |
956.83 µs |
| Function | Time per Operation |
|---|---|
peaks |
93.094 µs |
valleys |
92.119 µs |
peak_trend |
188.14 µs |
valley_trend |
188.81 µs |
overall_trend |
10.337 µs |
break_down_trends |
14.655 ms |
| Function | Time per Operation |
|---|---|
correlate_asset_prices |
231.14 µs |
| Function | Time per Operation |
|---|---|
moving_average(Simple) |
17.575 µs |
moving_average(Smoothed) |
76.601 µs |
moving_average(Exponential) |
78.505 µs |
mcginley_dynamic |
39.653 µs |
| Function | Time per Operation |
|---|---|
ulcer_index |
65.959 µs |
These results are from a Raspberry Pi 5 8GB, your machine will likely be faster!
👉 See all benchmarks and how to run your own
Contributions, bug reports, and feature requests are welcome!
- Open an issue
- Submit a pull request
- See CONTRIBUTING.md for guidelines
Before opening a PR, run the same quality gates used in CI:
cargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-features
cargo doc --no-deps- Start a discussion
- File issues
- Add your project to the Showcase
Latest (v1.2.1):
- Added machine-readable indicator registry (
docs/indicator_registry.json) and JSON schema - Added contributor AI guidance docs (
AGENTS.md,docs/REPO_MAP.md,docs/AI_ONBOARDING.md) - Added CI quality gates (
fmt,clippy,test,doc) as blocking jobs and registry/docs validation scripts
MIT License. See LICENSE.