Bläddra i källkod

波动率可以显示强度。

skyffire 1 år sedan
förälder
incheckning
c947985498
2 ändrade filer med 28 tillägg och 11 borttagningar
  1. 4 2
      README.MD
  2. 24 9
      src/msv.rs

+ 4 - 2
README.MD

@@ -21,8 +21,10 @@
     "message": "hello",                     // 后台提醒
     "code": 200,                            // 200 就是对的
     "data": {                               // 指标结果
-        "x": ["1", "2"],                    // x轴数据
-        "y": ["1", "2"],                    // y轴数据
+        "msv": [                            // y轴数据
+            ["1715653817313", "0.03", "2"], // [时间戳, 波动幅度, 强度]
+            ["1715653817316", "0.02", "7"], // [时间戳, 波动幅度, 强度]
+        ],
         "total_size": 3,                    // 总trades条数
         "result_size": 1,                   // 指标数据条数
     },

+ 24 - 9
src/msv.rs

@@ -1,4 +1,3 @@
-use std::collections::BTreeMap;
 use std::str::FromStr;
 use actix_web::{HttpResponse};
 use chrono::Utc;
@@ -91,7 +90,7 @@ pub async fn generate_msv(query_value: Value) -> HttpResponse {
 
 // 将trades转换为具体指标
 pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Value {
-    let mut amplitude_map: BTreeMap<Decimal, Decimal> = BTreeMap::new();
+    let mut result_data: Vec<Vec<Decimal>> = vec![];
 
     const GAMMA: Decimal = dec!(0.5);
 
@@ -107,7 +106,7 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
 
         // 计算区间的预定价格
         let mut ref_price = trade.price;
-
+        let mut dissociation = Decimal::ZERO;
         loop {
             // 第0个就不搞
             if range_index == 0 {
@@ -122,6 +121,7 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
             }
 
             ref_price = ref_price * GAMMA + flag_trade.price * (Decimal::ONE - GAMMA);
+            dissociation = dissociation + flag_trade.size.abs();
 
             range_index -= 1;
         }
@@ -141,17 +141,32 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
                 continue
             }
 
-            amplitude_map.insert(trade.time, rate);
+            // 去重,以及保留最大的波动率
+            if result_data.len() > 0 {
+                let last = result_data[result_data.len() - 1].clone();
+                let last_time = last[0];
+                let last_rate = last[1];
+
+                // 如果时间相同,则可能会进行remove等操作
+                if last_time == trade.time {
+                    // 如果最新的波动率大于最后波动率
+                    if rate.abs() > last_rate.abs() {
+                        result_data.remove(result_data.len() - 1);
+                        result_data.push(vec![trade.time, rate, dissociation]);
+                    }
+                } else {
+                    result_data.push(vec![trade.time, rate, dissociation]);
+                }
+            } else {
+                result_data.push(vec![trade.time, rate, dissociation]);
+            }
         }
     }
 
-    let x: Vec<Decimal> = amplitude_map.keys().cloned().collect();
-    let y: Vec<Decimal> = amplitude_map.values().cloned().collect();
     let total_size = trades.len();
-    let result_size = x.len();
+    let result_size = result_data.len();
     json!({
-        "x": x,
-        "y": y,
+        "msv": result_data,
         "total_size": total_size,
         "result_size": result_size,
     })