|
|
@@ -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,
|
|
|
})
|