|
|
@@ -76,7 +76,7 @@ pub fn calc_gate_ticker_amplitude(tickers: Vec<Ticker>, limit_range: Decimal) ->
|
|
|
info!("精确幅度计算执行中……");
|
|
|
for (index, ticker) in tickers.iter().enumerate() {
|
|
|
// 该元素向前遍历range毫秒
|
|
|
- let mut prev_index = if index == 0 {
|
|
|
+ let mut range_index = if index == 0 {
|
|
|
0
|
|
|
} else {
|
|
|
index
|
|
|
@@ -88,26 +88,26 @@ pub fn calc_gate_ticker_amplitude(tickers: Vec<Ticker>, limit_range: Decimal) ->
|
|
|
|
|
|
loop {
|
|
|
// 第0个就不搞
|
|
|
- if prev_index == 0 {
|
|
|
+ if range_index == 0 {
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- let prev_ticker = tickers.get(prev_index).unwrap();
|
|
|
- let range_time = ticker.create_time - prev_ticker.create_time;
|
|
|
+ let range_ticker = tickers.get(range_index).unwrap();
|
|
|
+ let range_time = ticker.create_time - range_ticker.create_time;
|
|
|
// 判断该ticker是否是range ms以外
|
|
|
if range_time > limit_range {
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
// 判断最大值、最小值
|
|
|
- if prev_ticker.price > max_price {
|
|
|
- max_price = prev_ticker.price;
|
|
|
+ if range_ticker.price > max_price {
|
|
|
+ max_price = range_ticker.price;
|
|
|
}
|
|
|
- if prev_ticker.price < min_price {
|
|
|
- min_price = prev_ticker.price;
|
|
|
+ if range_ticker.price < min_price {
|
|
|
+ min_price = range_ticker.price;
|
|
|
}
|
|
|
|
|
|
- prev_index -= 1;
|
|
|
+ range_index -= 1;
|
|
|
}
|
|
|
|
|
|
// 逻辑计算层
|
|
|
@@ -117,24 +117,35 @@ pub fn calc_gate_ticker_amplitude(tickers: Vec<Ticker>, limit_range: Decimal) ->
|
|
|
// 不是初始值,以及不是0波动
|
|
|
if index != 0 && (max_price != last_price || min_price != last_price) {
|
|
|
let mut up_rate = (last_price - min_price) / min_price;
|
|
|
- let mut dn_rate = (max_price - last_price) / max_price;
|
|
|
+ let mut dn_rate = (last_price - max_price) / max_price;
|
|
|
|
|
|
up_rate.rescale(4);
|
|
|
dn_rate.rescale(4);
|
|
|
|
|
|
// 去除小数位之后,可以忽略一些太小的波动,减少图表生成压力
|
|
|
- if up_rate > Decimal::ZERO || dn_rate > Decimal::ZERO {
|
|
|
- // info!("up={}, dn={}, ra={}", up_rate, dn_rate, max(up_rate, dn_rate));
|
|
|
- let insert_value = if amplitude_map.contains_key(&ticker.create_time) {
|
|
|
- let origin_rate = amplitude_map.get(&ticker.create_time).unwrap();
|
|
|
+ if up_rate.eq(&Decimal::ZERO) || dn_rate.eq(&Decimal::ZERO) {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ // info!("up={}, dn={}, ra={}", up_rate, dn_rate, max(up_rate, dn_rate));
|
|
|
+ // 如果已经生成了一个波动,则也要和已生成的波动进行比较
|
|
|
+ let insert_value = if amplitude_map.contains_key(&ticker.create_time) {
|
|
|
+ let origin_rate = amplitude_map.get(&ticker.create_time).unwrap();
|
|
|
|
|
|
- max(*origin_rate, max(up_rate, dn_rate))
|
|
|
+ if up_rate > dn_rate.abs() {
|
|
|
+ max(*origin_rate, up_rate)
|
|
|
} else {
|
|
|
- max(up_rate, dn_rate)
|
|
|
- };
|
|
|
+ max(*origin_rate, dn_rate)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if up_rate > dn_rate.abs() {
|
|
|
+ up_rate
|
|
|
+ } else {
|
|
|
+ dn_rate
|
|
|
+ }
|
|
|
+ };
|
|
|
|
|
|
- amplitude_map.insert(ticker.create_time, insert_value);
|
|
|
- }
|
|
|
+ amplitude_map.insert(ticker.create_time, insert_value);
|
|
|
}
|
|
|
}
|
|
|
|