Kaynağa Gözat

增加msv指标识别准确性

skyffire 1 yıl önce
ebeveyn
işleme
c78cf5569b
1 değiştirilmiş dosya ile 17 ekleme ve 6 silme
  1. 17 6
      src/msv.rs

+ 17 - 6
src/msv.rs

@@ -94,6 +94,9 @@ pub async fn generate_msv(query_value: Value) -> HttpResponse {
 pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Value {
     let mut amplitude_map: BTreeMap<Decimal, Decimal> = BTreeMap::new();
 
+    const MAX_INIT_VALUE: Decimal = dec!(-1);
+    const MIN_INIT_VALUE: Decimal = dec!(1e28);
+
     // 每一个元素都遍历一遍
     trades.sort_by(|a, b| Decimal::from_str(a.id.as_str()).unwrap().cmp(&Decimal::from_str(b.id.as_str()).unwrap()));
     for (index, trade) in trades.iter().enumerate() {
@@ -105,8 +108,8 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
         };
 
         // 寻找区间最大值、最小值
-        let mut max_price = dec!(-1);
-        let mut min_price = dec!(1e28);
+        let mut max_price = MAX_INIT_VALUE;
+        let mut min_price = MIN_INIT_VALUE;
 
         loop {
             // 第0个就不搞
@@ -122,10 +125,10 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
             }
 
             // 判断最大值、最小值
-            if flag_trade.price > max_price {
+            if flag_trade.price > max_price && flag_trade.size < Decimal::ZERO {
                 max_price = flag_trade.price;
             }
-            if flag_trade.price < min_price {
+            if flag_trade.price < min_price && flag_trade.size > Decimal::ZERO {
                 min_price = flag_trade.price;
             }
 
@@ -138,8 +141,16 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
 
         // 不是初始值,以及不是0波动
         if index != 0 {
-            let mut up_rate = Decimal::ONE_HUNDRED * (last_price - min_price) / min_price;
-            let mut dn_rate = Decimal::ONE_HUNDRED * (last_price - max_price) / max_price;
+            let mut up_rate = if min_price == MIN_INIT_VALUE {
+                Decimal::ZERO
+            } else {
+                Decimal::ONE_HUNDRED * (last_price - min_price) / min_price
+            };
+            let mut dn_rate = if max_price == MAX_INIT_VALUE {
+                Decimal::ZERO
+            } else {
+                Decimal::ONE_HUNDRED * (last_price - max_price) / max_price
+            };
 
             up_rate.rescale(2);
             dn_rate.rescale(2);