|
|
@@ -94,6 +94,9 @@ 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);
|
|
|
+
|
|
|
// 每一个元素都遍历一遍
|
|
|
trades.sort_by(|a, b| Decimal::from_str(a.id.as_str()).unwrap().cmp(&Decimal::from_str(b.id.as_str()).unwrap()));
|
|
|
for (index, trade) in trades.iter().enumerate() {
|
|
|
@@ -105,8 +108,8 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
|
|
|
};
|
|
|
|
|
|
// 寻找区间最大值、最小值
|
|
|
- let mut max_price = dec!(-1);
|
|
|
- let mut min_price = dec!(1e28);
|
|
|
+ let mut max_price = MAX_INIT_VALUE;
|
|
|
+ let mut min_price = MIN_INIT_VALUE;
|
|
|
|
|
|
loop {
|
|
|
// 第0个就不搞
|
|
|
@@ -122,10 +125,10 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
|
|
|
}
|
|
|
|
|
|
// 判断最大值、最小值
|
|
|
- if flag_trade.price > max_price {
|
|
|
+ if flag_trade.price > max_price && flag_trade.size < Decimal::ZERO {
|
|
|
max_price = flag_trade.price;
|
|
|
}
|
|
|
- if flag_trade.price < min_price {
|
|
|
+ if flag_trade.price < min_price && flag_trade.size > Decimal::ZERO {
|
|
|
min_price = flag_trade.price;
|
|
|
}
|
|
|
|
|
|
@@ -138,8 +141,16 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
|
|
|
|
|
|
// 不是初始值,以及不是0波动
|
|
|
if index != 0 {
|
|
|
- let mut up_rate = Decimal::ONE_HUNDRED * (last_price - min_price) / min_price;
|
|
|
- let mut dn_rate = Decimal::ONE_HUNDRED * (last_price - max_price) / max_price;
|
|
|
+ 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);
|