|
|
@@ -1,4 +1,5 @@
|
|
|
-use std::cmp::{max};
|
|
|
+use crate::export_ticker::{get_binance_ticker_info, get_bitget_ticker_info, get_gate_ticker_info};
|
|
|
+use std::cmp::max;
|
|
|
use std::collections::{BTreeMap};
|
|
|
use std::str::FromStr;
|
|
|
use chrono::{Utc};
|
|
|
@@ -6,9 +7,8 @@ use rust_decimal::Decimal;
|
|
|
use rust_decimal_macros::dec;
|
|
|
use tracing::{info};
|
|
|
use crate::export_template;
|
|
|
-use crate::export_ticker::{get_binance_ticker_info, get_gate_ticker_info, get_bitget_ticker_info};
|
|
|
|
|
|
-#[derive(Debug)]
|
|
|
+#[derive(Debug, Clone, Copy)]
|
|
|
pub struct Ticker {
|
|
|
pub create_time: Decimal,
|
|
|
pub price: Decimal,
|
|
|
@@ -69,15 +69,12 @@ pub fn parse_range_interval(range_interval: &str) -> RangeInterval {
|
|
|
}
|
|
|
|
|
|
// 计算最近range毫秒的的波动
|
|
|
-pub fn calc_gate_ticker_amplitude(ticker_map: BTreeMap<u64, Ticker>, limit_range: Decimal) -> BTreeMap<Decimal, Decimal> {
|
|
|
+pub fn calc_gate_ticker_amplitude(tickers: Vec<Ticker>, limit_range: Decimal) -> BTreeMap<Decimal, Decimal> {
|
|
|
let mut amplitude_map: BTreeMap<Decimal, Decimal> = BTreeMap::new();
|
|
|
|
|
|
// 每一个元素都遍历一遍
|
|
|
info!("精确幅度计算执行中……");
|
|
|
- let keys: Vec<u64> = ticker_map.keys().cloned().collect();
|
|
|
- for (index, create_time) in keys.iter().enumerate() {
|
|
|
- let ticker = ticker_map.get(&create_time).unwrap();
|
|
|
-
|
|
|
+ for (index, ticker) in tickers.iter().enumerate() {
|
|
|
// 该元素向前遍历range毫秒
|
|
|
let mut prev_index = if index == 0 {
|
|
|
0
|
|
|
@@ -95,7 +92,7 @@ pub fn calc_gate_ticker_amplitude(ticker_map: BTreeMap<u64, Ticker>, limit_range
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- let prev_ticker = ticker_map.get(&keys[prev_index]).unwrap();
|
|
|
+ let prev_ticker = tickers.get(prev_index).unwrap();
|
|
|
let range_time = ticker.create_time - prev_ticker.create_time;
|
|
|
// 判断该ticker是否是range ms以外
|
|
|
if range_time > limit_range {
|
|
|
@@ -128,7 +125,15 @@ pub fn calc_gate_ticker_amplitude(ticker_map: BTreeMap<u64, Ticker>, limit_range
|
|
|
// 去除小数位之后,可以忽略一些太小的波动,减少图表生成压力
|
|
|
if up_rate > Decimal::ZERO || dn_rate > Decimal::ZERO {
|
|
|
// info!("up={}, dn={}, ra={}", up_rate, dn_rate, max(up_rate, dn_rate));
|
|
|
- amplitude_map.insert(ticker.create_time, 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))
|
|
|
+ } else {
|
|
|
+ max(up_rate, dn_rate)
|
|
|
+ };
|
|
|
+
|
|
|
+ amplitude_map.insert(ticker.create_time, insert_value);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -136,8 +141,7 @@ pub fn calc_gate_ticker_amplitude(ticker_map: BTreeMap<u64, Ticker>, limit_range
|
|
|
return amplitude_map;
|
|
|
}
|
|
|
|
|
|
-pub async fn get_ticker_info(exchange: &str, start_at: i64, end_at: i64, symbol: &str) -> BTreeMap<u64, Ticker> {
|
|
|
- let mut ticker_map: BTreeMap<u64, Ticker> = BTreeMap::new();
|
|
|
+pub async fn get_ticker_info(exchange: &str, start_at: i64, end_at: i64, symbol: &str) -> Vec<Ticker> {
|
|
|
let trades_list;
|
|
|
match exchange {
|
|
|
"BINANCE" => {
|
|
|
@@ -153,23 +157,24 @@ pub async fn get_ticker_info(exchange: &str, start_at: i64, end_at: i64, symbol:
|
|
|
panic!("不支持该交易所");
|
|
|
}
|
|
|
}
|
|
|
+ let mut ticker_list: Vec<Ticker> = vec![];
|
|
|
for trades in trades_list {
|
|
|
- let key = trades.create_time.parse::<u64>().unwrap();
|
|
|
+ // let key = trades.create_time.parse::<u64>().unwrap();
|
|
|
let ticker = Ticker {
|
|
|
create_time: Decimal::from_str(&trades.create_time).unwrap(),
|
|
|
price: Decimal::from_str(&trades.price).unwrap(),
|
|
|
amount: Decimal::from_str(&trades.size).unwrap(),
|
|
|
};
|
|
|
- ticker_map.insert(key, ticker);
|
|
|
+ ticker_list.push(ticker.clone());
|
|
|
}
|
|
|
- let len = ticker_map.len();
|
|
|
- info!("网络层执行完毕,总数据量条数:{}。", len);
|
|
|
- return ticker_map;
|
|
|
+
|
|
|
+ info!("网络层执行完毕,数据条数: {}。", ticker_list.len());
|
|
|
+ return ticker_list;
|
|
|
}
|
|
|
|
|
|
-pub fn get_amplitude(ticker_map: BTreeMap<u64, Ticker>, range_limit: Decimal) -> BTreeMap<Decimal, Decimal> {
|
|
|
+pub fn get_amplitude(trades: Vec<Ticker>, range_limit: Decimal) -> BTreeMap<Decimal, Decimal> {
|
|
|
// 逻辑层执行
|
|
|
- let amplitude_map = calc_gate_ticker_amplitude(ticker_map, range_limit);
|
|
|
+ let amplitude_map = calc_gate_ticker_amplitude(trades, range_limit);
|
|
|
let amplitude_map_len = amplitude_map.len();
|
|
|
info!("逻辑层执行完毕,剩余有效波动条数:{}。", amplitude_map_len);
|
|
|
|