|
|
@@ -54,6 +54,23 @@ pub async fn generate_msv(query_value: Value) -> HttpResponse {
|
|
|
return response
|
|
|
}
|
|
|
};
|
|
|
+ let trt = match parse_str_to_decimal(query_value.clone(), "trt") {
|
|
|
+ Ok(t) => {
|
|
|
+ t.to_i32().unwrap()
|
|
|
+ }
|
|
|
+ Err(response) => {
|
|
|
+ return response
|
|
|
+ }
|
|
|
+ };
|
|
|
+ let trt_minutes_back = match parse_str_to_decimal(query_value.clone(), "trt_minutes_back") {
|
|
|
+ Ok(t) => {
|
|
|
+ t
|
|
|
+ }
|
|
|
+ Err(response) => {
|
|
|
+ return response
|
|
|
+ }
|
|
|
+ };
|
|
|
+ let trt_mills_back = trt_minutes_back * dec!(1000) * dec!(60);
|
|
|
|
|
|
// 链接数据服务器查询数据
|
|
|
let end_time = Utc::now().timestamp_millis();
|
|
|
@@ -70,7 +87,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);
|
|
|
+ let indicator = generate_msv_by_trades(trades, mills_back, trt, trt_mills_back);
|
|
|
|
|
|
// 返回数据
|
|
|
let response = Response {
|
|
|
@@ -89,8 +106,9 @@ 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 result_data: Vec<Vec<Decimal>> = vec![];
|
|
|
+pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal, trt: i32, trt_mills_back: Decimal) -> Value {
|
|
|
+ let mut msv_data: Vec<Vec<Decimal>> = vec![];
|
|
|
+ let mut tr_data: Vec<Vec<Decimal>> = vec![];
|
|
|
|
|
|
const GAMMA: Decimal = dec!(0.5);
|
|
|
|
|
|
@@ -142,8 +160,8 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
|
|
|
}
|
|
|
|
|
|
// 去重,以及保留最大的波动率
|
|
|
- if result_data.len() > 0 {
|
|
|
- let last = result_data[result_data.len() - 1].clone();
|
|
|
+ if msv_data.len() > 0 {
|
|
|
+ let last = msv_data[msv_data.len() - 1].clone();
|
|
|
let last_time = last[0];
|
|
|
let last_rate = last[1];
|
|
|
|
|
|
@@ -151,22 +169,51 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
|
|
|
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]);
|
|
|
+ msv_data.remove(msv_data.len() - 1);
|
|
|
+ msv_data.push(vec![trade.time, rate, dissociation]);
|
|
|
}
|
|
|
} else {
|
|
|
- result_data.push(vec![trade.time, rate, dissociation]);
|
|
|
+ msv_data.push(vec![trade.time, rate, dissociation]);
|
|
|
}
|
|
|
} else {
|
|
|
- result_data.push(vec![trade.time, rate, dissociation]);
|
|
|
+ msv_data.push(vec![trade.time, rate, dissociation]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成速率曲线
|
|
|
+ // 计算区间的预定价格
|
|
|
+ let mut trades_count = 0;
|
|
|
+ let mut high_rate = Decimal::NEGATIVE_ONE;
|
|
|
+ let mut trt_range_index = index;
|
|
|
+ loop {
|
|
|
+ // 第0个就不用计算
|
|
|
+ if trt_range_index == 0 {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ let flag_trade = trades.get(trt_range_index).unwrap();
|
|
|
+ let trt_range_time = trade.time - flag_trade.time;
|
|
|
+ // 判断回溯时间
|
|
|
+ if trt_range_time > trt_mills_back {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否满足高速率条件
|
|
|
+ trades_count += 1;
|
|
|
+ if trades_count >= trt {
|
|
|
+ high_rate = Decimal::ONE;
|
|
|
+ }
|
|
|
+
|
|
|
+ trt_range_index -= 1;
|
|
|
}
|
|
|
+ tr_data.push(vec![trade.time, high_rate]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
let total_size = trades.len();
|
|
|
- let result_size = result_data.len();
|
|
|
+ let result_size = msv_data.len();
|
|
|
json!({
|
|
|
- "msv": result_data,
|
|
|
+ "msv": msv_data,
|
|
|
+ "tr": tr_data,
|
|
|
"total_size": total_size,
|
|
|
"result_size": result_size,
|
|
|
})
|