gepangpang 1 年之前
父节点
当前提交
7dc422caa1
共有 6 个文件被更改,包括 240 次插入13 次删除
  1. 6 4
      src/export_balance.rs
  2. 4 5
      src/export_template/template_balance.rs
  3. 1 0
      src/main.rs
  4. 214 0
      src/new_export_balance.rs
  5. 1 1
      src/utils/mod.rs
  6. 14 3
      src/utils/utils.rs

+ 6 - 4
src/export_balance.rs

@@ -58,8 +58,8 @@ pub async fn export_balance(config_info: BalanceConfigInfo) {
 
                                 let balance = item["balance"].as_str().unwrap();
                                 let type_str = match item["type"].as_str().unwrap() {
-                                    "dnw" => { "转入转出" }
-                                    "pnl" => { "减仓盈亏" }
+                                    "dnw" => { "transfer" }
+                                    "pnl" => { "profit" }
                                     "fee" => {
                                         "交易手续费";
                                         continue;
@@ -263,12 +263,13 @@ pub fn statistic_balance(balance_info: Vec<Vec<String>>, count_start_time: i64,
     }
     let start_time = NaiveDateTime::from_timestamp_millis((count_start_time + 8 * 3600) * 1000).unwrap().format("%d日%H点").to_string();
     let end_time = NaiveDateTime::from_timestamp_millis((end_start_time + 8 * 3600) * 1000).unwrap().format("%d日%H点").to_string();
-    let all_income = config.start_earnings + total_income.to_f64().unwrap();
-    format!("总收益约为:{}%<br/>{}到{},总收益约为{}%,最大回撤约为{}%,其中单个账号最大回撤约为{}%。", all_income, start_time, end_time, total_income, max_total_withdrawal, max_withdrawal)
+    format!("{}到{},总收益约为{}%,最大回撤约为{}%,其中单个账号最大回撤约为{}%。", start_time, end_time, total_income, max_total_withdrawal, max_withdrawal)
 }
 
 pub fn supply_balance(source_balance_info: BTreeMap<String, Vec<Vec<String>>>, time_slicer: Vec<i64>) -> Vec<Vec<String>> {
     let mut balance_info_list: Vec<Vec<String>> = vec![];
+    println!("{:?}", source_balance_info);
+
     for time in time_slicer.clone() {
         // 根据时间片去拿数据 ,如果有添加没有,手动添加
         let mut total_price = Decimal::ZERO;
@@ -301,6 +302,7 @@ pub fn supply_balance(source_balance_info: BTreeMap<String, Vec<Vec<String>>>, t
                     let balance_info_filter: Vec<Vec<String>> = balance_info.iter().filter(|item| {
                         item[0].parse::<i64>().unwrap() < time
                     }).cloned().collect();
+
                     let mut last_balance_info = if balance_info_filter.len() == 0 {
                         balance_info[0].clone()
                     } else {

+ 4 - 5
src/export_template/template_balance.rs

@@ -41,11 +41,10 @@ pub fn export_html(config: BalanceConfigInfo, acc_name_all: &Vec<String>, x_time
         for data in data_list.clone() {
             if data[0].clone().as_str() == key {
                 let pr = data[4].clone().parse::<f64>().unwrap();
-                if capital_info[key] == 0.0 { capital_info.insert(key.parse().unwrap(), pr); }
-                let earnings = Decimal::from_f64((pr - capital_info[key]) / capital_info[key] * 100.0).unwrap();
-                let show_earnings = earnings.to_f64().unwrap() + config.start_earnings;
-                pr_data.push(show_earnings);
-                // pr_data.push(pr);
+                pr_data.push(pr);
+                // if capital_info[key] == 0.0 { capital_info.insert(key.parse().unwrap(), pr); }
+                // let earnings = (pr - capital_info[key]) / capital_info[key] * 100.0;
+                // pr_data.push(earnings);
             }
         }
         map.insert(key.to_string(), pr_data);

+ 1 - 0
src/main.rs

@@ -14,6 +14,7 @@ pub mod http;
 pub mod struct_standard;
 pub mod export_template;
 pub mod export_balance;
+pub mod new_export_balance;
 pub mod export_ticker;
 pub mod export_analyze;
 

+ 214 - 0
src/new_export_balance.rs

@@ -0,0 +1,214 @@
+use std::collections::BTreeMap;
+use std::fs::File;
+use std::io::BufReader;
+use std::str::FromStr;
+use chrono::NaiveDateTime;
+use rust_decimal::Decimal;
+use tracing::{error, info};
+use crate::swap_bybit::bybit_swap_rest_utils::BybitSwapRest;
+use crate::swap_gate::gate_swap_rest_utils::GateSwapRest;
+use crate::utils::utils;
+use crate::utils::utils::BalanceConfigInfo;
+
+pub async fn export_balance(config_info: BalanceConfigInfo) {
+    let config_info_clone = config_info.clone();
+    let start_time = NaiveDateTime::parse_from_str(&config_info.range_time[0].clone(), "%Y-%m-%d %H:%M:%S").unwrap().timestamp() - 8 * 3600;
+    let end_time = NaiveDateTime::parse_from_str(&config_info.range_time[1].clone(), "%Y-%m-%d %H:%M:%S").unwrap().timestamp() - 8 * 3600;
+    let count_start_time = NaiveDateTime::parse_from_str(&config_info.count_range_time[0].clone(), "%Y-%m-%d %H:%M:%S").unwrap().timestamp() - 8 * 3600;
+    let count_end_time = NaiveDateTime::parse_from_str(&config_info.count_range_time[1].clone(), "%Y-%m-%d %H:%M:%S").unwrap().timestamp() - 8 * 3600;
+
+    //获取不同账号的数据
+    let mut all_account_balance_info: BTreeMap<String, Vec<Vec<String>>> = BTreeMap::new();
+    let mut account_name_list: Vec<String> = vec![];
+    if config_info_clone.account_list.len() == 0 {
+        info!("没有账号信息");
+        return;
+    }
+
+    let mut data: serde_json::Value = utils::get_json_file("./config_history_balance.json");
+
+    for exchange in config_info.exchanges.clone() {
+        let exchange_up = exchange.to_uppercase();
+        match exchange_up.as_str() {
+            "GATE" => {
+                for account in config_info_clone.account_list.clone() {
+                    let mut account_info: BTreeMap<String, String> = BTreeMap::new();
+                    account_info.insert("account_name".to_string(), account[0].clone());
+                    account_info.insert("access_key".to_string(), account[1].clone());
+                    account_info.insert("secret_key".to_string(), account[2].clone());
+
+                    let mut gate_exc = GateSwapRest::new(false, account_info.clone());
+                    let data = gate_exc.account_book("usdt".to_string()).await;
+                    // info!("请求完成{:?}",data.clone());
+                    if data.code.as_str() == "200" {
+                        let account_name = account_info.get("account_name").unwrap();
+                        account_name_list.push(account_name.clone());
+
+                        //账号
+                        let json_value: serde_json::Value = serde_json::from_str(&data.data).unwrap();
+                        if let serde_json::Value::Array(array) = json_value {
+                            let mut name_data_all: Vec<Vec<String>> = vec![];
+                            let mut times = 0;
+
+                            for item in array {
+                                // info!("数据{:?}",item.clone().to_string());
+
+                                let time = item["time"].as_i64().unwrap();//秒级
+                                if time == times { continue; }
+                                times = time;
+
+                                let change = item["change"].as_str().unwrap();
+
+                                let balance = item["balance"].as_str().unwrap();
+                                let type_str = match item["type"].as_str().unwrap() {
+                                    "dnw" => { "transfer" }
+                                    "pnl" => { "profit" }
+                                    "fee" => {
+                                        "交易手续费";
+                                        continue;
+                                    }
+                                    "refr" => {
+                                        "推荐人返佣";
+                                        continue;
+                                    }
+                                    "fund" => {
+                                        "资金费用";
+                                        continue;
+                                    }
+                                    "point_dnw" => {
+                                        "点卡转入转出";
+                                        continue;
+                                    }
+                                    "point_fee" => {
+                                        "点卡交易手续费";
+                                        continue;
+                                    }
+                                    "point_refr" => {
+                                        "点卡推荐人返佣";
+                                        continue;
+                                    }
+                                    _ => {
+                                        "未知-变更类型";
+                                        continue;
+                                    }
+                                };
+
+
+                                let text = item["text"].as_str().unwrap();
+                                let contract = item["contract"].as_str().unwrap();
+                                let trade_id = item["trade_id"].as_str().unwrap();
+
+                                let mut name_data_array: Vec<String> = vec![];
+                                name_data_array.push(time.to_string());
+                                name_data_array.push(trade_id.to_string());
+                                name_data_array.push(change.to_string());
+                                name_data_array.push(balance.to_string());
+                                name_data_array.push(type_str.to_string());
+                                name_data_array.push(contract.to_string());
+                                name_data_array.push(text.to_string());
+
+                                name_data_all.push(name_data_array.clone());
+                            }
+                            all_account_balance_info.insert(account_name.clone(), name_data_all.clone());
+                        } else {
+                            info!("不是数组 检查数据");
+                        }
+                    }
+                    // break;
+                };
+            }
+            _ => {
+                error!("交易所输入错误!");
+                panic!("交易所输入错误!")
+            }
+        };
+    }
+
+    // 根据账户变动填充
+    let mut count_time_list = vec![];
+    for (_account_name, balance_info) in all_account_balance_info.clone() {
+        for value in balance_info {
+            let time = value[0].clone().parse::<i64>().unwrap();
+            if !count_time_list.contains(&time) && time > count_start_time && time < count_end_time {
+                count_time_list.push(time)
+            }
+        }
+    };
+    count_time_list.sort_by(|a, b| a.cmp(&b));
+    count_time_list.insert(0, count_start_time);
+    count_time_list.push(count_end_time);
+    let count_balance_info = supply_balance(all_account_balance_info.clone(), count_time_list.clone());
+    let mut new_data: BTreeMap<String, Vec<Vec<String>>> = BTreeMap::new();
+
+    for entry in count_balance_info {
+        let key = entry[0].clone();
+        let value = new_data.entry(key).or_insert(Vec::new());
+        value.push(entry.clone());
+    }
+    println!("--------------------");
+    println!("{:?}", new_data);
+    // let statistic_result = statistic_balance(count_balance_info.clone(), count_start_time.clone(), count_end_time.clone(), config_info.clone());
+
+    data["balance_list"] = serde_json::to_string(&all_account_balance_info).unwrap().parse().unwrap();
+    utils::set_json_file("./config_history_balance.json", serde_json::to_string(&data).unwrap());
+    // 打印解析后的数据
+    // println!("{:?}", data);
+    if data["last_time"] == 0 {}
+}
+
+pub fn supply_balance(source_balance_info: BTreeMap<String, Vec<Vec<String>>>, time_slicer: Vec<i64>) -> Vec<Vec<String>> {
+    let mut balance_info_list: Vec<Vec<String>> = vec![];
+    for time in time_slicer.clone() {
+        // 根据时间片去拿数据 ,如果有添加没有,手动添加
+        let mut total_price = Decimal::ZERO;
+        for (key, value) in source_balance_info.clone() {
+            let mut balance_info = value.clone();
+            balance_info.sort_by(|a, b| a[0].cmp(&b[0]));
+
+            let mut new_info: Option<Vec<String>> = None;
+            for mut info in balance_info.clone() {
+                let info_time = info[0].parse::<i64>().unwrap();
+                if info_time == time {
+                    match new_info {
+                        None => {
+                            info.insert(0, key.clone());
+                            new_info = Option::from(info);//记录当前实际
+                        }
+                        Some(ref value) => {
+                            if value[1] < info[1] {
+                                info.insert(0, key.clone());
+                                new_info = Option::from(info);//记录当前实际
+                            }
+                        }
+                    }
+                    break;
+                }
+            }
+
+            match new_info {
+                None => {
+                    let balance_info_filter: Vec<Vec<String>> = balance_info.iter().filter(|item| {
+                        item[0].parse::<i64>().unwrap() < time
+                    }).cloned().collect();
+
+                    let mut last_balance_info = if balance_info_filter.len() == 0 {
+                        balance_info[0].clone()
+                    } else {
+                        balance_info_filter[balance_info_filter.len() - 1].clone()
+                    };
+                    last_balance_info.insert(0, key.clone());
+                    total_price += Decimal::from_str(&last_balance_info[4]).unwrap();
+                    balance_info_list.push(last_balance_info);
+                }
+                Some(ref info) => {
+                    total_price += Decimal::from_str(&info[4]).unwrap();
+                    balance_info_list.push(info.clone());
+                }
+            }
+        }
+
+        let sum_row: Vec<String> = vec!["total_balance".to_string(), time.to_string(), "".to_string(), "0".to_string(), total_price.round_dp(2).to_string(), "".to_string(), "".to_string(), "".to_string()];
+        balance_info_list.push(sum_row.clone());
+    };
+    balance_info_list
+}

+ 1 - 1
src/utils/mod.rs

@@ -1,2 +1,2 @@
 pub mod utils;
-pub mod logs;
+pub mod logs;

+ 14 - 3
src/utils/utils.rs

@@ -1,5 +1,5 @@
 use std::fs::File;
-use std::io::Read;
+use std::io::{BufReader, Read, Write};
 use rust_decimal::Decimal;
 use serde::Deserialize;
 use toml::from_str;
@@ -68,7 +68,6 @@ pub fn get_ticker_config_info(file_path: &str) -> TickerConfigInfo {
 pub struct BalanceConfigInfo {
     pub is_export: bool,
     pub is_total: bool,
-    pub start_earnings: f64,
     pub proxy_address: String,
     pub account_list: Vec<Vec<String>>,
     pub exchanges: Vec<String>,
@@ -84,7 +83,6 @@ impl BalanceConfigInfo {
         BalanceConfigInfo {
             is_export: false,
             is_total: true,
-            start_earnings: 0.0,
             proxy_address: "".to_string(),
             account_list: vec![],
             exchanges: vec![],
@@ -179,4 +177,17 @@ pub fn parse_params_to_str(parameters: String) -> String {
     }
     // trace!("---json-转字符串拼接:{}",params_str);
     params_str.to_string()
+}
+
+pub fn get_json_file(path: &str) -> serde_json::Value {
+    let file = File::open(path).expect("Failed to open file");
+    let reader = BufReader::new(file);
+    let data: serde_json::Value = serde_json::from_reader(reader).expect("Failed to parse JSON");
+    return data;
+}
+
+pub fn set_json_file(path: &str, json: String) {
+    let mut file = File::create(path).expect("Failed to create file");
+    file.write_all(json.as_bytes()).expect("Failed to write to file");
+    println!("Data has been written to output.json");
 }