|
|
@@ -1,4 +1,3 @@
|
|
|
-use std::cmp::max;
|
|
|
use std::collections::BTreeMap;
|
|
|
use std::str::FromStr;
|
|
|
use actix_web::{HttpResponse};
|
|
|
@@ -94,8 +93,7 @@ pub async fn generate_msv(query_value: Value) -> HttpResponse {
|
|
|
pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Value {
|
|
|
let mut amplitude_map: BTreeMap<Decimal, Decimal> = BTreeMap::new();
|
|
|
|
|
|
- const MAX_INIT_VALUE: Decimal = dec!(-1);
|
|
|
- const MIN_INIT_VALUE: Decimal = dec!(1e28);
|
|
|
+ const GAMMA: Decimal = dec!(0.9);
|
|
|
|
|
|
// 每一个元素都遍历一遍
|
|
|
trades.sort_by(|a, b| Decimal::from_str(a.id.as_str()).unwrap().cmp(&Decimal::from_str(b.id.as_str()).unwrap()));
|
|
|
@@ -107,9 +105,8 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
|
|
|
index
|
|
|
};
|
|
|
|
|
|
- // 寻找区间最大值、最小值
|
|
|
- let mut max_price = MAX_INIT_VALUE;
|
|
|
- let mut min_price = MIN_INIT_VALUE;
|
|
|
+ // 计算区间的预定价格
|
|
|
+ let mut ref_price = trade.price;
|
|
|
|
|
|
loop {
|
|
|
// 第0个就不搞
|
|
|
@@ -124,13 +121,7 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- // 判断最大值、最小值
|
|
|
- if trade.size < Decimal::ZERO && flag_trade.size < Decimal::ZERO && flag_trade.price > max_price {
|
|
|
- max_price = flag_trade.price;
|
|
|
- }
|
|
|
- if trade.size > Decimal::ZERO && flag_trade.size > Decimal::ZERO && flag_trade.price < min_price {
|
|
|
- min_price = flag_trade.price;
|
|
|
- }
|
|
|
+ ref_price = ref_price * GAMMA + flag_trade.price * (Decimal::ONE - GAMMA);
|
|
|
|
|
|
range_index -= 1;
|
|
|
}
|
|
|
@@ -141,43 +132,16 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
|
|
|
|
|
|
// 不是初始值,以及不是0波动
|
|
|
if index != 0 {
|
|
|
- let mut up_rate = if min_price == MIN_INIT_VALUE {
|
|
|
- Decimal::ZERO
|
|
|
- } else {
|
|
|
- Decimal::ONE_HUNDRED * (last_price - min_price) / min_price
|
|
|
- };
|
|
|
- let mut dn_rate = if max_price == MAX_INIT_VALUE {
|
|
|
- Decimal::ZERO
|
|
|
- } else {
|
|
|
- Decimal::ONE_HUNDRED * (last_price - max_price) / max_price
|
|
|
- };
|
|
|
-
|
|
|
- up_rate.rescale(2);
|
|
|
- dn_rate.rescale(2);
|
|
|
+ let mut rate = Decimal::ONE_HUNDRED * (last_price - ref_price) / ref_price;
|
|
|
+
|
|
|
+ rate.rescale(2);
|
|
|
|
|
|
// 去除小数位之后,可以忽略一些太小的波动,减少图表生成压力
|
|
|
- if up_rate.eq(&Decimal::ZERO) && dn_rate.eq(&Decimal::ZERO) {
|
|
|
+ if rate.eq(&Decimal::ZERO) {
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
- // 如果已经生成了一个波动,则也要和已生成的波动进行比较
|
|
|
- let insert_value = if amplitude_map.contains_key(&trade.time) {
|
|
|
- let origin_rate = amplitude_map.get(&trade.time).unwrap();
|
|
|
-
|
|
|
- if up_rate > dn_rate.abs() {
|
|
|
- max(*origin_rate, up_rate)
|
|
|
- } else {
|
|
|
- max(*origin_rate, dn_rate)
|
|
|
- }
|
|
|
- } else {
|
|
|
- if up_rate > dn_rate.abs() {
|
|
|
- up_rate
|
|
|
- } else {
|
|
|
- dn_rate
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- amplitude_map.insert(trade.time, insert_value);
|
|
|
+ amplitude_map.insert(trade.time, rate);
|
|
|
}
|
|
|
}
|
|
|
|