|
|
@@ -76,18 +76,33 @@ fn calc_volatility_div_price_diff(records: Value) -> Decimal {
|
|
|
|
|
|
let price_diff = (Decimal::ONE_HUNDRED * (close - open) / open).abs();
|
|
|
let mut volatility = Decimal::ZERO;
|
|
|
+ let mut up = Decimal::ZERO;
|
|
|
+ let mut down = Decimal::ZERO;
|
|
|
for record in records_array {
|
|
|
let record_high = Decimal::from_str(record["high"].as_str().unwrap().to_string().as_str()).unwrap();
|
|
|
let record_low = Decimal::from_str(record["low"].as_str().unwrap().to_string().as_str()).unwrap();
|
|
|
+ let record_open = Decimal::from_str(record["open"].as_str().unwrap().to_string().as_str()).unwrap();
|
|
|
+ let record_close = Decimal::from_str(record["close"].as_str().unwrap().to_string().as_str()).unwrap();
|
|
|
let mid = (record_high + record_low) / Decimal::TWO;
|
|
|
|
|
|
volatility += Decimal::ONE_HUNDRED * (record_high - record_low) / mid;
|
|
|
+ if record_close > record_open {
|
|
|
+ up += Decimal::ONE
|
|
|
+ } else if record_close < record_open {
|
|
|
+ down += Decimal::ONE
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
let mut vdpd = if price_diff.is_zero() {
|
|
|
Decimal::ONE_THOUSAND
|
|
|
} else {
|
|
|
- volatility / price_diff
|
|
|
+ let up_down_diff = (up - down).abs();
|
|
|
+
|
|
|
+ if up_down_diff.is_zero() {
|
|
|
+ Decimal::TWO * volatility / price_diff
|
|
|
+ } else {
|
|
|
+ (Decimal::ONE / up_down_diff) * volatility / price_diff
|
|
|
+ }
|
|
|
};
|
|
|
vdpd.rescale(6);
|
|
|
|