Skip to content

Commit

Permalink
typprice, std, lint
Browse files Browse the repository at this point in the history
  • Loading branch information
m5l14i11 committed Jun 24, 2023
1 parent 9807985 commit a1ade7c
Show file tree
Hide file tree
Showing 10 changed files with 123 additions and 3 deletions.
7 changes: 5 additions & 2 deletions .github/workflows/quant.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,8 @@ jobs:
- name: Check out code
uses: actions/checkout@v2

- name: Test ta_lib
run: cargo test --manifest-path=ta_lib/Cargo.toml
- name: Test
run: make test

- name: Check
run: make check
10 changes: 10 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.PHONY: test check

TA_LIB_PATH ?= ta_lib/Cargo.toml

test:
cargo test --manifest-path=$(TA_LIB_PATH)

check:
cargo fmt --all --check --manifest-path=$(TA_LIB_PATH)
cargo clippy --all-features --all-targets --workspace --manifest-path=$(TA_LIB_PATH)
8 changes: 8 additions & 0 deletions ta_lib/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion ta_lib/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
[workspace]
members = [
"overlap",
"momentum"
"momentum",
"price",
"statistics"
]
8 changes: 8 additions & 0 deletions ta_lib/price/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
name = "price"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
1 change: 1 addition & 0 deletions ta_lib/price/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pub mod typical;
30 changes: 30 additions & 0 deletions ta_lib/price/src/typical.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
pub fn typical_price(high: &[f64], low: &[f64], close: &[f64]) -> Vec<Option<f64>> {
let len = high.len();

if len != low.len() || len != close.len() {
return vec![None; len];
}

high.iter()
.zip(low)
.zip(close)
.map(|((&h, &l), &c)| Some((h + l + c) / 3.0))
.collect()
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_typical_price() {
let high = vec![1.0, 2.0, 3.0];
let low = vec![0.5, 1.0, 1.5];
let close = vec![0.75, 1.5, 2.25];

let expected = vec![Some(0.75), Some(1.5), Some(2.25)];
let result = typical_price(&high, &low, &close);

assert_eq!(result, expected);
}
}
8 changes: 8 additions & 0 deletions ta_lib/statistics/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
name = "statistics"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
1 change: 1 addition & 0 deletions ta_lib/statistics/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pub mod stddev;
49 changes: 49 additions & 0 deletions ta_lib/statistics/src/stddev.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
pub fn std_dev(data: &[f64], period: usize) -> Vec<Option<f64>> {
let mut std_dev = vec![None; data.len()];
let mut sum = 0.0;
let mut sum_sq = 0.0;

for (i, &value) in data.iter().enumerate() {
sum += value;
sum_sq += value * value;

if i >= period {
let old_value = data[i - period];
sum -= old_value;
sum_sq -= old_value * old_value;
}

if i + 1 >= period {
let mean = sum / period as f64;
let mean_sq = sum_sq / period as f64;
std_dev[i] = Some((mean_sq - mean * mean).sqrt());
}
}

std_dev
}

#[cfg(test)]
mod test {
use super::*;

#[test]
fn test_std_dev() {
let data = vec![1.0, 2.0, 3.0, 4.0, 5.0];
let period = 2;
let epsilon = 0.001;
let expected = vec![None, Some(0.5), Some(0.5), Some(0.5), Some(0.5)];

let result = std_dev(&data, period);

for i in 0..result.len() {
match (result[i], expected[i]) {
(Some(a), Some(b)) => {
assert!((a - b).abs() < epsilon, "at position {}: {} != {}", i, a, b)
}
(None, None) => {}
_ => panic!("at position {}: {:?} != {:?}", i, result[i], expected[i]),
}
}
}
}

0 comments on commit a1ade7c

Please sign in to comment.