Ver Fonte

up_down

skyffire há 1 ano atrás
pai
commit
b4bd5351bd
1 ficheiros alterados com 16 adições e 1 exclusões
  1. 16 1
      src/symbol_filter.rs

+ 16 - 1
src/symbol_filter.rs

@@ -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);