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