|
@@ -3,15 +3,12 @@ use std::collections::{BTreeMap};
|
|
|
use std::fs::File;
|
|
use std::fs::File;
|
|
|
use std::io::Write;
|
|
use std::io::Write;
|
|
|
use std::str::FromStr;
|
|
use std::str::FromStr;
|
|
|
-use chrono::{NaiveDateTime, Utc};
|
|
|
|
|
|
|
+use chrono::{Utc};
|
|
|
use handlebars::Handlebars;
|
|
use handlebars::Handlebars;
|
|
|
use rust_decimal::Decimal;
|
|
use rust_decimal::Decimal;
|
|
|
-use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
|
|
|
|
|
use rust_decimal_macros::dec;
|
|
use rust_decimal_macros::dec;
|
|
|
-use serde_json::{json, Value};
|
|
|
|
|
use tracing::{info};
|
|
use tracing::{info};
|
|
|
use crate::export_ticker::get_gate_ticker_info;
|
|
use crate::export_ticker::get_gate_ticker_info;
|
|
|
-use crate::http::request::get;
|
|
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
#[derive(Debug)]
|
|
|
pub struct Ticker {
|
|
pub struct Ticker {
|
|
@@ -96,54 +93,16 @@ pub fn parse_str_to_seconds(name_html: &mut String, time_str: &str) -> i64 {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-pub async fn pull_gate_ticker(ticker_map: &mut BTreeMap<u64, Ticker>, start_at: i64, end_at: i64, time_interval: i64, symbol: String) {
|
|
|
|
|
- let mut from_time = start_at;
|
|
|
|
|
- loop {
|
|
|
|
|
- let to_time = from_time + time_interval;
|
|
|
|
|
- let time_str_start_view = NaiveDateTime::from_timestamp_millis(((from_time) + 8 * 3600) * 1000).unwrap().format("%Y-%m-%d %H:%M:%S%.3f").to_string();
|
|
|
|
|
- let time_str_end_view = NaiveDateTime::from_timestamp_millis(((to_time) + 8 * 3600) * 1000).unwrap().format("%Y-%m-%d %H:%M:%S%.3f").to_string();
|
|
|
|
|
- info!("----拉取时间:{:?}---{:?}", time_str_start_view, time_str_end_view);
|
|
|
|
|
- //查询数据按照间隔20分钟
|
|
|
|
|
- let url = "https://api.gateio.ws/api/v4/futures/usdt/trades";
|
|
|
|
|
- let params = json!({
|
|
|
|
|
- "contract": symbol,
|
|
|
|
|
- "from": from_time,
|
|
|
|
|
- "to": to_time,
|
|
|
|
|
- "limit": "1000"
|
|
|
|
|
- });
|
|
|
|
|
- let res_data = get(url, params.to_string(), None).await;
|
|
|
|
|
- if res_data.code == "200" {
|
|
|
|
|
- let res_data_str = res_data.data;
|
|
|
|
|
-
|
|
|
|
|
- let json_value: Value = serde_json::from_str(&res_data_str).unwrap();
|
|
|
|
|
- if let Some(tickers) = json_value.as_array() {
|
|
|
|
|
- info!("数据数量:{:?}", tickers.len());
|
|
|
|
|
- // 倒序插入,可以保证使用最新的ticker进行计算,最新的ticker可以代表行情的一个最新情况
|
|
|
|
|
- for ticker_json in tickers.iter().rev() {
|
|
|
|
|
- let key_f64 = ticker_json["create_time_ms"].as_f64().unwrap() * 1000.0;
|
|
|
|
|
- let key = key_f64.to_u64().unwrap();
|
|
|
|
|
-
|
|
|
|
|
- let price_str = ticker_json["price"].as_str().unwrap();
|
|
|
|
|
- let amount_i64 = ticker_json["size"].as_i64().unwrap();
|
|
|
|
|
- let ticker = Ticker {
|
|
|
|
|
- create_time: Decimal::from_u64(key).unwrap(),
|
|
|
|
|
- price: Decimal::from_str(price_str).unwrap(),
|
|
|
|
|
- amount: Decimal::from_i64(amount_i64).unwrap(),
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- // key是id,value是json
|
|
|
|
|
- ticker_map.insert(key, ticker);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- from_time = from_time + time_interval;
|
|
|
|
|
- } else {
|
|
|
|
|
- info!("数据请求错误: {:?},重试。", res_data);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if from_time > end_at {
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+pub async fn pull_gate_ticker(ticker_map: &mut BTreeMap<u64, Ticker>, start_at: i64, end_at: i64, symbol: String) {
|
|
|
|
|
+ let trades_list = get_gate_ticker_info(&symbol, &start_at.to_string(), &end_at.to_string()).await;
|
|
|
|
|
+ for trades in trades_list {
|
|
|
|
|
+ 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);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -215,21 +174,10 @@ pub fn calc_gate_ticker_amplitude(ticker_map: BTreeMap<u64, Ticker>) -> BTreeMap
|
|
|
return amplitude_map;
|
|
return amplitude_map;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-pub async fn export_gate_ticker(start_at: i64, end_at: i64, time_interval: i64, symbol: String) -> BTreeMap<Decimal, Decimal> {
|
|
|
|
|
|
|
+pub async fn export_gate_ticker(start_at: i64, end_at: i64, symbol: String) -> BTreeMap<Decimal, Decimal> {
|
|
|
let mut ticker_map: BTreeMap<u64, Ticker> = BTreeMap::new();
|
|
let mut ticker_map: BTreeMap<u64, Ticker> = BTreeMap::new();
|
|
|
-
|
|
|
|
|
- let trades_list = get_gate_ticker_info(&symbol,&start_at.to_string(),&end_at.to_string()).await;
|
|
|
|
|
- for trades in trades_list{
|
|
|
|
|
- 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数据
|
|
// 获取ticker数据
|
|
|
- // pull_gate_ticker(&mut ticker_map, start_at, end_at, time_interval, symbol).await;
|
|
|
|
|
|
|
+ pull_gate_ticker(&mut ticker_map, start_at, end_at, symbol).await;
|
|
|
let len = ticker_map.len();
|
|
let len = ticker_map.len();
|
|
|
info!("网络层执行完毕,总数据量条数:{}。", len);
|
|
info!("网络层执行完毕,总数据量条数:{}。", len);
|
|
|
|
|
|
|
@@ -241,7 +189,7 @@ pub async fn export_gate_ticker(start_at: i64, end_at: i64, time_interval: i64,
|
|
|
return amplitude_map;
|
|
return amplitude_map;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-pub async fn export_ticker(symbol: &str, exchange: &str, time_range_str: &str, time_interval: i64) {
|
|
|
|
|
|
|
+pub async fn export_ticker(symbol: &str, exchange: &str, time_range_str: &str) {
|
|
|
// 只是显示在网页上,记录选择的时间周期
|
|
// 只是显示在网页上,记录选择的时间周期
|
|
|
let mut name_html = Default::default();
|
|
let mut name_html = Default::default();
|
|
|
// 从此刻往前算时间
|
|
// 从此刻往前算时间
|
|
@@ -254,7 +202,7 @@ pub async fn export_ticker(symbol: &str, exchange: &str, time_range_str: &str, t
|
|
|
let amplitude_map;
|
|
let amplitude_map;
|
|
|
match exchange.to_uppercase().as_str() {
|
|
match exchange.to_uppercase().as_str() {
|
|
|
"GATE" => {
|
|
"GATE" => {
|
|
|
- amplitude_map = export_gate_ticker(start_at, end_at, time_interval, symbol.to_uppercase()).await;
|
|
|
|
|
|
|
+ amplitude_map = export_gate_ticker(start_at, end_at, symbol.to_uppercase()).await;
|
|
|
}
|
|
}
|
|
|
_ => {
|
|
_ => {
|
|
|
panic!("交易所输入错误!")
|
|
panic!("交易所输入错误!")
|
|
@@ -262,6 +210,7 @@ pub async fn export_ticker(symbol: &str, exchange: &str, time_range_str: &str, t
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
export_html(name_html.as_str(),
|
|
export_html(name_html.as_str(),
|
|
|
|
|
+ symbol,
|
|
|
amplitude_map.keys().cloned().collect(),
|
|
amplitude_map.keys().cloned().collect(),
|
|
|
amplitude_map.values().cloned().collect())
|
|
amplitude_map.values().cloned().collect())
|
|
|
}
|
|
}
|
|
@@ -269,15 +218,16 @@ pub async fn export_ticker(symbol: &str, exchange: &str, time_range_str: &str, t
|
|
|
#[allow(dead_code)]
|
|
#[allow(dead_code)]
|
|
|
//生成html
|
|
//生成html
|
|
|
pub fn export_html(name_html: &str,
|
|
pub fn export_html(name_html: &str,
|
|
|
|
|
+ symbol: &str,
|
|
|
x_values: Vec<Decimal>,
|
|
x_values: Vec<Decimal>,
|
|
|
y_values: Vec<Decimal>) {
|
|
y_values: Vec<Decimal>) {
|
|
|
info!("正在生成网页,请稍候……");
|
|
info!("正在生成网页,请稍候……");
|
|
|
- let path = "./新版无敌大数据ticker.html".to_string();
|
|
|
|
|
|
|
+ let path = format!("./{}新版无敌大数据ticker.html", symbol);
|
|
|
// 创建 Handlebars 实例
|
|
// 创建 Handlebars 实例
|
|
|
let mut handlebars = Handlebars::new();
|
|
let mut handlebars = Handlebars::new();
|
|
|
|
|
|
|
|
let data = serde_json::json!({
|
|
let data = serde_json::json!({
|
|
|
- "chart_title": format!("{}新版无敌大数据Ticker", name_html),
|
|
|
|
|
|
|
+ "chart_title": format!("{}的{}新版无敌大数据Ticker", name_html, symbol),
|
|
|
"x_values": x_values,
|
|
"x_values": x_values,
|
|
|
"y_values": y_values,
|
|
"y_values": y_values,
|
|
|
});
|
|
});
|