Переглянути джерело

x轴能看出时间了。

skyffire 1 рік тому
батько
коміт
66e14c40b6
1 змінених файлів з 71 додано та 6 видалено
  1. 71 6
      src/msv.rs

+ 71 - 6
src/msv.rs

@@ -2,7 +2,7 @@ use std::str::FromStr;
 use actix_web::{HttpResponse};
 use chrono::Utc;
 use rust_decimal::Decimal;
-use rust_decimal::prelude::ToPrimitive;
+use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
 use rust_decimal_macros::dec;
 use serde_json::{json, Value};
 use crate::db_connector::get_trades_json;
@@ -79,7 +79,7 @@ pub async fn generate_msv(query_value: Value) -> HttpResponse {
         // 数据本地化处理
         let trades = parse_json_to_trades(db_response.data);
         // 指标生成
-        let indicator = generate_msv_by_trades(trades, mills_back, trt_mills_back);
+        let indicator = generate_msv_by_trades(trades, mills_back, trt_mills_back, start_time, end_time);
 
         // 返回数据
         let response = Response {
@@ -98,7 +98,7 @@ pub async fn generate_msv(query_value: Value) -> HttpResponse {
 }
 
 // 将trades转换为具体指标
-pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal, trt_mills_back: Decimal) -> Value {
+pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal, trt_mills_back: Decimal, start_time: i64, end_time: i64) -> Value {
     let mut msv_data: Vec<Vec<Decimal>> = vec![];
     let mut tr_data: Vec<Vec<Decimal>> = vec![];
 
@@ -201,11 +201,76 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal, trt_m
         }
     }
 
+    // 按时间序列填充数据
+    let mut final_msv_data: Vec<Vec<Decimal>> = vec![];
+    let mut final_tr_data: Vec<Vec<Decimal>> = vec![];
+    let mut data_index = 0;
+    let mut index_timestamp = Decimal::from_i64(start_time).unwrap();
+    let last_timestamp = Decimal::from_i64(end_time).unwrap();
+    // let step_timestamp = mills_back;
+    let step_timestamp = dec!(1000);
+    loop {
+        let mut max_msv_data = Decimal::ZERO;
+        let mut max_msv_diss_data = Decimal::ZERO;
+        let mut max_tr_data = Decimal::ZERO;
+
+        // 获取时间范围内的数据
+        loop {
+            // 下标合法性判断
+            if data_index >= msv_data.len() {
+                break;
+            }
+
+            // msv_data的指定下标数据不在时间范围内(时间范围:指的是[index_timestamp-mills_back, index_timestamp]这个范围)
+            if index_timestamp < msv_data[data_index][0] {
+                break;
+            }
+
+            // -------------- 大小判断,取值
+            let msv_d = msv_data[data_index][1];
+            let msv_diss_data = msv_data[data_index][2];
+            let tr_d = tr_data[data_index][1];
+            // msv波动数据
+            if max_msv_data.abs() < msv_d.abs() {
+                max_msv_data = msv_d;
+            }
+            // 堆叠的交易量数据
+            if max_msv_diss_data < msv_diss_data {
+                max_msv_diss_data = msv_diss_data;
+            }
+            // 成交笔数数据
+            if max_tr_data < tr_d {
+                max_tr_data = tr_d;
+            }
+
+            data_index = data_index + 1;
+        }
+
+        // 如果这两个值为0,则代表这mills_back毫秒以内是没有数据的,填充0数据,使得x轴是完整的
+        if max_msv_data == Decimal::ZERO && max_tr_data == Decimal::ZERO {
+            final_msv_data.push(vec![index_timestamp, Decimal::ZERO, Decimal::ZERO]);
+            final_tr_data.push(vec![index_timestamp, Decimal::ZERO]);
+
+        // 说明在这个时间范围内是有数据存在的
+        } else {
+            final_msv_data.push(vec![index_timestamp, max_msv_data, max_msv_diss_data]);
+            final_tr_data.push(vec![index_timestamp, max_tr_data]);
+        }
+
+        // 对时间进行步近
+        index_timestamp = index_timestamp + step_timestamp;
+        // 时间越界
+        if index_timestamp > last_timestamp {
+            break
+        }
+    }
+
+    // 结果统计
     let total_size = trades.len();
-    let result_size = msv_data.len();
+    let result_size = final_msv_data.len();
     json!({
-        "msv": msv_data,
-        "tr": tr_data,
+        "msv": final_msv_data,
+        "tr": final_tr_data,
         "total_size": total_size,
         "result_size": result_size,
     })