Jelajahi Sumber

MSV指标更新,更容易识别出行情陷阱

skyffire 1 tahun lalu
induk
melakukan
9045dd9a98
1 mengubah file dengan 9 tambahan dan 45 penghapusan
  1. 9 45
      src/msv.rs

+ 9 - 45
src/msv.rs

@@ -1,4 +1,3 @@
-use std::cmp::max;
 use std::collections::BTreeMap;
 use std::str::FromStr;
 use actix_web::{HttpResponse};
@@ -94,8 +93,7 @@ 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);
+    const GAMMA: Decimal = dec!(0.9);
 
     // 每一个元素都遍历一遍
     trades.sort_by(|a, b| Decimal::from_str(a.id.as_str()).unwrap().cmp(&Decimal::from_str(b.id.as_str()).unwrap()));
@@ -107,9 +105,8 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
             index
         };
 
-        // 寻找区间最大值、最小值
-        let mut max_price = MAX_INIT_VALUE;
-        let mut min_price = MIN_INIT_VALUE;
+        // 计算区间的预定价格
+        let mut ref_price = trade.price;
 
         loop {
             // 第0个就不搞
@@ -124,13 +121,7 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
                 break;
             }
 
-            // 判断最大值、最小值
-            if trade.size < Decimal::ZERO && flag_trade.size < Decimal::ZERO && flag_trade.price > max_price {
-                max_price = flag_trade.price;
-            }
-            if trade.size > Decimal::ZERO && flag_trade.size > Decimal::ZERO && flag_trade.price < min_price {
-                min_price = flag_trade.price;
-            }
+            ref_price = ref_price * GAMMA + flag_trade.price * (Decimal::ONE - GAMMA);
 
             range_index -= 1;
         }
@@ -141,43 +132,16 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
 
         // 不是初始值,以及不是0波动
         if index != 0 {
-            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);
+            let mut rate = Decimal::ONE_HUNDRED * (last_price - ref_price) / ref_price;
+
+            rate.rescale(2);
 
             // 去除小数位之后,可以忽略一些太小的波动,减少图表生成压力
-            if up_rate.eq(&Decimal::ZERO) && dn_rate.eq(&Decimal::ZERO) {
+            if rate.eq(&Decimal::ZERO) {
                 continue
             }
 
-            // 如果已经生成了一个波动,则也要和已生成的波动进行比较
-            let insert_value = if amplitude_map.contains_key(&trade.time) {
-                let origin_rate = amplitude_map.get(&trade.time).unwrap();
-
-                if up_rate > dn_rate.abs() {
-                    max(*origin_rate, up_rate)
-                } else {
-                    max(*origin_rate, dn_rate)
-                }
-            } else {
-                if up_rate > dn_rate.abs() {
-                    up_rate
-                } else {
-                    dn_rate
-                }
-            };
-
-            amplitude_map.insert(trade.time, insert_value);
+            amplitude_map.insert(trade.time, rate);
         }
     }