#[inline(always)]
pub fn true_range(high: f64, low: f64, prev_close: f64) -> f64 {
(high - low)
.max((high - prev_close).abs())
.max((low - prev_close).abs())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_true_range_normal_bar() {
assert_eq!(true_range(105.0, 95.0, 100.0), 10.0);
}
#[test]
fn test_true_range_gap_up() {
assert_eq!(true_range(110.0, 105.0, 100.0), 10.0);
}
#[test]
fn test_true_range_gap_down() {
assert_eq!(true_range(95.0, 90.0, 100.0), 10.0);
}
#[test]
fn test_true_range_wide_bar() {
assert_eq!(true_range(120.0, 80.0, 100.0), 40.0);
}
#[test]
fn test_true_range_doji() {
assert_eq!(true_range(100.5, 99.5, 100.0), 1.0);
}
#[test]
fn test_true_range_extreme_gap() {
assert_eq!(true_range(150.0, 145.0, 100.0), 50.0);
}
}