Skip to content

Commit

Permalink
Added Rate of Change indicators.
Browse files Browse the repository at this point in the history
Added smaller test set from TA-Lib (20 data points.)
Updated all tests to use smaller amount of data.
README updates.
  • Loading branch information
Ohkthx committed Sep 12, 2023
1 parent f12d99c commit bf1f403
Show file tree
Hide file tree
Showing 18 changed files with 391 additions and 123 deletions.
7 changes: 6 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "tatk"
license = "MIT"
version = "0.2.2"
version = "0.2.3"
edition = "2021"
description = "Technical Analysis Toolkit"
readme = "README.md"
Expand Down Expand Up @@ -61,6 +61,11 @@ name = "obv"
path = "examples/obv.rs"
required-features = ["test-data"]

[[example]]
name = "roc"
path = "examples/roc.rs"
required-features = ["test-data"]

[[example]]
name = "traits"
path = "examples/user_traits.rs"
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,13 @@ tatk = { git = "https://github.com/ohkthx/tatk-rs" }
```

## Features
- **Moving Averages**
- **Momentum / Moving Averages**
- Simple Moving Average (SMA)
- Exponential Moving Average (EMA)
- Double Exponential Moving Average (DEMA)
- McGinley Dynamic Indicator (MD)
- On-Balance Volume (OBV)
- Rate of Change (ROC)
- **Oscillators**
- Relative Strength Index (RSI)
- Moving Average Convergence and Divergence (MACD)
Expand Down Expand Up @@ -84,6 +85,7 @@ Following examples can be ran with: `cargo run --example short_id`
- **Average True Range (ATR)**: [atr.rs](https://github.com/Ohkthx/tatk-rs/tree/main/examples/atr.rs)
- **McGinley Dynamic Indicator (MD)**: [md.rs](https://github.com/Ohkthx/tatk-rs/tree/main/examples/md.rs)
- **On-Balance Volume (OBV)**: [obv.rs](https://github.com/Ohkthx/tatk-rs/tree/main/examples/obv.rs)
- **Rate of Change (ROC)**: [roc.rs](https://github.com/Ohkthx/tatk-rs/tree/main/examples/roc.rs)
- **Traits (Traits)**: [user_traits.rs](https://github.com/Ohkthx/tatk-rs/tree/main/examples/user_traits.rs)

## Tips Appreciated!
Expand Down
4 changes: 2 additions & 2 deletions examples/atr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ use tatk::test_data::TestData;
use tatk::traits::{Next, Value};

fn main() {
let period: usize = 14;
let period: usize = 10;
let candles = TestData::candles();

println!("Data (total): {:?}", candles.len());
println!("Period: {}", period);

// Create the ATR.
let mut atr = match ATR::new(period, &candles[..candles.len() - 2]) {
let mut atr = match ATR::new(period, &candles[..candles.len() - 1]) {
Ok(value) => value,
Err(error) => panic!("{}", error),
};
Expand Down
19 changes: 11 additions & 8 deletions examples/bbands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ use tatk::test_data::TestData;
use tatk::traits::{Next, Value};

fn main() {
let period: usize = 20;
const DATA: &[f64] = TestData::talib();
let period: usize = 10;
let data: &[f64] = TestData::talib_small();

println!("Data: {:?}", DATA);
println!("Data (total): {:?}", data.len());
println!("Period: {}", period);

// Use EMA as the line instead of the default SMA.
let ema = match EMA::new(period, DATA) {
// Use EMA as the line instead of the default EMA.
let ema = match EMA::new(period, &data[..data.len() - 1]) {
Ok(value) => value,
Err(error) => panic!("{}", error),
};
Expand All @@ -21,16 +21,19 @@ fn main() {
Err(error) => panic!("{}", error),
};

// Extract last data point.
let last_data = data[data.len() - 1];

println!(
"\nBollinger Band (BBands): {}, lower: {}, upper: {}",
bbands.value(),
bbands.lower(),
bbands.upper()
);

let next = bbands.next(107.0);
let next = bbands.next(last_data);
println!(
"Adding 107.00. New BBands: {}, lower: {}, upper: {}",
next.1, next.0, next.2
"Adding {}. New BBands: {}, lower: {}, upper: {}",
last_data, next.1, next.0, next.2
);
}
12 changes: 8 additions & 4 deletions examples/dema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,20 @@ use tatk::traits::{Next, Value};

fn main() {
let period: usize = 10;
const DATA: &[f64] = TestData::talib();
let data: &[f64] = TestData::talib_small();

println!("Data: {:?}", DATA);
println!("Data (total): {:?}", data.len());
println!("Period: {}", period);

let mut dema = match DEMA::new(period, DATA) {
// Create the DEMA.
let mut dema = match DEMA::new(period, &data[..data.len() - 1]) {
Ok(value) => value,
Err(error) => panic!("{}", error),
};

// Extract last data point.
let last_data = data[data.len() - 1];

println!("\nDEMA: {}", dema.value());
println!("Adding 107.00. New DEMA: {}", dema.next(107.0));
println!("Adding {}. New DEMA: {}", last_data, dema.next(last_data));
}
12 changes: 8 additions & 4 deletions examples/ema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,20 @@ use tatk::traits::{Next, Value};

fn main() {
let period: usize = 10;
const DATA: &[f64] = TestData::talib();
let data: &[f64] = TestData::talib_small();

println!("Data: {:?}", DATA);
println!("Data (total): {:?}", data.len());
println!("Period: {}", period);

let mut ema = match EMA::new(period, DATA) {
// Create the EMA.
let mut ema = match EMA::new(period, &data[..data.len() - 1]) {
Ok(value) => value,
Err(error) => panic!("{}", error),
};

// Extract last data point.
let last_data = data[data.len() - 1];

println!("\nEMA: {}", ema.value());
println!("Adding 107.00. New EMA: {}", ema.next(107.0));
println!("Adding {}. New EMA: {}", last_data, ema.next(last_data));
}
19 changes: 13 additions & 6 deletions examples/macd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,24 @@ use tatk::test_data::TestData;
use tatk::traits::{Next, Value};

fn main() {
let period: usize = 10;
const DATA: &[f64] = TestData::talib();
let short: usize = 8;
let long: usize = 10;
let signal: usize = 6;
let data: &[f64] = TestData::talib_small();

println!("Data: {:?}", DATA);
println!("Period: {}", period);
println!("Data (total): {:?}", data.len());
println!("Periods:");
println!("short: {}, long: {}, signal: {}", short, long, signal);

let mut macd = match MACD::new(12, 26, 9, DATA) {
// Create the MACD.
let mut macd = match MACD::new(short, long, signal, &data[..data.len() - 1]) {
Ok(value) => value,
Err(error) => panic!("{}", error),
};

// Extract last data point.
let last_data = data[data.len() - 1];

println!("\nMACD: {}, signal: {}", macd.value(), macd.signal_value());
println!("Adding 107.00. New MACD: {}", macd.next(107.0).1);
println!("Adding {}. New MACD: {}", last_data, macd.next(last_data).0);
}
13 changes: 8 additions & 5 deletions examples/md.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,20 @@ use tatk::traits::{Next, Value};

fn main() {
let period: usize = 10;
let k: f64 = 0.6;
const DATA: &[f64] = TestData::talib();
let data: &[f64] = TestData::talib_small();

println!("Data: {:?}", DATA);
println!("Data (total): {:?}", data.len());
println!("Period: {}", period);

let mut md = match MD::new(period, DATA, k) {
// Create the MD.
let mut md = match MD::new(period, &data[..data.len() - 1], 0.6) {
Ok(value) => value,
Err(error) => panic!("{}", error),
};

// Extract last data point.
let last_data = data[data.len() - 1];

println!("\nMD: {}", md.value());
println!("Adding 107.00. New MD: {}", md.next(107.0));
println!("Adding {}. New MD: {}", last_data, md.next(last_data));
}
4 changes: 2 additions & 2 deletions examples/obv.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ use tatk::test_data::TestData;
use tatk::traits::{Next, Value};

fn main() {
let period: usize = 14;
let period: usize = 10;
let candles = TestData::candles();

println!("Data (total): {:?}", candles.len());
println!("Period: {}", period);

// Create the OBV.
let mut atr = match OBV::new(period, &candles[..candles.len() - 2]) {
let mut atr = match OBV::new(period, &candles[..candles.len() - 1]) {
Ok(value) => value,
Err(error) => panic!("{}", error),
};
Expand Down
24 changes: 24 additions & 0 deletions examples/roc.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//! Demonstrates how to initialize and use a ROC.
use tatk::indicators::ROC;
use tatk::test_data::TestData;
use tatk::traits::{Next, Value};

fn main() {
let period: usize = 10;
let data = TestData::talib_small();

println!("Data (total): {:?}", data.len());
println!("Period: {}", period);

// Create the ROC.
let mut roc = match ROC::new(period, &data[..data.len() - 1]) {
Ok(value) => value,
Err(error) => panic!("{}", error),
};

// Extract last candle.
let last_candle = data[data.len() - 1];

println!("\nROC: {}", roc.value());
println!("Adding last candle. New ROC: {}", roc.next(last_candle));
}
14 changes: 9 additions & 5 deletions examples/rsi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ use tatk::test_data::TestData;
use tatk::traits::{Next, Value};

fn main() {
let period: usize = 14;
const DATA: &[f64] = TestData::talib();
let period: usize = 10;
let data: &[f64] = TestData::talib_small();

println!("Data: {:?}", DATA);
println!("Data (total): {:?}", data.len());
println!("Period: {}", period);

let mut rsi = match RSI::new(period, DATA) {
// Create the RSI.
let mut rsi = match RSI::new(period, &data[..data.len() - 1]) {
Ok(value) => value,
Err(error) => panic!("{}", error),
};
Expand All @@ -19,11 +20,14 @@ fn main() {
rsi.set_oversold(30.0);
rsi.set_overbought(70.0);

// Extract last data point.
let last_data = data[data.len() - 1];

println!("\nRSI: {}", rsi.value());
println!(
"Oversold?: {}, Overbought: {}",
rsi.is_oversold(),
rsi.is_overbought()
);
println!("Adding 107.00. New RSI: {}", rsi.next(107.0));
println!("Adding {}. New RSI: {}", last_data, rsi.next(last_data));
}
12 changes: 8 additions & 4 deletions examples/sma.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,20 @@ use tatk::traits::{Next, Value};

fn main() {
let period: usize = 10;
const DATA: &[f64] = TestData::talib();
let data: &[f64] = TestData::talib_small();

println!("Data: {:?}", DATA);
println!("Data (total): {:?}", data.len());
println!("Period: {}", period);

let mut sma = match SMA::new(period, DATA) {
// Create the SMA.
let mut sma = match SMA::new(period, &data[..data.len() - 1]) {
Ok(value) => value,
Err(error) => panic!("{}", error),
};

// Extract last data point.
let last_data = data[data.len() - 1];

println!("\nSMA: {}", sma.value());
println!("Adding 107.00. New SMA: {}", sma.next(107.0));
println!("Adding {}. New SMA: {}", last_data, sma.next(last_data));
}
2 changes: 2 additions & 0 deletions src/indicators/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ mod exponential_moving_average;
mod mcginley_dynamic;
mod moving_average_convergence_divergence;
mod on_balance_volume;
mod rate_of_change;
mod relative_strength_index;
mod simple_moving_average;
mod standard_deviation;
Expand All @@ -21,6 +22,7 @@ pub use exponential_moving_average::EMA;
pub use mcginley_dynamic::MD;
pub use moving_average_convergence_divergence::MACD;
pub use on_balance_volume::OBV;
pub use rate_of_change::ROC;
pub use relative_strength_index::RSI;
pub use simple_moving_average::SMA;
pub use standard_deviation::STDEV;
Expand Down
Loading

0 comments on commit bf1f403

Please sign in to comment.