Crates.io | indicator_macros |
lib.rs | indicator_macros |
version | 0.4.4 |
source | src |
created_at | 2023-10-09 10:46:59.507455 |
updated_at | 2023-11-29 12:33:27.661117 |
description | Abstractions for stream aggregation, we call them `Indicator` s. |
homepage | |
repository | https://github.com/Nouzan/indicator |
max_upload_size | |
id | 997852 |
size | 35,300 |
Abstractions for stream aggregation, we call them Indicator
s.
Add indicator
as a dependency of your project.
[dependencies]
indicator = "0.4"
rust_decimal = "1.17.0"
rust_decimal_macros = "1.17.0"
time = { version = "0.3", default-features = false, features = ["macros"] }
And then, you can try these codes.
use arrayvec::ArrayVec;
use indicator::*;
use rust_decimal::Decimal;
use rust_decimal_macros::dec;
use time::macros::{datetime, offset};
/// Return an indicator that calculate `hl2` and `ohlc4` simultaneously.
fn hl2_ohlc4(period: Period) -> impl Operator<TickValue<Decimal>, Output = (Decimal, Decimal)> {
tumbling(
period,
|_w: &ArrayVec<[Decimal; 4], 0>, y: &mut Option<[Decimal; 4]>, x| match y {
Some(ohlc) => {
ohlc[1] = ohlc[1].max(x);
ohlc[2] = ohlc[2].min(x);
ohlc[3] = x;
*ohlc
}
None => {
let ohlc = [x; 4];
*y = Some(ohlc);
ohlc
}
},
)
.then(facet_t(
map_t(|ohlc: [Decimal; 4]| (ohlc[1] + ohlc[2]) / dec!(2)),
map_t(|ohlc: [Decimal; 4]| (ohlc[0] + ohlc[1] + ohlc[2] + ohlc[3]) / dec!(4)),
))
.map(|v| v.value)
}