Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[package]
name = "ta-lib-in-rust"
name = "rusttalib"
version = "1.0.6"
edition = "2021"
description = "A library of technical indicators for financial analysis, similar to TA-Lib"
Expand All @@ -8,7 +8,7 @@ license = "MIT"
repository = "https://github.com/rustic-ml/RusTaLib"
# Add homepage, often same as repository if no separate project page
homepage = "https://github.com/rustic-ml/RusTaLib"
documentation = "https://docs.rs/ta-lib-in-rust"
documentation = "https://docs.rs/rusttalib"
readme = "README.md"
keywords = ["finance", "technical-analysis", "trading", "indicators", "stocks"]
# Add relevant categories for discoverability
Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
# RusTalib, the Crustacean Financial Analyst 🦀

Meet **Rustalib**, your steadfast crustacean companion for navigating the currents of financial markets! This comprehensive Rust library, `ta-lib-in-rust`, provides a powerful toolkit for calculating technical indicators, all powered by the high-performance [Polars](https://pola.rs/) DataFrame library.
Meet **Rustalib**, your steadfast crustacean companion for navigating the currents of financial markets! This comprehensive Rust library, `rusttalib`, provides a powerful toolkit for calculating technical indicators, all powered by the high-performance [Polars](https://pola.rs/) DataFrame library.

Whether you're charting, backtesting, or building live trading systems, Rustalib is here to help you process market data with speed and precision.

![Technical Indicators Library Icon](images_processed.png) [![crates.io](https://img.shields.io/crates/v/ta-lib-in-rust.svg)](https://crates.io/crates/ta-lib-in-rust)
[![docs.rs](https://docs.rs/ta-lib-in-rust/badge.svg)](https://docs.rs/ta-lib-in-rust)
![Technical Indicators Library Icon](images_processed.png) [![crates.io](https://img.shields.io/crates/v/rusttalib.svg)](https://crates.io/crates/rusttalib)
[![docs.rs](https://docs.rs/rusttalib/badge.svg)](https://docs.rs/rusttalib)

---

## Project Overview

**ta-lib-in-rust** provides a robust, extensible, and efficient toolkit for quantitative finance, algorithmic trading, and data science in Rust. The library is designed for:
**rusttalib** provides a robust, extensible, and efficient toolkit for quantitative finance, algorithmic trading, and data science in Rust. The library is designed for:
- **Fast, vectorized computation** using Polars DataFrames
- **Easy integration** with modern Rust data workflows
- **Modular design**: Use only the indicators you need
Expand Down Expand Up @@ -44,7 +44,7 @@ Add to your `Cargo.toml`:

```toml
[dependencies]
ta-lib-in-rust = "*" # Or specify a version
rusttalib = "*" # Or specify a version
polars = { version = "0.46", features = ["lazy", "dtype-full"] }
```

Expand Down Expand Up @@ -143,9 +143,9 @@ Contributions are welcome! Please:
---

## Links
- [Crates.io](https://crates.io/crates/ta-lib-in-rust)
- [Documentation (docs.rs)](https://docs.rs/ta-lib-in-rust)
- [GitHub Repository](https://github.com/rustic-ml/ta-lib-in-rust)
- [Crates.io](https://crates.io/crates/rusttalib)
- [Documentation (docs.rs)](https://docs.rs/rusttalib)
- [GitHub Repository](https://github.com/rustic-ml/rusttalib)

## License

Expand Down
4 changes: 2 additions & 2 deletions docs/csv_guide.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Working with CSV Data in ta-lib-in-rust
# Working with CSV Data in rusttalib

This guide explains how to effectively work with CSV data when using the ta-lib-in-rust library.
This guide explains how to effectively work with CSV data when using the rusttalib library.

## CSV Format Requirements

Expand Down
2 changes: 1 addition & 1 deletion examples/bollinger_bands_basic.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use polars::prelude::*;
use ta_lib_in_rust::indicators::volatility::calculate_bollinger_bands;
use rusttalib::indicators::volatility::calculate_bollinger_bands;

fn main() -> Result<(), PolarsError> {
// Create a simple price series with some movement
Expand Down
4 changes: 1 addition & 3 deletions examples/file_reading_example.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use polars::prelude::*;
use rusttalib::util::file_utils::{read_csv, read_csv_default, read_financial_data, read_parquet};
use std::error::Error;
use ta_lib_in_rust::util::file_utils::{
read_csv, read_csv_default, read_financial_data, read_parquet,
};

fn main() -> Result<(), Box<dyn Error>> {
println!("======= Reading Financial Data Files Example =======\n");
Expand Down
2 changes: 1 addition & 1 deletion examples/general/basic_indicators.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use polars::prelude::*;
use ta_lib_in_rust::indicators::{
use rusttalib::indicators::{
moving_averages::{calculate_ema, calculate_sma, calculate_wma},
oscillators::{calculate_macd, calculate_rsi},
volatility::calculate_bollinger_bands,
Expand Down
2 changes: 1 addition & 1 deletion examples/macd_basic.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use polars::prelude::*;
use ta_lib_in_rust::indicators::oscillators::calculate_macd;
use rusttalib::indicators::oscillators::calculate_macd;

fn main() -> Result<(), PolarsError> {
// Create a simple price series with some movement
Expand Down
2 changes: 1 addition & 1 deletion examples/moving_averages_basic.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use polars::prelude::*;
use ta_lib_in_rust::indicators::moving_averages::{calculate_ema, calculate_sma, calculate_wma};
use rusttalib::indicators::moving_averages::{calculate_ema, calculate_sma, calculate_wma};

fn main() -> Result<(), PolarsError> {
// Create a simple price series with trend followed by sideways movement
Expand Down
2 changes: 1 addition & 1 deletion examples/rsi_basic.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use polars::prelude::*;
use ta_lib_in_rust::indicators::oscillators::calculate_rsi;
use rusttalib::indicators::oscillators::calculate_rsi;

fn main() -> Result<(), PolarsError> {
// Create a simple price series with some movement
Expand Down
6 changes: 3 additions & 3 deletions examples/stock/mean_reversion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
// This example demonstrates a simple mean reversion strategy using technical indicators

use polars::prelude::*;
use ta_lib_in_rust::indicators::moving_averages::calculate_sma;
use ta_lib_in_rust::indicators::oscillators::calculate_rsi;
use ta_lib_in_rust::indicators::volatility::calculate_bollinger_bands;
use rusttalib::indicators::moving_averages::calculate_sma;
use rusttalib::indicators::oscillators::calculate_rsi;
use rusttalib::indicators::volatility::calculate_bollinger_bands;

fn main() -> Result<(), PolarsError> {
println!("Mean Reversion Strategy Example");
Expand Down
6 changes: 3 additions & 3 deletions examples/stock/trend_following.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
// This example demonstrates a simple trend following strategy using technical indicators

use polars::prelude::*;
use ta_lib_in_rust::indicators::moving_averages::calculate_sma;
use ta_lib_in_rust::indicators::oscillators::{calculate_macd, calculate_rsi};
use ta_lib_in_rust::indicators::trend::calculate_adx;
use rusttalib::indicators::moving_averages::calculate_sma;
use rusttalib::indicators::oscillators::{calculate_macd, calculate_rsi};
use rusttalib::indicators::trend::calculate_adx;

fn main() -> Result<(), PolarsError> {
println!("Trend Following Strategy Example");
Expand Down
2 changes: 1 addition & 1 deletion examples/vwap_basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// This example demonstrates how to calculate and visualize VWAP

use polars::prelude::*;
use ta_lib_in_rust::indicators::moving_averages::calculate_vwap;
use rusttalib::indicators::moving_averages::calculate_vwap;

fn main() -> Result<(), PolarsError> {
println!("VWAP (Volume Weighted Average Price) Example");
Expand Down
4 changes: 2 additions & 2 deletions examples/working_with_multi_stock_data.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use polars::prelude::*;
use std::convert::TryInto;
use ta_lib_in_rust::indicators::{
use rusttalib::indicators::{
moving_averages::{calculate_ema, calculate_sma},
oscillators::{calculate_macd, calculate_rsi},
volatility::{calculate_atr, calculate_bollinger_bands},
volume::calculate_obv,
};
use std::convert::TryInto;

/// This example demonstrates how to load and process data from multiple stock CSV files
/// that may have different column formats, and perform cross-stock comparisons.
Expand Down
2 changes: 1 addition & 1 deletion src/indicators/oscillators/dpo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ pub fn calculate_dpo(df: &DataFrame, close_col: &str, period: usize) -> PolarsRe
let len = df.height();
let mut dpo = vec![f64::NAN; len];
let shift = period / 2 + 1;

for (i, _) in (0..len).enumerate() {
if i + 1 >= period {
let sma: f64 = close
Expand Down
7 changes: 6 additions & 1 deletion src/indicators/volume/cmf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,12 @@ pub fn calculate_cmf(df: &DataFrame, window: usize) -> PolarsResult<Series> {

// Use an iterator-based approach as suggested by Clippy
let window_start = i - (window - 1);
for (idx, money_flow_vol) in money_flow_volumes.iter().enumerate().skip(window_start).take(window) {
for (idx, money_flow_vol) in money_flow_volumes
.iter()
.enumerate()
.skip(window_start)
.take(window)
{
let vol = volume.get(idx).unwrap_or(f64::NAN);

if !money_flow_vol.is_nan() && !vol.is_nan() {
Expand Down
Loading